NOTA: As construções de braço de 32 bits foram aposentadas (um ano inteiro depois de outros grandes jogadores), pois as novas versões de nó não as suportam, e as atualizações e dependências de segurança contínuas exigem novas versões de nó. Migre para um sistema operacional de 64 bits para continuar recebendo atualizações do Metube.
Web GUI para YouTube-DL (usando o garfo YT-DLP) com suporte à lista de reprodução. Permite baixar vídeos do YouTube e dezenas de outros sites.
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
Certos valores podem ser definidos por meio de variáveis de ambiente, usando o parâmetro -e
na linha de comando do docker ou na environment:
seção em Docker -Compose.
1000
.1000
.022
.light
, dark
ou auto
. Padrões para auto
./downloads
na imagem do Docker e .
de outra forma.DOWNLOAD_DIR
.true
, o download dirs ( download_dir e audio_download_dir ) são indexíveis no servidor da web. Padrões para false
.true
.true
./downloads/.metube
na imagem do docker e .
de outra forma./downloads
na imagem do Docker e .
de outra forma.tmpfs
) para melhor desempenhotrue
, os arquivos baixados são excluídos no servidor, quando são destruídos na seção "concluída" da interface do usuário. Padrões para false
./
.https
em vez de http
( CertFile e KeyFile necessário). Padrões para false
.%(title)s.%(ext)s
.%(title)s - %(section_number)s %(section_title)s.%(ext)s
.%(playlist_title)s/%(title)s.%(ext)s
. Quando vazio, então OUTPUT_TEMPLATE
é usado.true
, o comutador "Strict Playlist Mode" será ativado por padrão. Nesse modo, as listas de reprodução serão baixadas apenas se o URL apontar estritamente para uma lista de reprodução. Os URLs para vídeos dentro de uma lista de reprodução serão tratados iguais ao URL de vídeo direto. Padrões para false
.0
(sem limite).--recode-video
deve ser especificado por meio de postprocessors
. Observe também que os traços são substituídos por sublinhados.YTDL_OPTIONS
acima. Observe que, se ambas YTDL_OPTIONS_FILE
e YTDL_OPTIONS
forem especificadas, as opções em YTDL_OPTIONS
terão precedência.robots.txt
montado no contêiner O valor de exemplo a seguir para YTDL_OPTIONS
incorpora legendas em inglês e marcadores de capítulos (para vídeos que os possuem) e também altera as permissões no vídeo baixado e define o registro de data e hora de modificação de arquivos para a data de quando foi baixado:
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}]} '
O valor de exemplo a seguir para os conjuntos de 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 '
Caso você precise usar os cookies do seu navegador com o Metube, por exemplo, para baixar vídeos restritos ou privados:
volumes :
- /path/to/cookies:/cookies
environment :
- YTDL_OPTIONS={"cookiefile":"/cookies/cookies.txt"}
cookies.txt
As extensões do navegador permitem clicar com o botão direito do mouse e enviando-as diretamente ao Metube. Observe que, se você estiver em uma página HTTPS, a instância do Metube deve estar por trás de um proxy reverso HTTPS (veja abaixo) para que as extensões funcionem.
Chrome: Contribuído por RPSL. Você pode instalá -lo no Google Chrome WebStore ou usar o modo desenvolvedor e instalar de fontes.
Firefox: Contribuído pelo Nanocórtex. Você pode instalá -lo a partir de addons do Firefox ou obter fontes daqui.
Rithask criou um atalho para iOS para enviar o URL para o Metube a partir do Safari. Inicialmente, você precisará inserir o endereço e a porta do servidor, mas depois disso, ele será salvo e você poderá executar o atalho no menu de compartilhamento no Safari. O endereço deve incluir o protocolo (http/https) e a porta, se não for o 80/443 padrão. Por exemplo: https://metube.example.com
ou http://192.168.1.1:8081
. O atalho pode ser encontrado aqui.
O iOS possui requisitos rígidos para arquivos de vídeo, exigindo o codec de vídeo H264 ou H265 e o codec de áudio AAC no contêiner MP4. Às vezes, isso pode ser uma qualidade mais baixa do que a melhor qualidade disponível. Para acomodar os requisitos do iOS, ao baixar um formato MP4, você pode escolher "Best (iOS)" para obter os formatos de melhor qualidade o mais compatível possível com os requisitos do iOS.
A Kushfest criou um Bookmarklet Chrome para enviar a página da web atualmente aberta ao Metube. Observe que, se você estiver em uma página HTTPS, a instância do Metube deve ser configurada com HTTPS
como true
no ambiente ou estar por trás de um proxy reverso HTTPS (veja abaixo) para o Bookmarklet funcionar.
O GitHub não permite incorporar o JavaScript como um link, portanto o Bookmarklet deve ser criado manualmente copiando o código a seguir para um novo marcador que você cria em sua barra de favoritos. Altere o nome do host no URL abaixo para apontar para a instância do 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 contribuiu com uma versão do 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." ) } } } ) ( ) ;
Os Bookmarklets acima usam alert()
como uma notificação de sucesso/falha. O seguinte mostrará uma mensagem de brinde:
Cromo:
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." ) } } } ) ( ) ;
O DOTVHS criou uma extensão para o Raycast que permite adicionar vídeos ao Metube diretamente do Raycast.
É possível configurar o Metube para ouvir no modo HTTPS. Exemplo 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
Também é possível executar o Metube por trás de um proxy reverso, a fim de apoiar a autenticação. O suporte HTTPS também pode ser adicionado dessa maneira.
Ao correr atrás de um proxy reverso que remapeia o URL (ou seja, serve o Metube sob um subdiretório e não está em raiz), não se esqueça de definir a variável de ambiente URL_Prefix para o valor correto.
Se você estiver usando a imagem do LinuxServer/Swag para suas necessidades de proxy reversa (que eu posso recomendar com entusiasmo), ela já inclui trechos prontos para o Metube proxying nos modos Subpasta e Subdomínio no diretório nginx/proxy-confs
no volume de configuração. Também inclui a Authelia, que pode ser usada para autenticação.
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 ;
}
Nota: as diretivas extra proxy_set_header
estão lá para fazer o WebSocket funcionar.
Contribuído por Pie-Yt. Fonte aqui.
# 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 >
O exemplo a seguir, o CaddyFile recebe um proxy reverso atrás do Caddy.
example.com {
route /metube/* {
uri strip_prefix metube
reverse_proxy metube :8081
}
}
O mecanismo que alimenta os downloads de vídeo real no Metube é YT-DLP. Como os sites de vídeo alteram regularmente seus layouts, são necessárias atualizações frequentes do YT-DLP para acompanhar.
Há uma construção noturna automática do Metube que procura uma nova versão do YT-DLP e, se houver, a compilação o puxa e publica uma imagem atualizada do Docker. Portanto, para acompanhar as alterações, é recomendável que você atualize seu contêiner Metube regularmente com a imagem mais recente.
Eu recomendo instalar e configurar a Torre de Vigia para esse fim.
Antes de fazer uma pergunta ou enviar um problema para o Metube, lembre-se de que o Metube é apenas uma interface do usuário do YT-DLP. Quaisquer problemas que você possa estar enfrentando com autenticação em sites de vídeo, pós-processamento, permissões, outras configurações YTDL_OPTIONS
que parecem não funcionar, ou qualquer outra coisa que preocupe o funcionamento da biblioteca YT-DLP subjacente, não precisa ser aberta no projeto Metube. Para depurar e solucioná-los, é recomendável tentar usar o binário YT-DLP diretamente primeiro, ignorando a interface do usuário e, uma vez que isso está funcionando, importando as opções que funcionaram para você para YTDL_OPTIONS
.
Para testar diretamente o comando yt-dlp, você pode baixá-lo e executá-lo localmente ou para uma melhor simulação de suas condições reais, você pode executá-lo no próprio contêiner Metube. Supondo que o seu recipiente do Metube seja chamado metube
, execute o seguinte no host do Docker para obter uma concha dentro do contêiner:
docker exec -ti metube sh
cd /downloads
Uma vez lá, você pode usar o comando yt-dlp livremente.
O desenvolvimento do Metube depende de contribuições de código da comunidade. O programa como atualmente se encaixa nos meus próprios casos de uso e, portanto, é preenchido com recursos, no que me diz respeito. Se seus casos de uso forem diferentes e exigirem recursos adicionais, sinta -se à vontade para enviar os PRs que implementam esses recursos. É aconselhável criar um problema primeiro para discutir a implementação planejada, porque em um esforço para reduzir o inchaço, alguns PRs podem não ser aceitos. No entanto, observe que a abertura de uma solicitação de recurso quando você não pretende implementar o recurso raramente resultará na solicitação atendida.
Verifique se você tem Node.js e Python 3.11 instalados.
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
Uma imagem do Docker pode ser construída localmente (ela também construirá a interface do usuário):
docker build -t metube .