youtube-dl が YouTube の視聴ページだけではなくプレイリストにも対応しているので mpv ではプレイリストの URL を渡すだけで連続視聴ができていた。
しかし、Raspberry Pi Zero では MMAL を使ったハードウェアデコーディングがまともに動かないことがわかり、omxplayer での再生が必須になった。
omxplayer で YouTube の動画をダイレクトに再生する
youtube-dl で動画をローカルに落としてしまえば omxplayer でも簡単に再生できるのだが、貧弱な microSD にそこまで負荷をかけたくない。
youtube-dl -g {URL}
で取得した URL を omxplayer に渡せば omxplayer でも YouTube の動画をそのまま再生できるのだが、これには YouTube の仕様の問題がある。
例えば以下のようにコマンド置換で動画の URL を直接 omxplayer に渡したとする。
$ omxplayer `youtube-dl -g {URL}`
この場合、動画が 1920x1080 以上の解像度を持っていると、ビデオとオーディオの URL が分割されてしまうため、恐らくはビデオしか再生されない。
YouTube の仕様上、ビデオとオーディオが一体になっているのは 1280x720 までのようなので omxplayer にダイレクトに渡すなら以下のようにするのが正しい。-f best
でフォーマットを「ビデオ + オーディオの最高品質」にすれば URL はひとつになる。ただし、解像度は 1280x720 まで。
$ omxplayer `youtube-dl -f best -g {URL}`
プレイリストの再生
さて、omxplayer に YouTube の URL を渡して直接再生出来るようになったが、omxplayer は YouTube のプレイリストの URL は受け取らない。これでは1曲ごとに URL を叩くことになるので非常に面倒。
というわけで YouTube のプレイリストに含まれる動画の URL を根こそぎ拾ってくることにした。プレイリストのサンプルは Flying Dog のページから借りる。
プレイリストが長いと取得に時間がかかるので、ここでは --playlist-end=10
として10個まで拾ってくることにする。
$ youtube-dl --playlist-end=10 -f best -g 'https://www.youtube.com/user/flyingDOGch/videos'
jq
を使って JSON から取り出してもいい。ビデオとオーディオが一体になっている URL は entries
のひとつ下の url
に含まれている。
$ youtube-dl --playlist-end=10 -f best 'https://www.youtube.com/user/flyingDOGch/videos' | jq -r '.entries[].url'
あとはこの結果をループに流してしまえばいい。
$ for f in `youtube-dl --playlist-end=10 -f best -g 'https://www.youtube.com/user/flyingDOGch/videos'`; do omxplayer "$f"; done
ランダム再生がいいのなら | sort -R
する。
$ for f in `youtube-dl --playlist-end=10 -f best -g 'https://www.youtube.com/user/flyingDOGch/videos' | sort -R`; do omxplayer "$f"; done
無限ループにするなら while
の中に入れる。
$ while :; do for f in `youtube-dl --playlist-end=10 -f best -g 'https://www.youtube.com/user/flyingDOGch/videos' | sort -R`; do omxplayer "$f"; done; done
毎回プレイリストの URL を拾ってくるのも時間がかかるので普通ならテキストファイルに落として再生かな。
$ for f in `<youtube.m3u`; do omxplayer "$f"; done
プレイリストを毎回ダウンロードするのも一応メリットがあり、ブラウザで YouTube のプレイリストの編集をしたときに常に最新の物が拾ってこれる。
トレンドチャンネルや映画予告チャンネルなんかを取得するようにしておけば常に最新の情報が手に入る…かも。
プレイリストの取得は時間がかかるので cron で更新するようにしておくようにするかな。