6 ポイント 投稿者 GN⁺ 2024-07-30 | 1件のコメント | WhatsAppで共有
  • MeTubeyt-dlp向けのセルフホスティングWeb UIで、ブラウザからYouTubeと数十の対応サイトのメディアをダウンロードできる
  • 動画、音声、字幕、サムネイルのダウンロードに対応し、プレイリストとチャンネルも出力形式やダウンロードオプションを調整して取得できる
  • チャンネルやプレイリストを購読して定期的に新しい項目を確認し、新規アップロードを自動でキューに追加できる
  • Dockerまたはdocker-composeで実行し、同時ダウンロード数、保存パス、ファイル名テンプレート、HTTPS、CORS、テーマ、ログレベルなどを環境変数で設定する
  • yt-dlpオプションはグローバルオプション、プリセット、ダウンロードごとのオーバーライドの順で組み合わされ、ダウンロードごとのオーバーライドは任意オプションの入力を許可するため、信頼できる環境でのみ有効化すべきである

MeTubeでできること

  • MeTubeyt-dlpベースのセルフホスティングWeb UI
  • YouTubeおよびyt-dlpが対応する数十のサイトからメディアをダウンロードできる
  • 主な機能は以下の通り
    • ブラウザUIで動画、音声、字幕、サムネイルをダウンロード
    • プレイリストとチャンネルのダウンロード
    • 出力パスとダウンロードオプションの構成
    • チャンネル・プレイリストを購読して新しい項目を定期的に確認
    • 新規アップロードを自動でダウンロードキューに追加

実行方法

  • Dockerですぐに実行できる
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_TRASHCANtrueの場合、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_DIRSCREATE_CUSTOM_DIRSにより、UIでダウンロードのサブディレクトリを選択または自動作成できる
  • STATE_DIRにはqueue.jsonpending.jsoncompleted.jsonsubscriptions.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オブジェクトで指定する
      • オプションの階層は広い範囲から狭い範囲の順に適用される
      1. グローバルオプション: すべてのダウンロードのデフォルト値
      2. プリセット: UIでダウンロードごとに選択する名前付きオプションセット
      3. ダウンロードごとのオーバーライド: 特定のダウンロードにのみ適用する自由入力オプション
      • 競合するキーがある場合は、より具体的な設定が優先される
      • ダウンロードごとのオーバーライドはプリセットより優先される
      • プリセットはグローバルオプションより優先される
      • JSONでオプション値を**null**に設定すると、そのダウンロードではそのオプションを削除する
      • YTDL_OPTIONS_FILEYTDL_OPTIONS_PRESETS_FILEはファイル変更を監視して自動で再読み込みするため、コンテナの再起動は不要
      • ファイルと環境変数を併用して同じキーまたは同じプリセット名を定義した場合は、ファイル設定が優先される

プリセットとオーバーライド

  • プリセットはUIのAdvanced Options配下の「Option Presets」に表示される
  • 例のプリセットは次の処理を行う
    • sponsorblock: sponsor、selfpromo、interactionセグメントを削除
    • embed-subs: 英語とドイツ語の字幕をダウンロードして動画ファイルに埋め込む
    • limit-rate: ダウンロード速度を約5 MB/sに制限
  • 複数のプリセットを選択すると順番に適用され、同じオプションは後ろのプリセットが前のプリセットを上書きする
  • ALLOW_YTDL_OPTIONS_OVERRIDEStrueに設定すると、UIに「Custom yt-dlp Options」の自由入力JSONフィールドが表示される
  • ダウンロードごとのオーバーライドはデフォルトでは無効になっている
  • この機能を有効にすると、UIへアクセスできる利用者が任意のyt-dlp APIオプションを渡せるようになり、オプションによってはコンテナ内で任意コマンドを実行できる可能性があるため、信頼できる環境でのみ有効化すべきである
  • MeTubeは初期メタデータ取得段階で独自のextract_flatnoplaylist動作を強制しており、プリセットではこの段階のキーを上書きできない

Cookie、ブラウザ連携、ショートカット実行

  • 制限付きまたは非公開の動画をダウンロードする必要がある場合は、ブラウザCookieを利用できる
    • FirefoxまたはChrome拡張でCookieをcookies.txtとして書き出す
    • MeTubeのAdvanced OptionsUpload 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_URLPUBLIC_HOST_AUDIO_URLは、完了ファイルのダウンロードリンクの基準URLを変更する
  • HTTPStrueに設定し、CERTFILEKEYFILEを指定すると、MeTubeはHTTPSモードで動作する
  • リバースプロキシはHTTPS終端や認証のために使用できる
  • linuxserver/swagイメージには、MeTube用のsubfolder、subdomain設定スニペットとAuthelia認証設定が含まれている
  • NGINXの例では/metube/パスをhttp://metube:8081へプロキシし、WebSocket動作のためにUpgradeConnectionヘッダーを設定する
  • 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件のコメント

 
GN⁺ 2024-07-30
Hacker Newsの意見
  • Tube Archivistも検討する価値があります。動画を数本だけ落としたい用途には大げさですが、気に入っている技術系チャンネルを保存してインデックス化するのに使っています。
    文字起こし/字幕だけでなく、コメント、タイトル、説明まで含めて全文とメタデータの検索ができるので、腹立たしいことに Alphabet が提供しているものよりはるかに優れています。
    https://www.tubearchivist.com/

    • TubeArchivistを見ていましたが、コンテナが3つ必要な点が気に入りませんでした。そこで selfhosted のサブレディットで Pinchflat を見つけ、単一コンテナで動作してデプロイしやすく、今のところ問題なく動いています。
      https://github.com/kieraneglin/pinchflat
    • これは避けたいです。ファイル名の付け方が、データベースが存在することを前提にしています。
      一時保存なら理解できますが、自らを「アーカイブ」ソフトウェアと呼ぶツールなら、保存しようとしているデータより自分のほうが長生きできないかもしれないと想定すべきです。
      ダウンロード機能付きの PeerTube クローンのようで期待していたのですが、出力を見て冷めました。yt-dlp に気の利いた設定とスクリプトを組み合わせるほうが、アーカイブ作業をきちんとやってくれます。
    • Googleが自社製品を構造化された高度な方法で便利に使えるようにすることはありません。そういうやり方はユーザーに有利すぎて、コントロール権を渡しすぎるからです。Googleはそういうものを嫌います。
    • 今日これより前にトップページに載っていた別の選択肢もあります: Yark: YouTube Archiver with Offline UI
      https://news.ycombinator.com/item?id=41100820
    • Tube Archivistに移りたいとは前から思っていましたが、TubeSyncで集めたYouTube動画が数TBもあり、再ダウンロードしたくありません。
      幸い、ファイル名を保存するときに使ったフォーマット文字列があり、TubeSyncはDjangoとPostgreSQLバックエンドを使っているので、YouTube IDと紐づけられるかもしれません。それでも移行はかなり悪夢のように見えます。
  • 本当に欲しいのは YouTube TiVo です。
    ほとんど宗教的に追っているものの、アップロード頻度が低いチャンネルが100個ほどあり、それらの動画は絶対に見逃したくありません。
    1日に4回も投稿するチャンネル群の新着動画が何百本もある中から、YouTube上で実際に見たい1〜2本を探し回りたくもありません。結局見逃してしまいます。
    実際に見たい、または見るべきものだけを集めた優先度付きフィードがあるとよく、全部ダウンロードしてDLNAで見られればさらに良いです。
    私たちが好きなものを見逃さないようにすることは、YouTubeの運営方針ではありません。3分の動画を18〜22分に引き延ばした動画を見せ、フィードバックを顔に貼り付けておくのがYouTubeのやり方です。

    • それは YouTubeの登録チャンネルで解決できるのでは? その100チャンネルを登録して登録チャンネルページをブックマークすれば、見たいものだけがある優先度付きフィードができます。
      アカウントを作りたくないという話ならそれは分かりますし、NewPipeがよく合うでしょう。ただ、自分で選んだチャンネルの動画を時系列で見せる専用ページがあるのに、「私たちが好きなものを見逃さないようにするのがYouTubeのやり方ではない」と言うのは少し変です。
    • NewPipeはこの用途にかなり合っています。メインページのコンテンツから「Default Kiosk」列を消して「What's New」だけを残せば、登録したチャンネルの動画だけを見られます。NewPipeの登録はGoogleアカウントとはまったく統合されていません。
    • YouTubeはまだ RSS を使っていると理解しています。それを試してみるとよいかもしれません。
    • この用途で Invidious を使っています。登録チャンネルだけを対象にした優先度付きフィードがあるので良いです。
      発見性はよくありませんが、それが必要なユースケースでなければ見てみる価値があります。
    • まさにそのために使っている fraidycat 拡張があります。
      https://fraidyc.at/
  • ひとつ理解できないことがある。なぜサーバーにホスティングする必要があるのか? Windows/Linux/mac で動くスタンドアロンアプリでよいのではないか
    最近 yt-dlp を使い始めて、簡単なアプリを作ってみようかと考えていた。やる価値はあるだろうか? この種の代替はすでにあるのだろうか?

    • 望むなら Windows/Linux/OSX デバイスや、その上の仮想マシン/コンテナをサーバーにできる。こうすれば作る側は Web 用 UX とネイティブ UX を別々に作る必要がない
      多くの人はセルフホスティングアプリを外部サーバーやホームラボ、またはその組み合わせで動かし、そのリソースをバックアップなどが整ったインフラのように設定している。PC/ノートPC/タブレット/スマホは比較的単純なクライアントやキャッシュにしておけば、紛失・破損時もサーバーと同期されたローカルコンテンツを取り直せばよいので交換しやすい。こうしたセルフホスティングが人気な理由のひとつ
      yt-dlp をラップしたデスクトップアプリはいくつか見たことがある。自分では使っていないので安定性や信頼性は何とも言えないが、趣味で新しく作りたいのでなければ、まず検索してみるのがよい。欲しいものがすでにあるかもしれない
    • Celluloid は対応 URL を開くよう指示すると、自動的に yt-dlp を使ってストリーミングする。Parabolicyt-dlp を使う専用のダウンロードツール
      https://flathub.org/apps/details/io.github.celluloid_player....
      https://flathub.org/apps/org.nickvision.tubeconverter
    • YouTube 動画だけをダウンロードするなら、yt-dlp すら必須ではない。はるかに少ないコードと複雑さでできるし、とても小さな C プログラムとして使っている。小さなシェルスクリプトでも十分うまく動く
      誰も話題にしていないのは、yt-dlp が今では itag 22 をダウンロードできず、itag 18 には速度制限がかかっている点。なので yt-dlp は音声ファイルと動画ファイルを別々に取得し、その後 ffmpeg で結合する必要がある
      YouTube の広告収益がコンセンサス予想をちょうど下回った。YouTube 動画へのアクセス性は今後さらに悪化するかもしれない
      特定の形式を選ぶ習慣がなければ、これはあまり気づかない可能性が高い。たとえば、何年も itag 18 と 22 だけを使ってきた人もいる
    • Freetube もある
      https://freetubeapp.io/
    • 今使っているデバイスではなく、NAS やホームサーバーに動画をダウンロードして保存したい場合もある
      Docker 化された Web アプリは、Windows、macOS、Android、iOS、Linux 向けのデスクトップ/モバイルクライアントをそれぞれ作るより、はるかに作成・保守しやすい
  • Jellyfin と連携するインターフェースがあるとよい。YouTube を検索して yt-dlp でダウンロードし、その後、広告なしで Jellyfin でストリーミングするような形だとよい

    • ほぼそういう使い方をしているが、yt-dlp の段階だけ手動。Jellyfin プラグインがあれば素晴らしそう
  • かなり良い。今は https://cobalt.tools を使っているが、これも悪くない

    • 完璧。元の YouTube 音声形式を mp3 にトランスコードせずにダウンロードするオプションがある
  • iOS 版 Brave に、YouTube 動画をダウンロードして端末に保存する再生リストボタンがあることを知った。PiP とオフライン再生が可能で、広告もない
    Mozilla iOS バックエンドを基にした公開ライセンスを使っているのに、なぜもっと多くのアプリがこうしないのか不思議。Apple に受け入れさせる方法を見つけていて、CEO もここでその手法が妥当だと擁護する投稿をしたことがある
    本質的には通常の YouTube サイト内で動画を読み込んだ後でのみ動作し、YouTube だけでなくどんな動画コンテンツにも適用されるリーダーモードボタンのような方式

  • YouTube ミラーリングツールがこれほど多いのは少し不思議。こういうものを使うなら、YouTube でそのままストリーミングせずに動画をダウンロード/保管する理由は何なのか?
    YouTube から削除される場合に備えて保存しておくのがよいことがあるのは理解できるが、自分の場合はそういうことは非常にまれ。動画を見たらそれで終わりで、もう見られなくなってもあまり気にならない

    • YouTube でストリーミングせずにダウンロードしたり保管したりする理由はいくつもある
      第一に、広告除去は多くの人にとってかなり大きな理由
      第二に、すでに書かれているように、著作権申し立てや他の通報によって動画やチャンネル全体が削除されると、二度とストリーミングできない。見るコンテンツによっては、これはあなたよりずっと重要な問題になり得る
      第三に、オフライン再生のためにダウンロードできる。公式 YouTube アプリでも可能だが Premium 料金を払う必要があり、その価格は高すぎるように見えるし、削除問題の影響も依然として受ける
      第四に、ローカルインデックス。後で見返したり共有したりするために動画を参照するなら、YouTube 上のコピーへのブックマークを維持したり毎回検索したりするより、自分の構造で整理する方が便利な場合がある
      上記の理由が組み合わさっていることもあるだろうし、自分が考慮していない、または思い出せない他の理由もあるはず
    • 自分にとっては、人々が VCR を使っていたのと同じ理由。「著作権侵害」ではなく、後で見たり、インターネット接続がない/遅いときに見たりするために保存する
      自分がダウンロードするものの大半は、一度見たら削除する
    • 子どもたちのホームネットワークでは YouTube をブロックし、代わりに自分で選別した DadTube にアクセスさせている
    • ツールがなぜ存在するのか不思議だと言いながら、そのツールが存在すべき最大の理由を自分で挙げている
      さらに 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 に任せればいい。もっと良い選択肢を知っている人はいる?