注: 32ビットのアームビルドは、新しいノードバージョンがそれらをサポートせず、継続的なセキュリティの更新と依存関係に新しいノードバージョンが必要であるため、32ビットアームビルド(他の主要なプレーヤーの1年後)が廃止されました。 64ビットのOSに移行して、予定のアップグレードを受け続けてください。
プレイリストサポートを備えたYouTube-DL(YT-DLPフォークを使用)のWeb GUI。 YouTubeや他の数十のサイトからビデオをダウンロードできます。
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
services :
metube :
image : ghcr.io/alexta69/metube
container_name : metube
restart : unless-stopped
ports :
- " 8081:8081 "
volumes :
- /path/to/downloads:/downloads
Dockerコマンドラインの-e
パラメーター、またはenvironment:
Docker -Composeのセクションを使用して、環境変数を介して特定の値を設定できます。
1000
です。1000
です。022
です。light
、 dark
、またはauto
に設定できます。デフォルトはauto
になります。/downloads
、および.
さもないと。DOWNLOAD_DIR
の値になります。true
の場合、ダウンロードdirs( download_dir and audio_download_dir )はWebServerでインデックス可能です。デフォルトはfalse
になります。true
です。true
です。/downloads/.metube
にデフォルト.
さもないと。/downloads
、および.
さもないと。tmpfs
)に設定しますtrue
の場合、UIの「完了」セクションからゴミ箱に渡されると、ダウンロードされたファイルがサーバー上で削除されます。デフォルトはfalse
になります。/
になります。http
( certfileとkeyfileが必要)の代わりにhttps
を使用します。デフォルトはfalse
になります。%(title)s.%(ext)s
になります。%(title)s - %(section_number)s %(section_title)s.%(ext)s
になります。%(playlist_title)s/%(title)s.%(ext)s
になります。空の場合、 OUTPUT_TEMPLATE
が使用されます。true
の場合、「Strict Playlistモード」スイッチがデフォルトで有効になります。このモードでは、URLがプレイリストを厳密に指している場合にのみ、プレイリストがダウンロードされます。プレイリスト内のビデオへのURLは、ダイレクトビデオURLと同じように扱われます。デフォルトはfalse
になります。0
(制限なし)です。--recode-video
postprocessors
を介して指定する必要があります。また、ダッシュはアンダースコアに置き換えられていることに注意してください。YTDL_OPTIONS
にロードおよび使用されるJSONファイルへのパス。 YTDL_OPTIONS_FILE
とYTDL_OPTIONS
両方が指定されている場合、 YTDL_OPTIONS
のオプションが優先されることに注意してください。robots.txt
ファイルへのパスYTDL_OPTIONS
の次の例値は、英語の字幕と章マーカー(それらを持つビデオ用)を埋め込み、ダウンロードされたビデオのアクセス許可を変更し、ファイル変更タイムスタンプをダウンロードされた日付まで設定します。
environment :
- ' YTDL_OPTIONS={"writesubtitles":true,"subtitleslangs":["en","-live_chat"],"updatetime":false,"postprocessors":[{"key":"Exec","exec_cmd":"chmod 0664","when":"after_move"},{"key":"FFmpegEmbedSubtitle","already_have_subtitle":false},{"key":"FFmpegMetadata","add_chapters":true}]} '
OUTPUT_TEMPLATE
セットの次の例値:
environment :
- ' OUTPUT_TEMPLATE=%(playlist_title&Playlist |)S%(playlist_title|)S%(playlist_uploader& by |)S%(playlist_uploader|)S%(playlist_autonumber& - |)S%(playlist_autonumber|)S%(playlist_count& of |)S%(playlist_count|)S%(playlist_autonumber& - |)S%(uploader,creator|UNKNOWN_AUTHOR)S - %(title|UNKNOWN_TITLE)S - %(release_date>%Y-%m-%d,upload_date>%Y-%m-%d|UNKNOWN_DATE)S.%(ext)s '
たとえば、制限付きビデオやプライベートビデオをダウンロードするなど、計量でブラウザのCookieを使用する必要がある場合に備えてください。
volumes :
- /path/to/cookies:/cookies
environment :
- YTDL_OPTIONS={"cookiefile":"/cookies/cookies.txt"}
cookies.txt
名前を変更しますブラウザ拡張機能により、右クリックしてビデオを直接送信できます。 httpsページを使用している場合は、拡張機能が機能するには、HTTPS逆プロキシ(以下を参照)の背後にある必要があることに注意してください。
Chrome: RPSLによる寄稿。 Google Chrome Webstoreからインストールするか、開発者モードを使用してソースからインストールできます。
Firefox: Nanocortexが寄付しました。 Firefoxアドオンからインストールしたり、こちらからソースを取得したりできます。
Rithaskは、SAFARIからURLをメチューブに送信するためのiOSショートカットを作成しました。最初は、サーバーアドレスとポートを入力する必要がありますが、その後、保存され、Safariの共有メニューからショートカットを実行できます。アドレスには、デフォルトの80/443でない場合は、プロトコル(http/https)とポートを含める必要があります。例:https: https://metube.example.com
またはhttp://192.168.1.1:8081
。ショートカットはここにあります。
iOSにはビデオファイルの厳しい要件があり、MP4コンテナのH264またはH265ビデオコーデックとAACオーディオコーデックが必要です。これは、利用可能な最高品質よりも低品質になる場合があります。 iOS要件に対応するには、MP4形式をダウンロードするときに「Best(iOS)」を選択して、IOS要件と可能な限り互換性のある最高品質の形式を取得できます。
Kushfestは、現在開いているWebページをMetubeに送信するためのChromeブックマークレットを作成しました。 HTTPSページを使用している場合は、環境でtrue
としてHTTPS
で設定するか、ブックマークレットが動作するためにHTTPS逆プロキシ(以下を参照)の背後にある必要があることに注意してください。
GitHubはJavaScriptをリンクとして埋め込むことを許可していないため、ブックマークバーに作成した新しいブックマークに次のコードをコピーすることにより、ブックマークレットを手動で作成する必要があります。以下のURLのホスト名を変更して、Metubeインスタンスを指します。
javascript: ! function ( ) { xhr = new XMLHttpRequest ( ) ; xhr . open ( "POST" , "https://metube.domain.com/add" ) ; xhr . withCredentials = true ; xhr . send ( JSON . stringify ( { "url" : document . location . href , "quality" : "best" } ) ) ; xhr . onload = function ( ) { if ( xhr . status == 200 ) { alert ( "Sent to metube!" ) } else { alert ( "Send to metube failed. Check the javascript console for clues." ) } } } ( ) ;
Shoonya75はFirefoxバージョンに貢献しました。
javascript: ( function ( ) { xhr = new XMLHttpRequest ( ) ; xhr . open ( "POST" , "https://metube.domain.com/add" ) ; xhr . send ( JSON . stringify ( { "url" : document . location . href , "quality" : "best" } ) ) ; xhr . onload = function ( ) { if ( xhr . status == 200 ) { alert ( "Sent to metube!" ) } else { alert ( "Send to metube failed. Check the javascript console for clues." ) } } } ) ( ) ;
上記のブックマークは、成功/失敗通知としてalert()
使用しています。以下には、代わりにトーストメッセージが表示されます。
クロム:
javascript: ! function ( ) { function notify ( msg ) { var sc = document . scrollingElement . scrollTop ; var text = document . createElement ( 'span' ) ; text . innerHTML = msg ; var ts = text . style ; ts . all = 'revert' ; ts . color = '#000' ; ts . fontFamily = 'Verdana, sans-serif' ; ts . fontSize = '15px' ; ts . backgroundColor = 'white' ; ts . padding = '15px' ; ts . border = '1px solid gainsboro' ; ts . boxShadow = '3px 3px 10px' ; ts . zIndex = '100' ; document . body . appendChild ( text ) ; ts . position = 'absolute' ; ts . top = 50 + sc + 'px' ; ts . left = ( window . innerWidth / 2 ) - ( text . offsetWidth / 2 ) + 'px' ; setTimeout ( function ( ) { text . style . visibility = "hidden" ; } , 1500 ) ; } xhr = new XMLHttpRequest ( ) ; xhr . open ( "POST" , "https://metube.domain.com/add" ) ; xhr . send ( JSON . stringify ( { "url" : document . location . href , "quality" : "best" } ) ) ; xhr . onload = function ( ) { if ( xhr . status == 200 ) { notify ( "Sent to metube!" ) } else { notify ( "Send to metube failed. Check the javascript console for clues." ) } } } ( ) ;
Firefox:
javascript: ( function ( ) { function notify ( msg ) { var sc = document . scrollingElement . scrollTop ; var text = document . createElement ( 'span' ) ; text . innerHTML = msg ; var ts = text . style ; ts . all = 'revert' ; ts . color = '#000' ; ts . fontFamily = 'Verdana, sans-serif' ; ts . fontSize = '15px' ; ts . backgroundColor = 'white' ; ts . padding = '15px' ; ts . border = '1px solid gainsboro' ; ts . boxShadow = '3px 3px 10px' ; ts . zIndex = '100' ; document . body . appendChild ( text ) ; ts . position = 'absolute' ; ts . top = 50 + sc + 'px' ; ts . left = ( window . innerWidth / 2 ) - ( text . offsetWidth / 2 ) + 'px' ; setTimeout ( function ( ) { text . style . visibility = "hidden" ; } , 1500 ) ; } xhr = new XMLHttpRequest ( ) ; xhr . open ( "POST" , "https://metube.domain.com/add" ) ; xhr . send ( JSON . stringify ( { "url" : document . location . href , "quality" : "best" } ) ) ; xhr . onload = function ( ) { if ( xhr . status == 200 ) { notify ( "Sent to metube!" ) } else { notify ( "Send to metube failed. Check the javascript console for clues." ) } } } ) ( ) ;
DOTVHSは、Raycastから直接Metubeにビデオを追加できるRaycast用の拡張機能を作成しました。
HTTPSモードでリッスンするようにMetubeを構成することができます。 docker-compose
例:
services :
metube :
image : ghcr.io/alexta69/metube
container_name : metube
restart : unless-stopped
ports :
- " 8081:8081 "
volumes :
- /path/to/downloads:/downloads
- /path/to/ssl/crt:/ssl/crt.pem
- /path/to/ssl/key:/ssl/key.pem
environment :
- HTTPS=true
- CERTFILE=/ssl/crt.pem
- KEYFILE=/ssl/key.pem
認証をサポートするために、逆プロキシの背後にメチューブを実行することもできます。この方法でHTTPSサポートも追加できます。
URLを再マップするリバースプロキシの背後で実行する場合(つまり、ルートではなくサブディレクトリの下で予測を提供します)、url_prefix環境変数を正しい値に設定することを忘れないでください。
リバースプロキシニーズにLinuxServer/Swag画像を使用している場合(心からお勧めします)、構成ボリュームのnginx/proxy-confs
ディレクトリの下でサブフォルダーモードとサブドメインモードの両方で指標をプロキシする準備ができたスニペットが含まれています。また、認証に使用できるAutheliaも含まれています。
location /metube/ {
proxy_pass http://metube:8081;
proxy_http_version 1.1 ;
proxy_set_header Upgrade $http_upgrade ;
proxy_set_header Connection "upgrade" ;
proxy_set_header Host $host ;
}
注:websocketを機能させるために、追加のproxy_set_header
ディレクティブがあります。
pie-ytが貢献しました。こちらのソース。
# For putting in your Apache sites site.conf
# Serves MeTube under a /metube/ subdir (http://yourdomain.com/metube/)
< Location /metube/>
ProxyPass http://localhost:8081/ retry=0 timeout=30
ProxyPassReverse http://localhost:8081/
</ Location >
< Location /metube/socket.io>
RewriteEngine On
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:8081/socket.io/$1 [P,L]
ProxyPass http://localhost:8081/socket.io retry=0 timeout=30
ProxyPassReverse http://localhost:8081/socket.io
</ Location >
次の例CaddyFileは、Caddyの後ろに逆プロキシを取得します。
example.com {
route /metube/* {
uri strip_prefix metube
reverse_proxy metube :8081
}
}
実際のビデオダウンロードをメサブで動作させるエンジンはYT-DLPです。ビデオサイトは定期的にレイアウトを変更するため、YT-DLPの頻繁な更新が必要です。
YT-DLPの新しいバージョンを探す自動夜間の計量があり、存在する場合、ビルドはそれを引いて更新されたDocker画像を公開します。したがって、変更に対応するために、最新の画像を使用して定期的に予定コンテナを更新することをお勧めします。
この目的のために、ものみをインストールしてセットアップすることをお勧めします。
質問をしたり、計量の問題を提出する前に、メチューブはYT-DLPのUIにすぎないことを覚えておいてください。ビデオWebサイトへの認証、ポストプロセス、許可、機能しないと思われるその他のYTDL_OPTIONS
構成、または基礎となるYT-DLPライブラリの仕組みに関係する他の問題では、メチューブプロジェクトで開かれることはありません。それらをデバッグしてトラブルシューティングするために、最初にYT-DLPバイナリを直接使用し、UIをバイパスし、それが機能したら、 YTDL_OPTIONS
に機能するオプションをインポートすることをお勧めします。
YT-DLPコマンドを直接テストするには、ダウンロードしてローカルで実行するか、実際の条件をより適切にシミュレーションするために、メサブコンテナ自体で実行できます。計量コンテナがmetube
と呼ばれると仮定すると、Dockerホストで以下を実行して、コンテナ内にシェルを取得します。
docker exec -ti metube sh
cd /downloads
そこに着いたら、YT-DLPコマンドを自由に使用できます。
予定開発は、コミュニティによるコードへの貢献に依存しています。現在は私自身のユースケースに適合しているため、このプログラムは私が懸念している限り、機能を完全に把握しています。ユースケースが異なり、追加機能が必要な場合は、これらの機能を実装するPRをお気軽に送信してください。膨満感を減らすために、一部のPRが受け入れられない可能性があるため、計画された実装について議論するために最初に問題を作成することをお勧めします。ただし、機能を実装しない場合は機能要求を開くと、リクエストが満たされることはめったにありません。
Node.jsとPython 3.11がインストールされていることを確認してください。
cd metube/ui
# install Angular and build the UI
npm install
node_modules/.bin/ng build
# install python dependencies
cd ..
pip3 install pipenv
pipenv install
# run
pipenv run python3 app/main.py
Docker画像はローカルで構築できます(UIも構築されます):
docker build -t metube .