yt-dlp – matoken's blog https://matoken.org/blog Is there no plan B? Thu, 19 Feb 2026 22:17:01 +0000 ja hourly 1 https://wordpress.org/?v=7.0.1 https://matoken.org/blog/wp-content/uploads/2025/03/cropped-1865f695c4eecc844385acef2f078255036adccd42c254580ea3844543ab56d9-32x32.jpeg yt-dlp – matoken's blog https://matoken.org/blog 32 32 yt-dlpでYouTubeの字幕ファイルのダウンロードに失敗(HTTP Error 429: Too Many Requests) https://matoken.org/blog/2026/02/20/yt-dlp_subtitle_429error/ https://matoken.org/blog/2026/02/20/yt-dlp_subtitle_429error/#respond Thu, 19 Feb 2026 22:17:00 +0000 https://matoken.org/blog/?p=5258

Tokyo Linux Users Group のTechnical Meeting のビデオがYouTube にアップロードされていると先日の #kagolug で教えてもらったので観てみようと思いました.
でもTLUG は英語です.以前はWisper.cpp で文字起こし & 機械翻訳で字幕を作っていましたが最近のYouTube の文字起こしは大分良くなっているのでそれを使おうとローカルにビデオと字幕をdl しようとしたところ字幕のダウンロードに失敗しました.

適当な解像度のビデオとオーディオ,それと英語の文字起こし字幕と,それを日本語に翻訳したものをダウンロードしようとしました.

$ yt-dlp -f 244+251 yYgF87nqyKI --write-auto-subs --sub-langs ja,en_orig
[youtube] Extracting URL: yYgF87nqyKI
[youtube] yYgF87nqyKI: Downloading webpage
[youtube] yYgF87nqyKI: Downloading android vr player API JSON
[youtube] yYgF87nqyKI: Downloading web safari player API JSON
[youtube] yYgF87nqyKI: Downloading player 4c5cf06a-tv
[youtube] [jsc:deno] Solving JS challenges using deno
[youtube] yYgF87nqyKI: Downloading m3u8 information
[info] yYgF87nqyKI: Downloading subtitles: ja
[info] yYgF87nqyKI: Downloading 1 format(s): 244+251
[info] Writing video subtitles to: CDImage - Cam [yYgF87nqyKI].ja.vtt
WARNING: The extractor specified to use impersonation for this download, but no impersonate target is available. If you encounter errors, then see  https://github.com/yt-dlp/yt-dlp#impersonation  for information on installing the required dependencies
ERROR: Unable to download video subtitles for 'ja': HTTP Error 429: Too Many Requests

*Too Many Requests* とか言われてしまいました.今日初めて実行したのになんで?

--verbose オプションを付けてみましたがよくわかりません

[info] Writing video subtitles to: CDImage - Cam [yYgF87nqyKI].ja.vtt
[debug] Invoking http downloader on "https://www.youtube.com/api/timedtext?v=yYgF87nqyKI&ei=M4WXaZnECfax2roP_YqAqAc&caps=asr&opi=112496729&xoaf=5&xowf=1&xospf=1&hl=en&ip=0.0.0.0&ipbits=0&expire=1771562915&sparams=ip%2Cipbits%2Cexpire%2Cv%2Cei%2Ccaps%2Copi%2Cxoaf&signature=1B0AC6AA8FB20AFE9B45B2F66DBB1000F04DE626.909918AF43ACD2AFD3E0C2C61E53A3C72E49AB6C&key=yt8&kind=asr&lang=en&fmt=vtt&tlang=ja"
WARNING: The extractor specified to use impersonation for this download, but no impersonate target is available. If you encounter errors, then see  https://github.com/yt-dlp/yt-dlp#impersonation  for information on installing the required dependencies
ERROR: Unable to download video subtitles for 'ja': HTTP Error 429: Too Many Requests
Traceback (most recent call last):
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 4449, in _write_subtitles
    self.dl(sub_filename, sub_copy, subtitle=True)
    ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 3285, in dl
    return fd.download(name, new_info, subtitle)
           ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/matoken/bin/yt-dlp/yt_dlp/downloader/common.py", line 480, in download
    ret = self.real_download(filename, info_dict)
  File "/home/matoken/bin/yt-dlp/yt_dlp/downloader/http.py", line 362, in real_download
    establish_connection()
    ~~~~~~~~~~~~~~~~~~~~^^
  File "/home/matoken/bin/yt-dlp/yt_dlp/downloader/http.py", line 119, in establish_connection
    ctx.data = self.ydl.urlopen(request)
               ~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 4260, in urlopen
    return self._request_director.send(req)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
  File "/home/matoken/bin/yt-dlp/yt_dlp/networking/common.py", line 117, in send
    response = handler.send(request)
  File "/home/matoken/bin/yt-dlp/yt_dlp/networking/_helper.py", line 194, in wrapper
    return func(self, *args, **kwargs)
  File "/home/matoken/bin/yt-dlp/yt_dlp/networking/common.py", line 359, in send
    return self._send(request)
           ~~~~~~~~~~^^^^^^^^^
  File "/home/matoken/bin/yt-dlp/yt_dlp/networking/_requests.py", line 361, in _send
    raise HTTPError(res, redirect_loop=max_redirects_exceeded)
yt_dlp.networking.exceptions.HTTPError: HTTP Error 429: Too Many Requests

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1698, in wrapper
    return func(self, *args, **kwargs)
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1854, in __extract_info
    return self.process_ie_result(ie_result, download, extra_info)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1913, in process_ie_result
    ie_result = self.process_video_result(ie_result, download=download)
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 3096, in process_video_result
    self.process_info(new_info)
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 189, in wrapper
    return func(self, *args, **kwargs)
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 3353, in process_info
    sub_files = self._write_subtitles(info_dict, temp_filename)
  File "/home/matoken/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 4457, in _write_subtitles
    raise DownloadError(msg)
yt_dlp.utils.DownloadError: Unable to download video subtitles for 'ja': HTTP Error 429: Too Many Requests

ISSUES を探すと既知の問題のようでワークアラウンドがありました.

FreeTube is adding a PO token to their subtitles requests. But FreeTube doesn’t use auto-translated subs AFAICT.
# Manual subtitles and original language automatic captions are not affected by this HTTP Error 429 issue.

Only subtitles/captions that have been automatically translated into another language are affected. So you may be able to get the subs you want without a problem if you are precise with your --sub-langs and --write-subs vs --write-auto-subs arguments.

But if you want translated auto subs,
# there are 2 known ways of avoiding this HTTP Error 429:

  • Pass fresh cookies to yt-dlp from a browser session where you’ve very recently loaded auto-translated subs

  • Wait ~60 seconds after extraction and before downloading the auto subs, e.g. --sleep-subtitles 60

(Either of these 2 methods will work individually, you do not need to combine them)

ということでとりあえず --sleep-subtitles 60 を付けて実行することで字幕ダウンロード時にsleep して怒られずに字幕をダウンロードすることができました.

$ yt-dlp -f 244+251 yYgF87nqyKI --write-auto-subs --sub-langs ja,en_orig --sleep-subtitles 60

そしてmpv 等でこんな感じで字幕を2つ表示しながら視聴可能に :)

$ mpv --sub-files='CDImage - Cam [yYgF87nqyKI].en.vtt:CDImage - Cam [yYgF87nqyKI].ja.vtt' --secondary-sid=2 'CDImage - Cam [yYgF87nqyKI].webm'

mpv 2subs

環境
$ yt-dlp --version
2026.02.04
$ deno --version
deno 2.6.8 (stable, release, x86_64-unknown-linux-gnu)
v8 14.5.201.2-rusty
typescript 5.9.2
$ lsb_release -dr
Description:    Debian GNU/Linux forky/sid
Release:        n/a
$ arch
x86_64
]]>
https://matoken.org/blog/2026/02/20/yt-dlp_subtitle_429error/feed/ 0
YoutubeをWebpageに変換するYoutube2Webpage https://matoken.org/blog/2023/09/07/youtube2webpage/ https://matoken.org/blog/2023/09/07/youtube2webpage/#respond Wed, 06 Sep 2023 21:28:36 +0000 https://matoken.org/blog/?p=3917

YoutubeをWebpage に変換する Youtube2Webpage を少し試してみました.

これは yt-dlp でYoutube から動画と文字起こしファイルを入手し,文字起こし部分のスクリーンショットを取得してWebpage にするというもののようです.

試しにオープンソースカンファレンスの動画を変換してみました.

$ sudo apt install yt-dlp ffmpeg (1)
$ git clone https://github.com/obra/Youtube2Webpage
$ cd Youtube2Webpage
$ ./yt-to-webpage.pl "【MTG】NetBSDのご紹介 2023-7-29 C-5" 'https://www.youtube.com/watch?v=TnviEtERcVw' (2)
$ python3 -m http.server --bind 127.0.0.1 --directory ./"【MTG】NetBSDのご紹介 2023-7-29 C-5" 8080 (3)
$ xdg-open http://127.0.0.1:8080/index.html (4)
  1. yt-dlp と ffmpeg を導入
  2. 任意のタイトルとYoutube URL を指定して実行
  3. httpd を起動
  4. ウェブブラウザで開く

youtube2webpage

変換されています.
眺めてみるとまず文字起こし翻訳ファイルで en のものが使われています.
そして元動画でWebPage を画面共有しているのであまりスクリーンショットから内容がよくわかりません.

まず文字起こしテキストは --sub-langs ja オプションを付けて日本語を利用するようにしました.

$ git diff ./yt-to-webpage.pl
diff --git a/yt-to-webpage.pl b/yt-to-webpage.pl
index 41b8acf..4174658 100755
--- a/yt-to-webpage.pl
+++ b/yt-to-webpage.pl
@@ -15,7 +15,7 @@ if (!$url || $url !~ m|^https://www.youtube.com|) {

 mkdir($slug);
 chdir($slug);
-my $video_file = `yt-dlp --console-title  --write-auto-subs --write-subs "$url" --print filename --no-simulate`;
+my $video_file = `yt-dlp --console-title  --write-auto-subs --write-subs --sub-langs ja "$url" --print filename --no-simulate`;
 chomp($video_file);
 my ($vtt) = glob('*.vtt');
 open(my $fh, "<", $vtt);

画像サイズについては,抜き出された画像群のサイズはそこそこ大きいです.css でサイズに制限がかかってるので大きくしました.

$ git diff ./styles.css
diff --git a/styles.css b/styles.css
index 156f994..8972e87 100644
--- a/styles.css
+++ b/styles.css
@@ -56,8 +56,8 @@ li {
 }

 li img{
-    max-width: 288px;
-    max-height: 216px;
+    max-width: 1280px;
+    max-height: 720px;
     transition: all 0.3s;
 }

これで再度コマンドを実行するとファイルがすでにあるというエラーに.一旦ディレクトリごと消して再度実行すると日本語文字起こしテキストかつサイズの大きい画像になりました.

後は文字起こしテキストの精度が悪いですね.(“NetBSD” が “Netflix” や “ネットビジネス” になってたり……)でもこれはYoutube のせいでこのscript の問題ではないです.自分の管理下の動画ならYoutube に任せずOpenAI のWhisper(.cpp) などで文字起こしして手直し後Youtube にアップロードして差し替えるのがいいんでしょうね.

]]>
https://matoken.org/blog/2023/09/07/youtube2webpage/feed/ 0
yt-dlpの一部のバージョンでAbemaTVが利用できなくなった https://matoken.org/blog/2022/07/15/abematv-is-no-longer-available-in-some-versions-of-yt-dlp/ https://matoken.org/blog/2022/07/15/abematv-is-no-longer-available-in-some-versions-of-yt-dlp/#respond Thu, 14 Jul 2022 22:09:04 +0000 http://matoken.org/blog/?p=3722
追記

yt-dlp 2022.07.18がリリースされました.このバージョンでAbemaTVを試したところ問題なく利用できました. yt-dlp -U でアップデートしましょう.


各種動画をローカルにダウンロードできるyt-dlpですが,yt-dlp 2022.03.08以降AbemaTVに対応しました.

しかし最近ダウンロードが出来ません,

以下のようにエラーとなります.

$ yt-dlp https://abema.tv/video/title/26-171
[AbemaTVTitle] 26-171: Downloading webpage
[download] Downloading playlist: リコリス・リコイル
[AbemaTVTitle] Playlist リコリス・リコイル: Downloading 2 videos of 2
[download] Downloading video 1 of 2
[AbemaTV] Authorizing
[AbemaTV] 26-171_s1_p1: Downloading webpage
[AbemaTV] 26-171_s1_p1: Checking playability
[AbemaTV] 26-171_s1_p1: Downloading m3u8 information
[info] 26-171_s1_p1: Downloading 1 format(s): 5300
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 265
[download] Destination: 第1話 Easy does it [26-171_s1_p1].mp4
[download]   0.4% of ~415.26MiB at  796.79KiB/s ETA 08:45 (frag 1/265)ERROR: base None exceeds table length 58
[download] Downloading video 2 of 2
[AbemaTV] 26-171_s1_p500: Downloading webpage
[AbemaTV] 26-171_s1_p500: Checking playability
[AbemaTV] 26-171_s1_p500: Downloading m3u8 information
[info] 26-171_s1_p500: Downloading 1 format(s): 5300
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 21
[download] Destination: PV【7_2より毎週土曜23_30〜地上波同時・独占先行放送】 [26-171_s1_p500].mp4
[download]   4.8% of ~27.57MiB at  794.86KiB/s ETA 00:33 (frag 1/21)ERROR: base None exceeds table length 58
[download] Finished downloading playlist: リコリス・リコイル

yt-dlpのバージョンは2022.06.29でアップデートを試みても最新です.

$ yt-dlp --version
2022.06.29
$ yt-dlp -U
Latest version: 2022.06.29, Current version: 2022.06.29
yt-dlp is up to date (2022.06.29)

streamlinkではダウンロードできます.

$ yt-dlp https://abema.tv/video/episode/26-171_s1_p1 360p -o "リコリス・リコイル 第1話 Easy does it.mp4"

streamlinkが問題ないってことはyt-dlpが怪しい?と古いバーションを試すとyt-dlp 2022.05.18だとうまくいきました.

$ wget https://github.com/yt-dlp/yt-dlp/releases/download/2022.05.18/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/download/2022.05.18/SHA2-512SUMS
$ LC_ALL=C sha512sum -c SHA2-512SUMS 2>/dev/null
yt-dlp: OK
yt-dlp.tar.gz: FAILED open or read
yt-dlp.exe: FAILED open or read
yt-dlp_win.zip: FAILED open or read
yt-dlp_min.exe: FAILED open or read
yt-dlp_x86.exe: FAILED open or read
yt-dlp_macos: FAILED open or read
yt-dlp_macos.zip: FAILED open or read
$ install -m 755 ./yt-dlp ~/bin/yt-dlp-2022.05.18
$ rm ./yt-dlp ./SHA2-512SUMS
$ yt-dlp-2022.05.18 https://abema.tv/video/title/26-171

ということで,yt-dlp 2022.06.22.12022.06.29l がNGのようです.
ISSUEを探すとそれらしいものが.修正済のようなので自バージョンあたりでまた動作するようになるのではと思います.

環境
$ yt-dlp --version
2022.06.29
$ yt-dlp-2022.05.18 --version
2022.05.18
$ dpkg-query -W ffmpeg
ffmpeg  7:4.3.4-0+deb11u1+rpt2
$ lsb_release -dr
Description:    Raspbian GNU/Linux 11 (bullseye)
Release:        11
$ arch
armv7l
$ cat /proc/device-tree/model && echo
Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2022/07/15/abematv-is-no-longer-available-in-some-versions-of-yt-dlp/feed/ 0
yt-dlpでダウンロードしたYouTube動画を視聴履歴に https://matoken.org/blog/2022/04/20/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history-2/ https://matoken.org/blog/2022/04/20/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history-2/#respond Wed, 20 Apr 2022 11:57:45 +0000 http://matoken.org/blog/?p=3619

yt-dlpで動画をダウンロードすると既定値では視聴履歴に残りません.視聴履歴を残すようにしてみました.

yt-dlp -h を見ると以下のあたりで実現できそうです.

    --cookies FILE                   Netscape formatted file to read cookies
                                     from and dump cookie jar in
    --no-cookies                     Do not read/dump cookies from/to file
                                     (default)
    --cookies-from-browser BROWSER[+KEYRING][:PROFILE]
                                     The name of the browser and (optionally)
                                     the name/path of the profile to load
                                     cookies from, separated by a ":". Currently
                                     supported browsers are: brave, chrome,
                                     chromium, edge, firefox, opera, safari,
                                     vivaldi. By default, the most recently
                                     accessed profile is used. The keyring used
                                     for decrypting Chromium cookies on Linux
                                     can be (optionally) specified after the
                                     browser name separated by a "+". Currently
                                     supported keyrings are: basictext,
                                     gnomekeyring, kwallet
    --no-cookies-from-browser        Do not load cookies from browser (default)

YouTubeにログイン済のブラウザのcookie情報を利用

--cookies-from-browser を利用してYouTubeにログイン済のウェブブラウザのcookie情報からYouTubeに閲覧情報を残します.ローカルPCで使う場合に便利です.

対応ウェブブラウザは,brave, chrome, chromium, edge, firefox, opera, safari, vivaldi となっています.
複数プロファイルを利用している場合でも引数で指定可能です.
今回はFirefoxでYouTubeというプロファイルで試します.

Note
$ firefox --ProfileManager (1)
$ firefox -P YouTube (2)
$ firefox --profile  ~/.mozilla/firefox/$( grep YouTube ~/.mozilla/firefox/installs.ini | cut -f2 -d= )/ (3)
  1. プロファイルの確認のためにプロファイルマネージャの起動
  2. YouTube というプロファイルで起動
  3. Youtube の含まれているプロファイル名で起動
$ yt-dlp \
    --cookies-from-browser firefox:YouTube \ (1)
    --playlist-items 1 https://www.youtube.com/c/OSPNjp/videos (2)
  1. firefoxのYouTubeというプロファイルのcookieを利用
  2. 適当なYouTube URL

プロファイルが1つしかなかったり,デフォルトの場合はプロファイルを書く必要はありません.

うまくいけばyt-dlp終了後YouTubeの履歴を確認すると該当の動画が履歴に登録されているはずです.

ウェブブラウザからYouTubeのcookieを書き出して利用

--cookies-from-browser は便利ですが,リモートやヘッドレス環境だとGUIが必要になり面倒です.ウェブブラウザから該当ページのcookie をファイルに書き出し,--cookies オプションで利用します.

まず,YouTubeにログインしているウェブブラウザにcookieを書き出すための cookies.txt という拡張機能を導入します.

次にYouTubeのページを開いた状態で,拡張機能のアイコンをクリックして,「Current Site」を選び,cookieをファイルに保存します.

Fx cookies.txt

保存したcookieファイルを --cookies オプションに指定して実行します.

$ yt-dlp \
    --cookies ./YouTube-cookie.txt (1)
    --playlist-items 1 https://www.youtube.com/c/OSPNjp/videos (2)
  1. 保存したcookieファイルを指定
  2. 適当なYouTube URL

うまくいけばyt-dlp終了後YouTubeの履歴を確認すると該当の動画が履歴に登録されているはずです.

cookieファイルを持っていけば別の端末でも利用可能です.セッションが切れたらcookieファイルは再度作成する必要があると思います.

ユーザ名,パスワードをnetrcファイルに書いて認証(失敗)

netrcファイルにYouTubeのユーザ名,パスワード(2要素認証を有効にしているのでアプリケーションパスワードを生成)を登録してみましたが,この手順だと認証エラーになりうまく行きませんでした.
恐らくreCAPTCHAで引っかかっているのではないかと思います.
お手軽なんですが残念.

環境

$ yt-dlp --version
2022.03.08.1
$ dpkg-query -W firefox-esr ffmpeg
ffmpeg  7:4.3.3-0+deb11u1
firefox-esr     78.15.0esr-1~deb11u1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2022/04/20/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history-2/feed/ 0
yt-dlpでダウンロードしたYouTube動画を視聴履歴に https://matoken.org/blog/2022/04/14/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history/ https://matoken.org/blog/2022/04/14/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history/#respond Wed, 13 Apr 2022 22:19:23 +0000 http://matoken.org/blog/?p=3597

yt-dlpで動画をダウンロードすると既定値では視聴履歴に残りません.視聴履歴を残すようにしてみました.


yt-dlp -h を見ると以下のあたりで実現できそうです.

    --cookies FILE                   Netscape formatted file to read cookies
                                     from and dump cookie jar in
    --no-cookies                     Do not read/dump cookies from/to file
                                     (default)
    --cookies-from-browser BROWSER[+KEYRING][:PROFILE]
                                     The name of the browser and (optionally)
                                     the name/path of the profile to load
                                     cookies from, separated by a ":". Currently
                                     supported browsers are: brave, chrome,
                                     chromium, edge, firefox, opera, safari,
                                     vivaldi. By default, the most recently
                                     accessed profile is used. The keyring used
                                     for decrypting Chromium cookies on Linux
                                     can be (optionally) specified after the
                                     browser name separated by a "+". Currently
                                     supported keyrings are: basictext,
                                     gnomekeyring, kwallet
    --no-cookies-from-browser        Do not load cookies from browser (default)
  Authentication Options:
    -u, --username USERNAME          Login with this account ID
    -p, --password PASSWORD          Account password. If this option is left
                                     out, yt-dlp will ask interactively
    -2, --twofactor TWOFACTOR        Two-factor authentication code
    -n, --netrc                      Use .netrc authentication data
    --netrc-location PATH            Location of .netrc authentication data;
                                     either the path or its containing
                                     directory. Defaults to ~/.netrc
    --video-password PASSWORD        Video password (vimeo, youku)
    --ap-mso MSO                     Adobe Pass multiple-system operator (TV
                                     provider) identifier, use --ap-list-mso for
                                     a list of available MSOs
    --ap-username USERNAME           Multiple-system operator account login
    --ap-password PASSWORD           Multiple-system operator account password.
                                     If this option is left out, yt-dlp will ask
                                     interactively
    --ap-list-mso                    List all supported multiple-system
                                     operators

==

youTubeにログイン済のブラウザのcookie情報を利用

--cookies-from-browser を利用してYouTubeにログイン済のウェブブラウザのcookie情報からYouTubeに閲覧情報を残します.ローカルPCで使う場合に便利です.

対応ウェブブラウザは,brave, chrome, chromium, edge, firefox, opera, safari, vivaldi となっています.
複数プロファイルを利用している場合でも引数で指定可能です.
今回はFirefoxでYouTubeというプロファイルで試します.

Note
$ firefox --ProfileManager (1)
$ firefox -P YouTube (2)
$ firefox --profile  ~/.mozilla/firefox/$( grep YouTube ~/.mozilla/firefox/installs.ini | cut -f2 -d= )/ (3)
  1. プロファイルの確認のためにプロファイルマネージャの起動
  2. YouTube というプロファイルで起動
  3. Youtube の含まれているプロファイル名で起動
$ yt-dlp \
    --cookies-from-browser firefox:YouTube \ (1)
    --playlist-items 1 https://www.youtube.com/c/OSPNjp/videos (2)
  1. firefoxのYouTubeというプロファイルのcookieを利用
  2. 適当なYouTube URL

プロファイルが1つしかなかったり,デフォルトの場合はプロファイルを書く必要はありません.

うまくいけばyt-dlp終了後YouTubeの履歴を確認すると該当の動画が履歴に登録されているはずです.

ウェブブラウザからYouTubeのcookieを書き出して利用

--cookies-from-browser は便利ですが,リモートやヘッドレス環境だとGUIが必要になり面倒です.ウェブブラウザから該当ページのcookie をファイルに書き出し,--cookies オプションで利用します.

まず,YouTubeにログインしているウェブブラウザにcookieを書き出すための cookies.txt という拡張機能を導入します.

次にYouTubeのページを開いた状態で,拡張機能のアイコンをクリックして,「Current Site」を選び,cookieをファイルに保存します.

Fx cookies.txt

保存したcookieファイルを --cookies オプションに指定して実行します.

$ yt-dlp \
    --cookies ./YouTube-cookie.txt (1)
    --playlist-items 1 https://www.youtube.com/c/OSPNjp/videos (2)
  1. 保存したcookieファイルを指定
  2. 適当なYouTube URL

うまくいけばyt-dlp終了後YouTubeの履歴を確認すると該当の動画が履歴に登録されているはずです.

cookieファイルを持っていけば別の端末でも利用可能です.セッションが切れたらcookieファイルは再度作成する必要があると思います.

ユーザ名,パスワードをnetrcファイルに書いて認証(失敗)

netrcファイルにYouTubeのユーザ名,パスワード(2要素認証を有効にしているのでアプリケーションパスワードを生成)を登録してみましたが,この手順だと認証エラーになりうまく行きませんでした.
恐らくreCAPTCHAで引っかかっているのではないかと思います.
お手軽なんですが残念.

環境

$ yt-dlp --version
2022.03.08.1
$ dpkg-query -W firefox-esr ffmpeg
ffmpeg  7:4.3.3-0+deb11u1
firefox-esr     78.15.0esr-1~deb11u1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ arch
x86_64
]]>
https://matoken.org/blog/2022/04/14/youtube-videos-downloaded-with-yt-dlp-in-your-viewing-history/feed/ 0
yt-dlpでAbemaTVをダウンロード https://matoken.org/blog/2022/04/06/download-abematv-with-yt-dlp/ https://matoken.org/blog/2022/04/06/download-abematv-with-yt-dlp/#comments Wed, 06 Apr 2022 11:26:00 +0000 http://matoken.org/blog/?p=3578

yt-dlp 2022.03.08でAbemaTVが対応していたので試してみました.

[AbemaTV] Add extractors by Lesmiscore

普通にダウンロードすると以下のようにタイトルが「第1話」のようにサブタイトルになってしまうようです.

$ yt-dlp -f 184 https://abema.tv/video/episode/593-1_s1_p1
  :
[download] Destination: 第1話 [593-1_s1_p1].mp4
  :

これは分かりづらい.-o でタイトルを指定することも出来ますが面倒です.

$ yt-dlp -f 184 -o "阿波連さんははかれない %(title)s [%(id)s].%(ext)s" https://abema.tv/video/episode/593-1_s1_p1

単話のURLではなくタイトルのURLを指定してOUTPUT TEMPLATEでplaylist+titleを使うと良さそうです.(単話指定だとplaylistはNAになる)

$ yt-dlp -f 184 -o '%(playlist)s %(title)s [%(id)s].%(ext)s' https://abema.tv/video/title/593-1
  :
[download] Destination: 阿波連さんははかれない 第一話 近すぎじゃね? [593-1_s1_p1].mp4
環境
$ yt-dlp --version
2022.03.08.1
$ dpkg-query -W python3 ffmpeg
ffmpeg  7:4.3.3-0+rpt3+deb11u1
python3 3.9.2-3
$ lsb_release -dr
Description:    Raspbian GNU/Linux 11 (bullseye)
Release:        11
$ arch
armv7l
$ cat /proc/device-tree/model && echo
Raspberry Pi 3 Model B Rev 1.2
追記)

ERROR: base None exceeds table length 58 というエラーが出るようになった.

[download]   0.4% of ~269.75MiB at   20.63MiB/s ETA  Unknown (frag 1/278)ERROR: base None exceeds table length 58

yt-dlp 2022.06.22.1 〜 2022.06.29 で発生.yt-dlp 2022.05.18 や streamlink は問題ないので恐らく yt-dlp のbug.

]]>
https://matoken.org/blog/2022/04/06/download-abematv-with-yt-dlp/feed/ 1
yt-dlpでYouTubeで配信されているラジオをダウンロードして視聴する https://matoken.org/blog/2022/04/06/download-and-watch-the-radio-delivered-on-youtube-with-yt-dlp/ https://matoken.org/blog/2022/04/06/download-and-watch-the-radio-delivered-on-youtube-with-yt-dlp/#respond Wed, 06 Apr 2022 10:19:49 +0000 http://matoken.org/blog/?p=3574

YouTubeで配信されているラジオ番組の1話を視聴して面白かったのでダウンロードして移動中などに聞こうと思いました.ダウンロードにはyt-dlpを利用しました.

使い方はyoutube-dlとほぼ同じですが少し動作が違う部分があるので,NEW FEATURES, Differences in default behavior に目を通しておくといいと思います.

対応サイトは以下を見ると現在1500以上ありそうです.

$ curl -s https://raw.githubusercontent.com/yt-dlp/yt-dlp/master/supportedsites.md | grep -E -- ^\ -\ ** | wc -l
1532

ということでまずは導入.いくつか導入方法がありますが,シングルバイナリをダウンロードするのがお手軽かなと思います.

$ wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/SHA2-512SUMS
$ sha512sum -c ./SHA2-512SUMS 2>&1 | grep OK
yt-dlp: OK
$ install -m700 ./yt-dlp ~/bin/
$ rm ./yt-dlp ./SHA2-512SUMS

アップデートは -U オプションをつけて実行するだけでOKなのでお手軽です.

$ yt-dlp  -U
Latest version: 2022.03.08.1, Current version: 2022.03.08.1
yt-dlp is up to date (2022.03.08.1)

まずは -F オプションでフォーマットを確認.

$ yt-dlp -F https://www.youtube.com/watch?v=A3vKWR3WXWk
[youtube] A3vKWR3WXWk: Downloading webpage
[youtube] A3vKWR3WXWk: Downloading android player API JSON
[info] Available formats for A3vKWR3WXWk:
ID  EXT   RESOLUTION FPS │  FILESIZE  TBR PROTO │ VCODEC       VBR ACODEC      ABR     ASR MORE INFO
────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb2 mhtml 48x27          │                mhtml │ images                                   storyboard
sb1 mhtml 80x45          │                mhtml │ images                                   storyboard
sb0 mhtml 160x90         │                mhtml │ images                                   storyboard
139 m4a   audio only     │  11.91MiB  48k https │ audio only       mp4a.40.5   48k 22050Hz low, m4a_dash
249 webm  audio only     │  12.64MiB  51k https │ audio only       opus        51k 48000Hz low, webm_dash
250 webm  audio only     │  16.25MiB  66k https │ audio only       opus        66k 48000Hz low, webm_dash
140 m4a   audio only     │  31.61MiB 129k https │ audio only       mp4a.40.2  129k 44100Hz medium, m4a_dash
251 webm  audio only     │  30.82MiB 126k https │ audio only       opus       126k 48000Hz medium, webm_dash
17  3gp   176x144     12 │  13.01MiB  53k https │ mp4v.20.3    53k mp4a.40.2    0k 22050Hz 144p
160 mp4   256x144     24 │   3.25MiB  13k https │ avc1.4d400c  13k video only              144p, mp4_dash
278 webm  256x144     24 │   4.25MiB  17k https │ vp9          17k video only              144p, webm_dash
133 mp4   426x240     24 │   5.94MiB  24k https │ avc1.4d4015  24k video only              240p, mp4_dash
242 webm  426x240     24 │   6.80MiB  27k https │ vp9          27k video only              240p, webm_dash
134 mp4   640x360     24 │   9.56MiB  39k https │ avc1.4d401e  39k video only              360p, mp4_dash
18  mp4   640x360     24 │  48.99MiB 200k https │ avc1.42001E 200k mp4a.40.2    0k 44100Hz 360p
243 webm  640x360     24 │  24.36MiB  99k https │ vp9          99k video only              360p, webm_dash
135 mp4   854x480     24 │  13.12MiB  53k https │ avc1.4d401e  53k video only              480p, mp4_dash
244 webm  854x480     24 │  19.99MiB  81k https │ vp9          81k video only              480p, webm_dash
136 mp4   1280x720    24 │  17.42MiB  71k https │ avc1.4d401f  71k video only              720p, mp4_dash
22  mp4   1280x720    24 │ ~50.09MiB 200k https │ avc1.64001F 200k mp4a.40.2    0k 44100Hz 720p
247 webm  1280x720    24 │  38.85MiB 159k https │ vp9         159k video only              720p, webm_dash
137 mp4   1920x1080   24 │  42.01MiB 172k https │ avc1.640028 172k video only              1080p, mp4_dash
248 webm  1920x1080   24 │  71.89MiB 294k https │ vp9         294k video only              1080p, webm_dash

ラジオで静止画しか付いていないので,音質が良くて小さいopusの 251 がいいかなと思ったのですが, --embed-thumbnail オプションでサムネイルを埋め込もうとするとopusのwebpには埋め込めないようだったのでmp4aの 140 にすることにしました.

yt-dlp -f 140 –embed-thumbnail A3vKWR3WXWk
[ThumbnailsConvertor] Converting thumbnail "/tmp/【公式】その着せ替え人形はラジオをする(第1回) [A3vKWR3WXWk].webp" to png
ERROR: Supported filetypes for thumbnail embedding are: mp3, mkv/mka, ogg/opus/flac, m4a/mp4/mov

ということでこういう感じでサムネイル画像埋め込みでダウンロードできました.

$ yt-dlp -f 140 --embed-thumbnail A3vKWR3WXWk

ファイラーでもサムネイルが表示されていい感じです.

yt dlp thumbnail

1話目がダウンロードできましたが,現在13話まで配信されています.1話づつダウンロードするのは面倒.プレイリストはあるけどラジオ以外のものも配信されています.でもタイトルを見るとラジオかどうかはわかるのでタイトルでフィルターしてラジオだけをダウンロードすることにしました.

フィルタには --match-filter オプションを使い,title~=フィルタ という感じで使います.ということでこんな感じでダウンロードしてみると,プレイリストをチェックしてフィルタにマッチするものだけをダウンロードしてくれました.これでオフラインでもいつでも聞けます :)

$ yt-dlp -f 140 --embed-thumbnail --match-filter "title~=ラジオをする" https://www.youtube.com/watch?list=PLUH30mfo5wJwdafMdAJFcrcryUbYiixl4
環境
$ yt-dlp --version
2022.03.08.1
$ dpkg-query -W python3 ffmpeg
ffmpeg  7:4.3.3-0+rpt3+deb11u1
python3 3.9.2-3
$ lsb_release -dr
Description:    Raspbian GNU/Linux 11 (bullseye)
Release:        11
$ arch
armv7l
$ cat /proc/device-tree/model && echo
Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2022/04/06/download-and-watch-the-radio-delivered-on-youtube-with-yt-dlp/feed/ 0
YouTube動画をダウンロードして無音部分をカットしたオーディオデータにして聞く https://matoken.org/blog/2022/03/13/ownload-youtube-video-and-listen-to-it-as-audio-data-with-silence-cut/ https://matoken.org/blog/2022/03/13/ownload-youtube-video-and-listen-to-it-as-audio-data-with-silence-cut/#respond Sun, 13 Mar 2022 14:40:28 +0000 http://matoken.org/blog/?p=3531

オープンソースカンファレンス2022 Online Springに参加しました.

ビデオミーティングソフトウェアのZoomとYouTube Liveを使っています.セッションは複数トラックあって同時に参加するのは難しいです.ほとんどのセッションは後日YouTubeで公開されますが,YouTube Liveの動画をリモートのサーバで録画しておいたのでこれをスマートフォンで移動中などに聞けるようにしてみました.

YouTubeの動画ダウンロードにはyoutube-dlやyt-dlpが便利です.セッション毎に起動しておきました.

$ youtube-dl ${URL}
$ yt-dlp ${URL}

今回ダウンロードした動画はvp9+aacのようです.

$ ffprobe -i ./YOUTUBEFILE.mkv 2>&1 | grep ^Input -A99
Input #0, matroska,webm, from './YOUTUBEFILE.mkv':
  Metadata:
    HTTP://YOUTUBE.COM/STREAMING/OTF/DURATIONS/112015: Segment-Count: 6109
                    : Segment-Durations-Ms: 5067,5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),5066,5067(r=1),506
                    :
                    :
    ENCODER         : Lavf58.20.100
  Duration: 08:35:50.04, start: 0.000000, bitrate: 551 kb/s
    Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709/unknown/unknown), 1280x720, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
    Metadata:
      DURATION        : 08:35:49.996000000
    Stream #0:1(eng): Audio: aac (LC), 44100 Hz, stereo, fltp (default)
    Metadata:
      HANDLER_NAME    : ISO Media file produced by Google Inc.
      DURATION        : 08:35:50.040000000

ffmpegで音声だけを抜き出してみます.

$ ffmpeg -i ./YOUTUBEFILE.mkv -vn -acodec copy ./YOUTUBEFILE.aac

元ファイルが2GBほどに対して500MBほどのファイルになりました.
ちょっと大きいのでコーデックをopusに変更してみます.

$ ffmpeg -i ./YOUTUBEFILE.mkv -vn -acodec libopus -b:a 64k ./YOUTUBEFILE.opus

213MB程になりました.
これをローカルにダウンロードして再生してみるとセッション間の無音部分が気になります.無音部分をカットできないかなと探すと,ffmpegのフィルタにそれらしい silenceremove というフィルタがあったので試してみました.

とりあえずexampleを真似して,先頭から最後までの間の1秒以上の無音部分をカットします.ついでにビットレートも32kに下げました.

$ ffmpeg -i ./YOUTUBEFILE.mkv -vn -af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-90dB -acodec libopus -b:a 32k ./YOUTUBEFILE.opus

動画ファイルの長さが 08:35:50.040000000 から 07:55:03.66 になりました.ファイルサイズは107MB程です.

ついでにもう少し低いビットレートも試しました.

ビットレート 容量

32k

107324kB

24k

82484kB

16k

56380kB

少し聞いた感じでは16kでも問題無さそうな感じです.大本のZoomが確か24kなので24k以上はあまり意味がない気がします.

追記)高音質化機能があるようなので動画によって変わりそうです:

High Fidelity Audio mode – Windows, macOS
This option in Advanced Audio enhances “Original Audio” mode, allowing for disabling echo cancellation & post-processing, while raising audio codec quality to 48Khz, 96Kbps mono/192kbps stereo for professional audio transmis
sion in music education and performance applications. Professional audio interface, microphone, and headphones required.

Release notes for September 1
2020 – Zoom Support https://support.zoom.us/hc/en-us/articles/360048388632-New-Updates-for-September-1-2020

ということで他のセッションも同様に変換してAndroidスマートフォンに転送してVLCで1.5倍再生してみて画面スリープで再生できるのを確認しました.これで空き時間に聞けるようになりました :)

youtube2audio

応用としてYouTubeのRSSから動画をダウンロードして音声のみにしてその音声をRSSに埋め込んで公開するとPodcastアグリゲーターで購読できるので便利かもしれません.人の動画を勝手に一般公開するとまずいでしょうが.

環境
$ youtube-dl --version
2021.12.17
$ yt-dlp --version
2022.03.08.1
$ dpkg-query -W ffmpeg
ffmpeg  7:4.1.8-0+deb10u1
$ lsb_release -dr
Description:    Debian GNU/Linux 10 (buster)
Release:        10
$ arch
x86_64
]]>
https://matoken.org/blog/2022/03/13/ownload-youtube-video-and-listen-to-it-as-audio-data-with-silence-cut/feed/ 0