承前
- mplayer ( smplayer ) は YouTube のページ URL を理解して動画を再生してくれるが、複数の動画を連続再生するにはあらかじめローカルに playlist file を作っておく必要がある。
- ブラウザで Youtube のプレイリストを再生するのはなんとなくうれしくない。
- youtube-dl は Youtube のプレイリストをすべてローカルにダウンロードすることができるが、ダウンロードせずにリストを作るような手段が -s オプションくらいしか見つからず、これは動画そのものの一時的な URL を並べる。削除されない限り恒久的な URL を並べることはコマンドラインからではできなさそうだ。
- youtube-dl コマンドの実体は python スクリプトであり、コマンドは python のライブラリを呼び出している。
では youtube-dl のライブラリをコマンドラインのpython から呼び出して、しばらくつかえるようなプレイリストのローカルファイルをつくろう、というハナシ。
環境
今回、作りながら動作チェックしたのは Windows 10 上で、gitbash をシェルとし、Conda でインストールした Python , その pip からインストールした youtube-dl という構成。
本体
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs
import sys
import youtube_dl
class yt_Listup:
""" Wrapper for youtube-dl library
* read youtube.com playlist
* output by m3u format
"""
def __init__(self, url):
self.url_list = []
ydl = youtube_dl.YoutubeDL({'outtmpl': u'%(id)s%(ext)s', \
'logtostderr': True})
with ydl:
result = ydl.extract_info(
url ,
download=False, # We just want to extract the info
)
if 'entries' in result:
self.url_list.extend(result['entries'])
else:
self.url_list.append(result)
def m3u(self, fileHandle = codecs.getwriter('utf_8')(sys.stdout)):
for item in self.url_list:
fileHandle.write( "# " + item['title'] + "\n" + \
item['webpage_url'] + "\n" )
return
if __name__ == "__main__" :
l = yt_Listup(sys.argv[1]).m3u()
とりあえず出力先を stdout にしてリダイレクトで保存する運用中 ……なんて但し書きを必要とするひとはコード断片なんか読まないような気がするので蛇足
なお
python に真面目なひとには叱られそうなことに、PEP8準拠するための整形もしていない。
開発に真面目なひとには叱られそうなことに、テストコードも内包していない。
この機能のまま拡張する気がないのならば、append() とか extend() とか使わず = で代入のほうがシンプルで正しい。
わたしの好みとしては、コマンドラインで使うのならば Usage() 関数とかつけたいし、このコードはリネームして最終的にはライブラリ・パスに置きたい。
再生画面はともかく smplayer のプレイリスト画面に URL がそのまま表示されるのが気に入らないところからはじまり、ここに挙げたコードからそこそこ手を加えた。多機能になればなるほど長くなる。
そのうえで、youtube の playlist をローカルファイルに保存するという「いかにも誰もが使いそうな」機能が検索してもほぼ見当たらなかったので。メインの部分がもっともわかりやすい、このコードだけ公開しておくのが Qiita というサイトのノリに近くて読みやすいかな、と思いました。
Thanks
- How to use youtube-dl from a python program
- site-packages/youtube-dl/extroctor/youtube.py playlist で検索したり、テストコード用のURLみたり
- site-packages/youtube-dl/youtubeDL.py 135行目あたり、コマンドオプション