LoginSignup
2
3

More than 1 year has passed since last update.

Youtubeのもろもろをダウンロードできるyoutube-dlについて色々調べて試してみた。

Last updated at Posted at 2021-06-20

前回、前々回の続きです。
卒業制作で「気がついたらYoutubeを観て1日が終わってた撲滅ツール!動画内の音声を検索!」というのを作るので「youtube-dl」というツールを調べていきます。

本記事のサマリ

「youtube-dl」のコマンドについて色々試した。
  「外部ファイルに記載した複数動画」の字幕のダウンロードは成功した。
  「サムネイル画像」のダウンロードに成功した。
   Youtubeの動画IDにハイフンが含まれるとダウンロードできないことが判明した。
   (6/21追記 コメント欄でやり方を教えていただいた。ありがとうございます!)
「youtube-dl」はURLがわからないと字幕のダウンロードができないと思われるので代替案を探す。
  「ytsearch」は更新が6年前でうまく動かなったのであきらめる。
  Google公式のYoutubeAPIでいこうと思う。

youtube-dlについて広く調べる

プレイリストもそのままいけそうだ。
また、「ソフトウエア管理ツール・パッケージでインストールすると古い版が入るので手動でインストールする」という知見も得た。

プレイリストをtxtに落として1行づつ処理するためのシェルスクリプトの例。

「-i」はダウンロードエラーを無視する。
動画IDで指定できるし、スペースで区切ることで複数一括もできる。

動画IDを取得してみる。


C:\bin>youtube-dl --get-title --get-id  "https://www.youtube.com/watch?v=mppA6nx_rsQ.f247"
実は島根県民はオイシイと思っている話 #weeklyuko
mppA6nx_rsQ

動画IDだけを2つスペースで区切ってダウンロードできるか試す。→できた。
なお「-i」でもdll不足のポップアップエラーは出た(知ってた)


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download -i YiAWVLkdYIo mppA6nx_rsQ
[youtube] YiAWVLkdYIo: Downloading webpage
[youtube] YiAWVLkdYIo: Downloading MPD manifest
[info] Writing video subtitles to: シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.ja.vtt
[youtube] mppA6nx_rsQ: Downloading webpage
[youtube] mppA6nx_rsQ: Downloading MPD manifest
[info] Writing video subtitles to: 実は島根県民はオイシイと思っている話 #weeklyuko-mppA6nx_rsQ.ja.vtt

ところで最初動画IDを間違って「YiAWVLkdYIo.ja」(.jaが余計)でコマンド実行してしまったらこんなエラーが出た。「youtube-dl "ytsearch:YiAWVLkdYIo.ja"」ということでytsearchというもので検索もできそう?


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download YiAWVLkdYIo.ja mppA6nx_rsQ -i
ERROR: 'YiAWVLkdYIo.ja' is not a valid URL. Set --default-search "ytsearch" (or run  youtube-dl "ytsearch:YiAWVLkdYIo.ja" ) to search YouTube

試すとこんな感じ。(うっかり動画ダウンロードされてしまった)


C:\bin>youtube-dl "ytsearch:YiAWVLkdYIo"
[download] Downloading playlist: YiAWVLkdYIo
[youtube:search] query "YiAWVLkdYIo": Downloading page 1
[youtube:search] playlist YiAWVLkdYIo: Downloading 1 videos
[download] Downloading video 1 of 1
[youtube] YiAWVLkdYIo: Downloading webpage
[youtube] YiAWVLkdYIo: Downloading MPD manifest
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
[dashsegments] Total fragments: 49
[download] Destination: シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.f247.webm
[download]  75.5% of ~2.10MiB at  4.09MiB/s ETA 00:06    [download] Got server HTTP error: HTTP Error 404: Not Found. Retrying fragment 38 (attempt 1 of 10)...
[download]  81.6% of ~2.11MiB at  5.83MiB/s ETA 00:05    [download] Got server HTTP error: HTTP Error 404: Not Found. Retrying fragment 41 (attempt 1 of 10)...
[download] Got server HTTP error: HTTP Error 404: Not Found. Retrying fragment 41 (attempt 2 of 10)...
[download]  83.7% of ~2.15MiB at  7.49MiB/s ETA 00:05    [download] Got server HTTP error: HTTP Error 404: Not Found. Retrying fragment 42 (attempt 1 of 10)...
[download] 100% of 2.19MiB in 00:32
[download] Destination: シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.f140.m4a
[download] 100% of 3.96MiB in 00:01
[ffmpeg] Merging formats into "シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.mkv"
ERROR:

字幕だけダウンロードにも使えた。


C:\bin>youtube-dl "ytsearch:YiAWVLkdYIo" --sub-lang ja --write-auto-sub --skip-download
[download] Downloading playlist: YiAWVLkdYIo
[youtube:search] query "YiAWVLkdYIo": Downloading page 1
[youtube:search] playlist YiAWVLkdYIo: Downloading 1 videos
[download] Downloading video 1 of 1
[youtube] YiAWVLkdYIo: Downloading webpage
[youtube] YiAWVLkdYIo: Downloading MPD manifest
[info] Writing video subtitles to: シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.ja.vtt
[download] Finished downloading playlist: YiAWVLkdYIo

単語検索して複数一括でダウンロードできるのかな、と試してみるがイマイチ。「protoout」だとダウンロードされず、「プロトアウト」だと1件だけダウンロードできた。最初の1つだけしか取ってこないのかな。


C:\bin>youtube-dl "ytsearch:protoout" --sub-lang ja --write-auto-sub --skip-download
[download] Downloading playlist: protoout
[youtube:search] query "protoout": Downloading page 1
[youtube:search] playlist protoout: Downloading 1 videos
[download] Downloading video 1 of 1
[youtube] Mxd-QARETeM: Downloading webpage
[youtube] Mxd-QARETeM: Downloading MPD manifest
[download] Finished downloading playlist: protoout



C:\bin>youtube-dl "ytsearch:"プロトアウト"" --sub-lang ja --write-auto-sub --skip-download
[download] Downloading playlist: プロトアウト
[youtube:search] query "プロトアウト": Downloading page 1
[youtube:search] playlist プロトアウト: Downloading 1 videos
[download] Downloading video 1 of 1
[youtube] 2ffGMzsvhoA: Downloading webpage
[youtube] 2ffGMzsvhoA: Downloading MPD manifest
[info] Writing video subtitles to: 体験版あり!自宅で気軽にAR体験: 動画再生WEBサイト『モニエアリング』 (プロトアウトスタジオ2期生 周防さん)-2ffGMzsvhoA.ja.vtt
[download] Finished downloading playlist: プロトアウト

ところで偶然落とせたこの字幕を前回記事のスクリプトでテキスト化してみると前回試しに字幕をダウンロードした動画より日本語で読める感じだった。


送っ はいでは始めさせていただきます てくお願いしまーすお願いしまーすはいえー私数をと申しますよろしくお願いします 私は ar が好きで趣味でプログラムを書いています後アプリを使って作って イベントで紹介したりしています 今回は家作で気軽に ar 体験ができる もニーアリングといったものを作ったのでそれを紹介させていただきます 
も兄あーリングというものはいわゆる動画を再生する動画再生サイトになります ですがただ単純に動画を再生するのではなく穴から覗くように動画を見るという体験を 提供します 穴から覗く園動画を見ることで何かを観察しているような感覚を提供します これが実際の画面になります スマホからは壁に穴が開いていて a 壁の向こう側が見えている
ように見えますが実際には穴は開いておらず 見えているのは動画の再生画面になります こちら体験版がありまして右側の qr コードから まあスマホで読み込んでいただくと同じように動作を確認することができます こちらどういう仕組みかというと web サーバーを用意しましてその web サーバーに ar の機能と 動画を再生する機能この2つの機能
を持たせておきます それでまあスマホで ar のマーカーを認識させるとそれら二つの機能をうまいこと 使ってですね 穴があいたようなギミックを表現しています こちら2012年にアイデアを思いついて 2017年にやっと施策が出来ました そこから開発を進めていて例えばドアに穴を開けられないかなあみたいなことをやって みたいしていました あと
やっぱり穴なのでへこむような表現が必要だなと思って ヘコに ar ってをやるんだろうといったところ開発を進めていました あとはまあより高簡単に実装できないかなあ見たいところをやっていました ここまでくるとまあ何かしら商品にしたいなぁと思って 一番初め考えたのが体に穴が開く服ってどうだろうみたいなことをやってみました こちら 
1着あたり90万円 にかかるとまぁ原価だけで90万円かかるということがわかって まああえなくやめました こんな感じで開発と a 失敗を繰り返してまぁ今回のもにエアリングといったものが完成に至りました このもニーアリングなんですけどビジネスとしても使えないかなといったところを模索 しています 例えば印刷物ポスターとかチラシとかそう
いったものにこの もにゃリングを追加するとまぁあの 穴が開くえーい ポスターとかチラシとかになるとでその穴から見えるのが正 紹介したい商品の情報とで穴から見るのでやっぱりちゃんとは見えないはチラ見せの 効果が起こって まあそれによって商品への関心度を上げられないかとかあでもすごく商品が関心度が 上がった状態で は本当に誘導
したり集客サイトに誘導するとかあるいはこの another 区 ポスターとかっていうのはあまり見ないのでその物珍しさでは sns などで拡散が 起こったりとか期待できないかなと考えております 今回8今回このもにありんぐですね キャンプファイアーでプロジェクトを公開させていただきました 先ほどのあの印刷物の連携といったところもですねえリ
ターンとして用意させて いただきましたのでお今日もパターですね 一度検討頂ければと思います はい以上になりますありがとうございます ありがとうございますございます コメントねー 子供心をくすぐりそうみたいな ポイントは一つ目 家ってどこで読みたいな感覚でいっぱい遊びそうとか そうですねぇ なんかどういった感じの活用になるかと
いうのはクラウドファンディングを通して もっとユースケースを探していきたいなみたいな感覚ですね はいそうですねうんこんな感じですん じゃあの こ


-i, --ignore-errors
ダウンロードエラーを無視する。プレイリストごとダウンロードするような時に使う。

--abort-on-error
ダウンロードエラーが発生したら以降の処理を中止する。

--socket-timeout SECONDS
タイムアウトの秒数を指定。単位は秒。

--playlist-start NUMBER
--playlist-end NUMBER
例えば2を指定するとプレイリスト内の2番目の動画から処理を開始もしくは処理を終える。

--playlist-items ITEM_SPEC
--playlist-items 1-3,7,10-13のように処理するプレイリスト内の番号を指定する。

--match-title REGEX
--reject-title REGEX
正規表現にマッチした物をダウンロードするかもしくは除外してダウンロードする。

--max-downloads NUMBER
最大ダウンロード数を指定する。

--date DATE
動画のアップロード日時を指定する。

--datebefore DATE
--dateafter DATE
指定した日時より以前もしくは以後の物をそれぞれ処理する。

--min-views COUNT
--max-views COUNT
最大最小視聴回数をそれぞれ指定する。

--match-filter FILTER
ダウンロードする動画をフィルタする。「like_count > 100 & dislike_count < 50 & description」などと使う。

--age-limit YEARS
なんのこっちゃと思ったら年齢制限の事。

--download-archive FILE
このオプションで指定したファイルにダウンロードした動画のIDを自動で記録する。そして記録された動画は次回実行時にダウンロードをスキップする。

-R, --retries RETRIES
リトライ数を指定する。infiniteという値も一応用意されているがこんな値使うな。

--playlist-reverse
プレイリスト上の動画を最後からダウンロードする。

--playlist-random
プレイリスト上の動画をランダムにダウンロードする。

--external-downloader COMMAND
外部ダウンローダーを指定する。対応してるのはaria2c、avconv、axel、curl、ffmpeg、httpie、wget。

--external-downloader-args ARGS
外部ダウンローダーに引数を渡す。

-a, --batch-file FILE
動画URLを記述したファイルを指定してまとめてダウンロードする。

--id
ファイル名を動画IDのみとする。後述の-oと併用するとconflictで停止する。

-o, --output TEMPLATE
ファイル名を指定する。使用できる変数は後述のOUTPUT TEMPLATEを参照。

--write-thumbnail
サムネイルを作成する。

--write-all-thumbnails
サムネイルを全てのフォーマットで作成する。

--list-thumbnails
利用可能なサムネイルを表示する。

--no-warnings
警告を無視する。

-s, --simulate
実行をシミュレートするだけで一切のダウンロードを行わない。

--skip-download
動画のダウンロードを行わない。

-g, --get-url
-e, --get-title
--get-id
--get-thumbnail
--get-description
--get-duration
--get-filename
--get-format
指定の物を表示するだけで実行はしない。

-j, --dump-json
実行をシミュレートするだけだが諸情報をJSON形式で表示する。

-J, --dump-single-json
実行をシミュレートするだけだが与えられた引数ごとに諸情報をJSON形式で表示する。

--print-json
--quietで実行かつ動画情報をJSONで表示。

-v, --verbose
デバッグ用の諸情報を表示する。

--dump-pages
デバッグ用にリクエスト結果をbase64でエンコードして表示する。でも長過ぎてデバッグにならない。

--write-pages
デバッグ用に中間処理を表示する。

--write-sub
字幕ファイルを生成する。

--write-auto-sub
youtubeで字幕ファイルを自動で生成する。

--all-subs
使用可能な全ての字幕をダウンロードする。

--list-subs
使用可能な全ての字幕を表示する。

--sub-format FORMAT
字幕のフォーマットを指定する。

--sub-lang LANGS
字幕の言語を指定する。

-u, --username USERNAME
ログイン時のユーザー名を指定する。

-p, --password PASSWORD
ログイン時のパスワードを指定する。

--embed-subs
動画ファイルに字幕を埋め込む。

--embed-thumbnail
音声ファイルにサムネイルを埋め込む。

--exec CMD
ダウンロード後コマンドを実行する。

--convert-subs FORMAT
字幕フォーマットを変換する。サポートしてるのはsrt、ass、vtt、lrc。

OUTPUT TEMPLATE
断っておくが以下の物が全て使える訳ではない。特定のサイトに特化したような物も多い。

id
動画ID

title
動画タイトル

url
動画URL

release_date
YYYYMMDDで表される動画のrelease日時

uploader_id
動画upload者のIDもしくはニックネーム

duration
動画の長さ

view_count
動画の閲覧数

like_count
動画のポジティブな評価数

dislike_count
動画のネガティブな評価数

average_rating
動画の平均評価数

comment_count
動画のコメント数

age_limit
動画の制限年齢

chapter
チャプターのタイトル

chapter_number
チャプターの数

chapter_id
チャプターのID

例えばこんな感じで使う。
-o %(title)s-%(id)s.%(ext)s
Windowsのbatch fileで使う場合は
-o "%%(title)s-%%(id)s.%%(ext)s"
と%をエスケープする。

コメント欄で指摘があったがterminalでは
-o '%(title)s.%(ext)s'
としないとむしろ動かないらしい。terminalだからLinuxかね。ようはpath部分を’で囲めって事だね。

FAQ

using output template conflicts with using title, video ID or auto numberというエラーが出る。
--idと-oを同時に指定するなど矛盾がある。

402エラーが返ってくるけどこれは何。
YouTubeへのアクセス過多。ブラウザでCAPTCHAをクリアする事。

他に何かプログラムはいるのか。
単独で動きはするがffmpegもしくはavconvはあった方が良い。rtmpdumpもあればRTMPプロトコルを扱えるようになるが正直出番はあまりない。

URLに&が含まれているとエラーが返る。
&は特殊文字扱いなのでURLを""で囲む事。

429または402エラーが返る。
アクセス過多でIPがブロックされている可能性が高い。サービス管理者に問い合わせるか--proxyや--source-address等を使う事。

HLSは--hls-prefer-nativeと--hls-prefer-ffmpegのどちらがいいのか。
youtube-dlは最適な方を自動で選ぶようになっているそうな。しかしnativeじゃないと使えないoptionもある。

-o でファイル名を指定。この下の動画をDLする場合は、このようなコマンドになる。
youtube-dl -f bestvideo+251/bestvideo+bestaudio/best --merge-output-format mkv https://www.youtube.com/watch?v=Kb_H5zsVtw0 -o "%%(upload_date)s_%%(title)s_%%(id)s"

上記コマンドでファイル名を指定するとこうなる。
20180424_MEGALOVANIA_Kb_H5zsVtw0.mkv

–download-archive [.txtのパス]
ダウンロードしたファイル(動画ID)をテキストファイルに保存する。これによってダウンロード済みの動画をスキップしてくれる。

-o
–output を -o と省略可能
ファイル名の指定が可能。詳しくは公式リファレンスや詳しく紹介しているサイトを参照。

“%%(upload_date)s_%%(title)s_%%(id)s” と指定して必ずアップロード日を入れるようにしている。こうすることでファイル名でソートしてもちゃんと並ぶ。
念の為動画IDも入れて同じ動画名やライブ放送名でも上書きされることがないようにした。


最大ダウンロード数を変更してみる。

お。最大ダウンロード数オプションがあったので「C:\bin>youtube-dl "ytsearch:"プロトアウト"" --sub-lang ja --write-auto-sub --skip-download --max-downloads 10」なら10本の動画を落としてくるのかな、と思ったけど1本だけしか落としてこなかった。違うっぽい。

サムネイルをダウンロードしてみる。


C:\bin>youtube-dl "ytsearch:"プロトアウト"" --sub-lang ja --write-auto-sub --skip-download --write-thumbnail
[download] Downloading playlist: プロトアウト
[youtube:search] query "プロトアウト": Downloading page 1
[youtube:search] playlist プロトアウト: Downloading 1 videos
[download] Downloading video 1 of 1
[youtube] Mxd-QARETeM: Downloading webpage
[youtube] Mxd-QARETeM: Downloading MPD manifest
[youtube] Mxd-QARETeM: Downloading thumbnail ...
[youtube] Mxd-QARETeM: Writing thumbnail to: 画像分析AIを使ったLINE Botを1時間で作ってみよう(顔認証編) ~プロトアウト体験会-Mxd-QARETeM.jpg
[download] Finished downloading playlist: プロトアウト

0620-1113.PNG

ダウンロードできたけど「--write-auto-sub」が無視されて字幕ファイルはダウンロードできなかったので、どちらかしか使えないっぽい。
サムネイルは検索結果の表示に使いたいだけなので、おそらくサムネイルURLさえわかればダウンロードまではいらないかな。

外部ファイルに動画URLを記載してダウンロードしてみる。

動画IDだけの.txtを準備して引数で渡してみる。

0620-1135.PNG


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download --batch-file urls.txt
[youtube] Mxd-QARETeM: Downloading webpage
[youtube] Mxd-QARETeM: Downloading MPD manifest
[youtube] YiAWVLkdYIo: Downloading webpage
[youtube] YiAWVLkdYIo: Downloading MPD manifest
[info] Writing video subtitles to: シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.ja.vtt
[youtube] mppA6nx_rsQ: Downloading webpage
[youtube] mppA6nx_rsQ: Downloading MPD manifest
[info] Writing video subtitles to: 実は島根県民はオイシイと思っている話 #weeklyuko-mppA6nx_rsQ.ja.vtt


1行目の動画字幕がダウンロードされなかった。
1行目は無視なのかな、とタイトル行として「url」と書いてみたが怒られた。


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download --batch-file urls.txt
ERROR: You've asked youtube-dl to download the URL "url". That doesn't make any sense. Simply remove the parameter in your command or configuration. Add -v to the command line to see what arguments and configuration youtube-dl got.

urls.txtの動画の順番を入れ替えてみる。1行目、というわけではなく特定の動画がダウンロードできていない。たしかにログもそんな感じで「[info] Writing video subtitles to:」の直前までは行けてる感じがする。


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download --batch-file urls.txt
[youtube] YiAWVLkdYIo: Downloading webpage
[youtube] YiAWVLkdYIo: Downloading MPD manifest
[info] Writing video subtitles to: シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.ja.vtt
[youtube] mppA6nx_rsQ: Downloading webpage
[youtube] mppA6nx_rsQ: Downloading MPD manifest
[info] Writing video subtitles to: 実は島根県民はオイシイと思っている話 #weeklyuko-mppA6nx_rsQ.ja.vtt
[youtube] Mxd-QARETeM: Downloading webpage
[youtube] Mxd-QARETeM: Downloading MPD manifest


さきほど「youtube-dl "ytsearch:"プロトアウト""」でダウンロードできた動画なのでそもそもがダウンロードできないということはあるまい。となると記述方法があやしい。動画IDを見ると「Mxd-QARETeM」。ハイフンがあやしい。ダブルクォーテーションで囲ってみる。


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download --batch-file urls.txt
ERROR: '"YiAWVLkdYIo"' is not a valid URL. Set --default-search "ytsearch" (or run  youtube-dl "ytsearch:"YiAWVLkdYIo"" ) to search YouTube

ありゃ。「'」かな。


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download --batch-file urls.txt
ERROR: "'YiAWVLkdYIo'" is not a valid URL. Set --default-search "ytsearch" (or run  youtube-dl "ytsearch:'YiAWVLkdYIo'" ) to search YouTube

ぬーん。エスケープ文字はあんまり使いたくないなぁ。
まずはURLフルパスも試してみよう。


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download --batch-file urls.txt
[youtube] YiAWVLkdYIo: Downloading webpage
[youtube] YiAWVLkdYIo: Downloading MPD manifest
[info] Writing video subtitles to: シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.ja.vtt
[youtube] mppA6nx_rsQ: Downloading webpage
[youtube] mppA6nx_rsQ: Downloading MPD manifest
[info] Writing video subtitles to: 実は島根県民はオイシイと思っている話 #weeklyuko-mppA6nx_rsQ.ja.vtt
[youtube] Mxd-QARETeM: Downloading webpage
[youtube] Mxd-QARETeM: Downloading MPD manifest

エスケープ文字試します…


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download --batch-file urls.txt
[youtube] YiAWVLkdYIo: Downloading webpage
[youtube] YiAWVLkdYIo: Downloading MPD manifest
[info] Writing video subtitles to: シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.ja.vtt
[youtube] mppA6nx_rsQ: Downloading webpage
[youtube] mppA6nx_rsQ: Downloading MPD manifest
[info] Writing video subtitles to: 実は島根県民はオイシイと思っている話 #weeklyuko-mppA6nx_rsQ.ja.vtt
[generic] watch?v=Mxd%-QARETeM: Requesting header
WARNING: Falling back on generic information extractor.
[generic] watch?v=Mxd%-QARETeM: Downloading webpage
[generic] watch?v=Mxd%-QARETeM: Extracting information
ERROR: Unsupported URL: https://www.youtube.com/watch?v=Mxd%-QARETeM

あれ、URLが違うって言われた。

.txtを使わずに直でやってみよう。


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download "https://www.youtube.com/watch?v=Mxd-QARETeM"
[youtube] Mxd-QARETeM: Downloading webpage
[youtube] Mxd-QARETeM: Downloading MPD manifest

C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download "https://www.youtube.com/watch?v=YiAWVLkdYIo"
[youtube] YiAWVLkdYIo: Downloading webpage
[youtube] YiAWVLkdYIo: Downloading MPD manifest
[info] Writing video subtitles to: シャープのマスクとIoTの件 #weeklyuko #雑談-YiAWVLkdYIo.ja.vtt

うげ。だめか。試しにハイフンのないURLを試すと問題ないのでやはりハイフンがある動画IDがだめっぽい。

先のサイトのコメント欄に以下のことが書いてあった。

outputオプションについて、Windowsのバッチでは、
-o "%%(title)s-%%(id)s.%%(ext)s"
で二重引用符と%2つが必要みたいです。ずっと%一つでなんで動かないのかわからなくて困ってたら公式ページに書いてましたw

なん、だと。


C:\bin>youtube-dl --sub-lang ja --write-auto-sub --skip-download "https://www.youtube.com/watch?v=Mxd%%-QARETeM"
[generic] watch?v=Mxd%%-QARETeM: Requesting header
WARNING: Falling back on generic information extractor.
[generic] watch?v=Mxd%%-QARETeM: Downloading webpage
[generic] watch?v=Mxd%%-QARETeM: Extracting information
ERROR: Unsupported URL: https://www.youtube.com/watch?v=Mxd%%-QARETeM

だめかー(´・ω・`)
ちがうだろうなーと思いつつ「\」のエスケープ文字も試してみましたがダメ。動作見てるとdll不足エラーが出るので、Youtubeにアクセスはしていて、Windowsにファイルとして生成するときに失敗してる? ワンチャンWindowsだけの事象でLinuxだったら問題なかったりしないかしら。

そもそもyoutube-dl単品で単語検索でいけるのか調べる

ちょっと脇道に逸れすぎましたので軌道修正。
日時や視聴回数、いいね回数でフィルタできそう?(アウトプットファイル名に使えるだけ?) てことは検索単語っぽいこともいけそうなんだけどな。そしてそれが使えるなら使うツールを少なくできるはず。

YouTube Data APIに投げた後にyoutube-dlでダウンロードしてるってことはyoutube-dl単品では無理ってことなのかな。
参考になりそうな記事。Pythonで書かれてますが、そもそもyoutube-dlがPython必要なのでがんばって参考にするか?

まずは、キーワードから上位検索結果の情報をdict型として取得します。

少々ややこしいdict型のデータですがURLの一部を取り出すことができます。URLが直接受け取れるわけではなくIDとして受け取れるので、共通のURLとつなげてやればよいわけです。
検索結果にチャンネルが出てくる場合があるのでKeyErrorを用いることで回避しました。

APIを使いすぎると、制限がかかるのでほどほどにしといた方がよさそうです。


特定の動画をDLしたい時
youtube-dl -f bestvideo+251/bestvideo+bestaudio/best --merge-output-format mkv [動画URL] -o "%%(upload_date)s_%%(title)s_%%(id)s"

特定のチャンネルの動画を一括でDLしたい時
youtube-dl -f bestvideo+251/bestvideo+bestaudio/best --merge-output-format mkv [チャンネルURL] -o "%%(upload_date)s_%%(title)s_%%(id)s"

特定のチャンネルの動画の最新5件のみDLしたい時
youtube-dl -f bestvideo+251/bestvideo+bestaudio/best --merge-output-format mkv [チャンネルURL] --playlist-end 5 -o "%%(upload_date)s_%%(title)s_%%(id)s"

特定のチャンネルの動画の最新10件をスキップしてDLしたい時
youtube-dl -f bestvideo+251/bestvideo+bestaudio/best --merge-output-format mkv [チャンネルURL] --playlist-start 10 -o "%%(upload_date)s_%%(title)s_%%(id)s"


チャンネル一括はできそう。

そういえば「ytsearch」というものもあるんでした。こちらも調べてみましょう。

Search YouTube from the command-line without an API key. It can fetch URLs and various meta content in whatever output format you'd like. Out of the box it pairs well with ytdl.
APIキーを使わずに、コマンドラインからYouTubeを検索できます。URLや様々なメタコンテンツを取得し、お好みの出力形式で表示することができます。初期設定では、ytdlとの組み合わせが便利です。

インストールしてみましたがサンプルコマンドすらうまくいかない。うーん、Nodistのせいかなぁ。それか警告にもありますが6年前で更新止まってるので色々組み合わせが悪い? これはちょっと使いづらいのでおとなしくYoutube APIを使いましょう。ちょっと検索数によるAPIロックが気になるけど…。


PS C:\Users\ShinsukeSutou\Desktop\vtt-to-text> npm install -g ytsearch
npm WARN deprecated timelabel@1.2.0: Development of this module has been stopped.
C:\Program Files (x86)\Nodist\bin\ytsearch -> C:\Program Files (x86)\Nodist\bin\node_modules\ytsearch\ytsearch.js
+ ytsearch@1.0.4
updated 1 package in 0.674s
PS C:\Users\ShinsukeSutou\Desktop\vtt-to-text> ytsearch "the beatles" -p -l 5
Error: Unquoted attribute value
Line: 1
Column: 12
Char: e
    at error (C:\Program Files (x86)\Nodist\bin\node_modules\ytsearch\node_modules\sax\lib\sax.js:642:8)
    at strictFail (C:\Program Files (x86)\Nodist\bin\node_modules\ytsearch\node_modules\sax\lib\sax.js:662:22)
    at SAXParser.write (C:\Program Files (x86)\Nodist\bin\node_modules\ytsearch\node_modules\sax\lib\sax.js:1240:11)
    at Parser.exports.Parser.Parser.parseString (C:\Program Files (x86)\Nodist\bin\node_modules\ytsearch\node_modules\xml2js\lib\xml2js.js:273:29)
    at Parser.parseString (C:\Program Files (x86)\Nodist\bin\node_modules\ytsearch\node_modules\xml2js\lib\xml2js.js:6:61)
    at exports.parseString (C:\Program Files (x86)\Nodist\bin\node_modules\ytsearch\node_modules\xml2js\lib\xml2js.js:296:19)
    at IncomingMessage.<anonymous> (C:\Program Files (x86)\Nodist\bin\node_modules\ytsearch\node_modules\youtube-search\index.js:39:7)
    at IncomingMessage.emit (events.js:326:22)
    at endReadableNT (_stream_readable.js:1241:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)
PS C:\Users\ShinsukeSutou\Desktop\vtt-to-text> 

次回へのTODO

画面フロントを考える。
サーバー側で動かす実装方法を調べる。
  Linuxサーバーに乗せる?
  そこまでするよりユーザーのクライアント動作としてしまう?
自動字幕ではなく、ちゃんと字幕がある場合はそちらをダウンロードするような仕組みを考える。
  公式字幕つきの動画をみつけてコマンドが正しく動くか確認する。
Youtube側の仕様変更の際のバージョンアップマニュアルを作成する。
ハイフンがある動画IDの字幕がダウンロードできない点の対応。
  ワンチャンLinuxだったら問題ない可能性あり?

2
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3