- MeTubeは
yt-dlp向けのセルフホスティングWeb UIで、ブラウザからYouTubeと数十の対応サイトのメディアをダウンロードできる
- 動画、音声、字幕、サムネイルのダウンロードに対応し、プレイリストとチャンネルも出力形式やダウンロードオプションを調整して取得できる
- チャンネルやプレイリストを購読して定期的に新しい項目を確認し、新規アップロードを自動でキューに追加できる
- Dockerまたはdocker-composeで実行し、同時ダウンロード数、保存パス、ファイル名テンプレート、HTTPS、CORS、テーマ、ログレベルなどを環境変数で設定する
yt-dlpオプションはグローバルオプション、プリセット、ダウンロードごとのオーバーライドの順で組み合わされ、ダウンロードごとのオーバーライドは任意オプションの入力を許可するため、信頼できる環境でのみ有効化すべきである
MeTubeでできること
- MeTubeは
yt-dlpベースのセルフホスティングWeb UI
- YouTubeおよび
yt-dlpが対応する数十のサイトからメディアをダウンロードできる
- 主な機能は以下の通り
- ブラウザUIで動画、音声、字幕、サムネイルをダウンロード
- プレイリストとチャンネルのダウンロード
- 出力パスとダウンロードオプションの構成
- チャンネル・プレイリストを購読して新しい項目を定期的に確認
- 新規アップロードを自動でダウンロードキューに追加
実行方法
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
- docker-composeの例では
ghcr.io/alexta69/metubeイメージを使用し、コンテナの/downloadsをホストのダウンロードディレクトリにマウントする
services:
metube:
image: ghcr.io/alexta69/metube
container_name: metube
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- /path/to/downloads:/downloads
ダウンロードと保存先の設定
- MAX_CONCURRENT_DOWNLOADSは同時実行できるダウンロード数を制限し、デフォルト値は
3
- DELETE_FILE_ON_TRASHCANが
trueの場合、UIの「Completed」セクションで項目をゴミ箱に送ると、サーバー上のダウンロードファイルも削除される
- DEFAULT_OPTION_PLAYLIST_ITEM_LIMITはプレイリストからダウンロード可能な最大項目数を定め、デフォルト値
0は無制限を意味する
- 購読関連のデフォルト値も環境変数で調整する
- SUBSCRIPTION_DEFAULT_CHECK_INTERVAL: 購読ごとの自動確認間隔、デフォルトは
60分
- SUBSCRIPTION_SCAN_PLAYLIST_END: 購読確認時に取得する最大プレイリスト・チャンネル項目数、デフォルトは
50
- SUBSCRIPTION_MAX_SEEN_IDS: 購読ごとに保存する動画ID数の上限、デフォルトは
50000
- DOWNLOAD_DIRはダウンロード保存パスで、Dockerイメージではデフォルト値が
/downloads
- 音声専用ダウンロードはAUDIO_DOWNLOAD_DIRで別の保存パスを指定できる
- CUSTOM_DIRSとCREATE_CUSTOM_DIRSにより、UIでダウンロードのサブディレクトリを選択または自動作成できる
- STATE_DIRには
queue.json、pending.json、completed.json、subscriptions.jsonのような永続状態ファイルが保存される
- TEMP_DIRは一時ダウンロードファイルのパスで、SSDやRAMファイルシステムを使うと性能向上に役立つことがあるが、RAMファイルシステムはダウンロード再開を妨げる場合がある
ファイル名とyt-dlpオプション
- OUTPUT_TEMPLATEはダウンロードファイル名のテンプレートで、デフォルト値は
%(title)s.%(ext)s
- チャプター、プレイリスト、チャンネルのダウンロード用テンプレートを個別に設定できる
-
OUTPUT_TEMPLATE_CHAPTER
-
OUTPUT_TEMPLATE_PLAYLIST
- OUTPUT_TEMPLATE_CHANNEL
yt-dlpオプションはJSONオブジェクトで指定する
- オプションの階層は広い範囲から狭い範囲の順に適用される
- グローバルオプション: すべてのダウンロードのデフォルト値
- プリセット: UIでダウンロードごとに選択する名前付きオプションセット
- ダウンロードごとのオーバーライド: 特定のダウンロードにのみ適用する自由入力オプション
- 競合するキーがある場合は、より具体的な設定が優先される
- ダウンロードごとのオーバーライドはプリセットより優先される
- プリセットはグローバルオプションより優先される
- JSONでオプション値を**
null**に設定すると、そのダウンロードではそのオプションを削除する
YTDL_OPTIONS_FILEとYTDL_OPTIONS_PRESETS_FILEはファイル変更を監視して自動で再読み込みするため、コンテナの再起動は不要
- ファイルと環境変数を併用して同じキーまたは同じプリセット名を定義した場合は、ファイル設定が優先される
プリセットとオーバーライド
- プリセットはUIのAdvanced Options配下の「Option Presets」に表示される
- 例のプリセットは次の処理を行う
- sponsorblock: sponsor、selfpromo、interactionセグメントを削除
- embed-subs: 英語とドイツ語の字幕をダウンロードして動画ファイルに埋め込む
- limit-rate: ダウンロード速度を約5 MB/sに制限
- 複数のプリセットを選択すると順番に適用され、同じオプションは後ろのプリセットが前のプリセットを上書きする
- ALLOW_YTDL_OPTIONS_OVERRIDESを
trueに設定すると、UIに「Custom yt-dlp Options」の自由入力JSONフィールドが表示される
- ダウンロードごとのオーバーライドはデフォルトでは無効になっている
- この機能を有効にすると、UIへアクセスできる利用者が任意の
yt-dlp APIオプションを渡せるようになり、オプションによってはコンテナ内で任意コマンドを実行できる可能性があるため、信頼できる環境でのみ有効化すべきである
- MeTubeは初期メタデータ取得段階で独自の
extract_flat、noplaylist動作を強制しており、プリセットではこの段階のキーを上書きできない
Cookie、ブラウザ連携、ショートカット実行
- 制限付きまたは非公開の動画をダウンロードする必要がある場合は、ブラウザCookieを利用できる
- FirefoxまたはChrome拡張でCookieを
cookies.txtとして書き出す
- MeTubeのAdvanced OptionsでUpload Cookiesからアップロードする
- 同じセクションのDelete Cookiesでアップロード済みCookieを削除する
- ブラウザ拡張を使うと、動画上で右クリックしてMeTubeへ直接送信できる
- HTTPSページで使うには、MeTubeインスタンスがHTTPSリバースプロキシの背後にある必要がある
- 拡張は
chrome-extension://...またはmoz-extension://...オリジンからリクエストするため、**CORS_ALLOWED_ORIGINS=***の設定が必要
- Chrome拡張はGoogle Chrome Webstoreからインストールするか、ソースから導入できる
- Firefox拡張はFirefox Addonsからインストールするか、ソースを利用できる
- iOS ShortcutではSafariの共有メニューからMeTubeへURLを送信できる
- Bookmarkletは現在開いているWebページをMeTubeへ送信し、HTTPSページではMeTubeがHTTPSで構成されているか、HTTPSリバースプロキシの背後にある必要がある
- Bookmarkletは現在のページのオリジンからMeTubeへクロスオリジンリクエストを送るため、利用するサイトのオリジンをCORS_ALLOWED_ORIGINSに追加する必要がある
- Raycast向けのMeTube extensionを使うと、Raycastから直接動画を追加できる
Webサーバー、HTTPS、リバースプロキシ
- Webサーバー関連の設定は環境変数で調整する
- HOSTのデフォルト値は
0.0.0.0
- PORTのデフォルト値は
8081
- URL_PREFIXはリバースプロキシ背後でサブパス配備する際に使用する
- PUBLIC_HOST_URLとPUBLIC_HOST_AUDIO_URLは、完了ファイルのダウンロードリンクの基準URLを変更する
- HTTPSを
trueに設定し、CERTFILE、KEYFILEを指定すると、MeTubeはHTTPSモードで動作する
- リバースプロキシはHTTPS終端や認証のために使用できる
linuxserver/swagイメージには、MeTube用のsubfolder、subdomain設定スニペットとAuthelia認証設定が含まれている
- NGINXの例では
/metube/パスをhttp://metube:8081へプロキシし、WebSocket動作のためにUpgradeとConnectionヘッダーを設定する
- ApacheおよびCaddy向けのリバースプロキシ例も提供されている
更新、トラブルシューティング、ローカル開発
- MeTubeはyt-dlpに依存しており、動画サイトのレイアウト変更により
yt-dlpは頻繁な更新が必要になる
- 新しい
yt-dlp安定版リリースが出ると、新しいMeTube Dockerイメージが自動で公開される
- コンテナを最新状態に保つ方法として、watchtowerを利用できる
yt-dlp nightlyチャネルを追従するには、YTDL_NIGHTLY_UPDATE_TIMEに毎日のアップグレードとMeTube再起動を実行する時刻をHH:MM形式で設定する
- 認証、後処理、権限、
YTDL_OPTIONSの問題は、まずyt-dlpで直接デバッグし、その後で動作するオプションをMeTubeに持ち込む流れが推奨される
- ローカルでのビルドと実行にはNode.js 22+とPython 3.13が必要
- UIは
pnpmでビルドし、Python依存関係はuv syncでインストールしたうえで、uv run python3 app/main.pyで実行する
- Dockerイメージは
docker build -t metube .でローカルビルドでき、この過程でUIもあわせてビルドされる
1件のコメント
Hacker Newsの意見
Tube Archivistも検討する価値があります。動画を数本だけ落としたい用途には大げさですが、気に入っている技術系チャンネルを保存してインデックス化するのに使っています。
文字起こし/字幕だけでなく、コメント、タイトル、説明まで含めて全文とメタデータの検索ができるので、腹立たしいことに Alphabet が提供しているものよりはるかに優れています。
https://www.tubearchivist.com/
https://github.com/kieraneglin/pinchflat
一時保存なら理解できますが、自らを「アーカイブ」ソフトウェアと呼ぶツールなら、保存しようとしているデータより自分のほうが長生きできないかもしれないと想定すべきです。
ダウンロード機能付きの PeerTube クローンのようで期待していたのですが、出力を見て冷めました。
yt-dlpに気の利いた設定とスクリプトを組み合わせるほうが、アーカイブ作業をきちんとやってくれます。https://news.ycombinator.com/item?id=41100820
幸い、ファイル名を保存するときに使ったフォーマット文字列があり、TubeSyncはDjangoとPostgreSQLバックエンドを使っているので、YouTube IDと紐づけられるかもしれません。それでも移行はかなり悪夢のように見えます。
本当に欲しいのは YouTube TiVo です。
ほとんど宗教的に追っているものの、アップロード頻度が低いチャンネルが100個ほどあり、それらの動画は絶対に見逃したくありません。
1日に4回も投稿するチャンネル群の新着動画が何百本もある中から、YouTube上で実際に見たい1〜2本を探し回りたくもありません。結局見逃してしまいます。
実際に見たい、または見るべきものだけを集めた優先度付きフィードがあるとよく、全部ダウンロードしてDLNAで見られればさらに良いです。
私たちが好きなものを見逃さないようにすることは、YouTubeの運営方針ではありません。3分の動画を18〜22分に引き延ばした動画を見せ、フィードバックを顔に貼り付けておくのがYouTubeのやり方です。
アカウントを作りたくないという話ならそれは分かりますし、NewPipeがよく合うでしょう。ただ、自分で選んだチャンネルの動画を時系列で見せる専用ページがあるのに、「私たちが好きなものを見逃さないようにするのがYouTubeのやり方ではない」と言うのは少し変です。
発見性はよくありませんが、それが必要なユースケースでなければ見てみる価値があります。
https://fraidyc.at/
ひとつ理解できないことがある。なぜサーバーにホスティングする必要があるのか? Windows/Linux/mac で動くスタンドアロンアプリでよいのではないか
最近
yt-dlpを使い始めて、簡単なアプリを作ってみようかと考えていた。やる価値はあるだろうか? この種の代替はすでにあるのだろうか?多くの人はセルフホスティングアプリを外部サーバーやホームラボ、またはその組み合わせで動かし、そのリソースをバックアップなどが整ったインフラのように設定している。PC/ノートPC/タブレット/スマホは比較的単純なクライアントやキャッシュにしておけば、紛失・破損時もサーバーと同期されたローカルコンテンツを取り直せばよいので交換しやすい。こうしたセルフホスティングが人気な理由のひとつ
yt-dlpをラップしたデスクトップアプリはいくつか見たことがある。自分では使っていないので安定性や信頼性は何とも言えないが、趣味で新しく作りたいのでなければ、まず検索してみるのがよい。欲しいものがすでにあるかもしれないyt-dlpを使ってストリーミングする。Parabolic はyt-dlpを使う専用のダウンロードツールhttps://flathub.org/apps/details/io.github.celluloid_player....
https://flathub.org/apps/org.nickvision.tubeconverter
yt-dlpすら必須ではない。はるかに少ないコードと複雑さでできるし、とても小さな C プログラムとして使っている。小さなシェルスクリプトでも十分うまく動く誰も話題にしていないのは、
yt-dlpが今では itag 22 をダウンロードできず、itag 18 には速度制限がかかっている点。なのでyt-dlpは音声ファイルと動画ファイルを別々に取得し、その後ffmpegで結合する必要があるYouTube の広告収益がコンセンサス予想をちょうど下回った。YouTube 動画へのアクセス性は今後さらに悪化するかもしれない
特定の形式を選ぶ習慣がなければ、これはあまり気づかない可能性が高い。たとえば、何年も itag 18 と 22 だけを使ってきた人もいる
https://freetubeapp.io/
Docker 化された Web アプリは、Windows、macOS、Android、iOS、Linux 向けのデスクトップ/モバイルクライアントをそれぞれ作るより、はるかに作成・保守しやすい
Jellyfin と連携するインターフェースがあるとよい。YouTube を検索して
yt-dlpでダウンロードし、その後、広告なしで Jellyfin でストリーミングするような形だとよいyt-dlpの段階だけ手動。Jellyfin プラグインがあれば素晴らしそうかなり良い。今は https://cobalt.tools を使っているが、これも悪くない
iOS 版 Brave に、YouTube 動画をダウンロードして端末に保存する再生リストボタンがあることを知った。PiP とオフライン再生が可能で、広告もない
Mozilla iOS バックエンドを基にした公開ライセンスを使っているのに、なぜもっと多くのアプリがこうしないのか不思議。Apple に受け入れさせる方法を見つけていて、CEO もここでその手法が妥当だと擁護する投稿をしたことがある
本質的には通常の YouTube サイト内で動画を読み込んだ後でのみ動作し、YouTube だけでなくどんな動画コンテンツにも適用されるリーダーモードボタンのような方式
YouTube ミラーリングツールがこれほど多いのは少し不思議。こういうものを使うなら、YouTube でそのままストリーミングせずに動画をダウンロード/保管する理由は何なのか?
YouTube から削除される場合に備えて保存しておくのがよいことがあるのは理解できるが、自分の場合はそういうことは非常にまれ。動画を見たらそれで終わりで、もう見られなくなってもあまり気にならない
第一に、広告除去は多くの人にとってかなり大きな理由
第二に、すでに書かれているように、著作権申し立てや他の通報によって動画やチャンネル全体が削除されると、二度とストリーミングできない。見るコンテンツによっては、これはあなたよりずっと重要な問題になり得る
第三に、オフライン再生のためにダウンロードできる。公式 YouTube アプリでも可能だが Premium 料金を払う必要があり、その価格は高すぎるように見えるし、削除問題の影響も依然として受ける
第四に、ローカルインデックス。後で見返したり共有したりするために動画を参照するなら、YouTube 上のコピーへのブックマークを維持したり毎回検索したりするより、自分の構造で整理する方が便利な場合がある
上記の理由が組み合わさっていることもあるだろうし、自分が考慮していない、または思い出せない他の理由もあるはず
自分がダウンロードするものの大半は、一度見たら削除する
さらに YouTube のストリーミングができない場合もある。ネットが切れていたり、海外のモバイル料金プランで費用が重かったり、単にひどい広告をなくしたかったりするかもしれない
関連: Yark: Offline UI 付き YouTube Archiver
https://news.ycombinator.com/item?id=41100820
yt-dlpベースのサーバーのどれかを、ごくシンプルな Pi-hole のようなイメージ作成ツールと、再生用のまともなフロントエンド・クライアントアプリで包めば、Pi-hole があまり技術に詳しくないユーザーにも広がったように、大きく普及する可能性があると思うRaspberry Pi を買い、microSD カードにイメージを書き込み、好きな YouTube チャンネルを選び、クライアントアプリをインストールすれば、好きな YouTube コンテンツがすべてローカルで広告なしに提供される、という形だ
今は TubeSync を使っている。機能はシンプルでバグも多いが、自分には十分うまく動いている
必要な作業は、チャンネルやプレイリストを購読し、動画を特定のパスにダウンロードし、1日に1回新しいコンテンツを確認することだけ
必要な UX はチャンネル設定だけで、その後はファイルを保存するだけにして、あとは Plex に任せればいい。もっと良い選択肢を知っている人はいる?