Bilibiliの動画をダウンロードするために yt-dlp を使おうとしたらエラー発生。動画情報が取得できない問題に遭遇しました。
ERROR: [BiliBili] xxxxxxxxxx: Unable to extract initial state;
ブラウザで表示させると 404エラー としてリダイレクトされます。
なんかおかしいなと思いつつユーザーのページからリンクで飛ぶと・・・問題なく表示されました。ん???
さらにBilibiliのトップページを開いたら「自動翻訳が有効になりました」というポップアップが出現。
どうやら仕様の変更があったようです。
そこでURLをよく見てみると
https://www.bilibili.com/ja/video/xxxxxxxxxxxx/
/ja/ という言語設定が付加されてました。
zh-Hans や en に変えるとページの言語も切り替わります。
仕様変更によって 言語付きURLでなければ404を返すようになっていた ようです。
先ほどはブックマークで保存していた検索結果を表示、その画面では古いurlのままだったので404エラーが発生。改めて新しいURLの方で検索したら問題なく表示されました。
気づくまでにちょっと時間がかかりました。
てことで新しい方のurlを渡してみると
ID EXT RESOLUTION 0 html unknown
・・・だめじゃん。
htmlしか返ってこない。たぶん404のhtml?確かめてないけど。
yt-dlpの方も新しいURLを正しく認識できていない可能性があります。
結局、2つファイルを修正したところ、無事にダウンロードできるようになりました。
yt-dlpでBilibiliのurlが解析できていない問題
yt-dlpが動画情報を正常に取得できず、次のような結果に。
[info] Available formats for player: ID EXT RESOLUTION │ PROTO │ VCODEC ACODEC ──────────────────────────────────────────── 0 html unknown │ https │ unknown unknown
動画の映像や音声のフォーマットではなく、HTMLしか取得できていません。
ブラウザでは動画を再生できるので、URL自体が無効というわけでもなさそうです。
ログを見ると
(旧url)bilibili.com/video/ の方は
[BiliBili] Extracting URL:...
(新url)bilibili.com/ja/video/ の方は
[generic] Extracting URL:... WARNING: [generic] Falling back on generic information extractor
Bilibiliのurlだと認識されず、ジェネリックなinformation extractorで処理されてしまっているようです。
そこで、Bilibili用のextractorが言語付きURLを認識できるように修正しました。
yt_dlp/extractorのファイルを修正する
yt-dlpは extractor のファイルが動画ページから動画IDや再生に必要な情報などを取得します。
今回の修正では関係する2つのファイルを変更しました。
- lazy_extractors.py
- bilibili.py
念の為、変更前にそれぞれバックアップを取っておいてください。修正は自己責任で。
対象ファイルの場所について
bilibili.py と lazy_extractors.py のある場所は、OSや yt-dlp のインストール方法によって異なります。
macOSだけでも Homebrew、pip、pipx、MacPortsなど複数の方法があり、環境によってインストール先が異なるため、ここですよとは言いづらいのです。
ファイルの場所が分からない場合は、
ご自身のOSと yt-dlp のインストール方法を伝えたうえで、ChatGPTなどのAIアシスタントに確認してみてください。
多分それが一番早い。(^^;
ちなみに自分は macOS、pipx で入れたので
~/Library/Application Support/pipx/venvs/yt-dlp/lib/python3.13/site-packages/yt_dlp/extractor/
でした。
修正したファイル①:lazy_extractors.py
lazy_extractors.py は、yt-dlpの遅延読み込み(Lazy Loading)に関係するファイルです。
修正前は次のようになっていました。(1500行目)
_VALID_URL = 'https?://(?:www\\.)?bilibili\\.com/(?:video/|festival/[^/?#]+\\?(?:[^#]*&)?bvid=)(?P[aAbB][vV])(?P [^/?#&]+)'
この正規表現では、/video/ などのパスは対象になりますが、/ja/video/ のように言語コードが先頭に追加された形式は対象になりません。
次のように変更します。
_VALID_URL = 'https?://(?:www\\.)?bilibili\\.com/(?:[a-zA-Z-]+/)?(?:video/|festival/[^/?#]+\\?(?:[^#]*&)?bvid=)(?P[aAbB][vV])(?P [^/?#&]+)'
追加したのはこれ、
(?:[a-zA-Z-]+/)?
ドメイン bilibili\\.com/ の後に言語設定の部分を足しました。
これで新旧両方のurlに対応できます。
#旧urlhttps://www.bilibili.com/video/BVxxxxxxxxxx/#新urlhttps://www.bilibili.com/ja/video/BVxxxxxxxxxx/
修正したファイル②:bilibili.py
bilibili.py は、Bilibiliの動画情報を取得するための実際の処理を定義しているファイルです。
対象となるのは、こちらも BiliBiliIE クラスの _VALID_URL です。
修正前(372行目)
_VALID_URL = r'https?://(?:www\.)?bilibili\.com/(?:video/|festival/[^/?#]+\?(?:[^#]*&)?bvid=)(?P[aAbB][vV])(?P [^/?#&]+)'
こちらも変更点は lazy_extractors.py と同じです。
ドメインの後の言語設定に対応させます。(?:[a-zA-Z-]+/)?を追加。
_VALID_URL = r'https?://(?:www\.)?bilibili\.com/(?:[a-zA-Z-]+/)?(?:video/|festival/[^/?#]+\?(?:[^#]*&)?bvid=)(?P[aAbB][vV])(?P [^/?#&]+)'
まとめ
これで無事にファイルフォーマットを取得、ダウンロードできるようになりました。
今回の問題は、Bilibiliの言語付きURLをyt-dlpが正しく扱えなかったことが原因でした。
そしてこれはあくまで一時的な回避策です。修正前のファイルをバックアップしておき、自己責任で修正してください。
yt-dlpが正式に更新されるまではこれで凌ぐことにします。
同じ症状に遭遇した方の参考になれば幸いです。
では。
追記
記事を書いたその日にyt-dlpがアップデートされました。
使っていた nightly 2026.10.10.233141 -> 正式リリース版 ver.2026.10.21.233146 にアップデート。
ただbilibili.pyはアップデートされていないので書き換えが必要、lazy_extractors.pyはリネームするか書き換えが必要です。

コメント