Nota: Las construcciones de ARM de 32 bits se han retirado (un año completo después de otros actores importantes), ya que las nuevas versiones de nodos no las admiten, y las actualizaciones y dependencias de seguridad continuas requieren nuevas versiones de nodos. Migra a un sistema operativo de 64 bits para continuar recibiendo actualizaciones de Metube.
Web GUI para YouTube-DL (usando la horquilla YT-DLP) con soporte de lista de reproducción. Le permite descargar videos de YouTube y docenas de otros sitios.
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
Ciertos valores se pueden establecer a través de variables de entorno, utilizando el parámetro -e
en la línea de comandos Docker, o la environment:
Sección en Docker -Compose.
1000
.1000
.022
.light
, dark
o auto
. El valor predeterminado a auto
./downloads
en la imagen de Docker, y .
de lo contrario.DOWNLOAD_DIR
.true
, los dirs de descarga ( download_dir y audio_download_dir ) son indexables en el servidor web. El valor predeterminado es false
.true
.true
./downloads/.metube
en la imagen de Docker, y .
de lo contrario./downloads
en la imagen de Docker, y .
de lo contrario.tmpfs
) para un mejor rendimientotrue
, los archivos descargados se eliminan en el servidor, cuando se basan en la sección "completada" de la interfaz de usuario. El valor predeterminado es false
./
.https
en lugar de http
(se requiere certfile y keyfile ). El valor predeterminado es false
.%(title)s.%(ext)s
.%(title)s - %(section_number)s %(section_title)s.%(ext)s
.%(playlist_title)s/%(title)s.%(ext)s
. Cuando está vacío, entonces se usa OUTPUT_TEMPLATE
.true
, el conmutador "Modo de lista de reproducción" "se habilitará de forma predeterminada. En este modo, las listas de reproducción se descargarán solo si la URL apunta estrictamente a una lista de reproducción. Las URL a los videos dentro de una lista de reproducción serán tratadas al igual que la URL de video directo. El valor predeterminado es false
.0
(sin límite).--recode-video
se debe especificar a través de postprocessors
. También tenga en cuenta que los guiones se reemplazan con subrayos.YTDL_OPTIONS
anterior. Tenga en cuenta que si se especifican tanto YTDL_OPTIONS_FILE
como YTDL_OPTIONS
, las opciones en YTDL_OPTIONS
tienen prioridad.robots.txt
montado en el contenedor El siguiente valor de ejemplo para YTDL_OPTIONS
incrusta subtítulos en inglés y marcadores de capítulos (para videos que los tienen), y también cambia los permisos en el video descargado y establece la marca de tiempo de modificación del archivo a la fecha de cuándo se descargó:
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}]} '
El siguiente valor de ejemplo para los conjuntos 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 '
En caso de que necesite usar las cookies de su navegador con Metube, por ejemplo para descargar videos restringidos o privados:
volumes :
- /path/to/cookies:/cookies
environment :
- YTDL_OPTIONS={"cookiefile":"/cookies/cookies.txt"}
cookies.txt
de archivo.txtLas extensiones del navegador permiten hacer clic derecho en videos y enviarlos directamente a Metube. Tenga en cuenta que si está en una página HTTPS, su instancia de Metube debe estar detrás de un proxy inverso HTTPS (ver más abajo) para que funcionen las extensiones.
Chrome: Contribuido por RPSL. Puede instalarlo desde Google Chrome WebStore o usar el modo de desarrollador e instalar desde fuentes.
Firefox: Contribuido por Nanocortex. Puede instalarlo desde complementos de Firefox o obtener fuentes desde aquí.
Rithask ha creado un atajo de iOS para enviar la URL a Metube desde Safari. Inicialmente, deberá ingresar la dirección y el puerto del servidor, pero después de eso, se guardará y puede ejecutar el acceso directo desde el menú Compartir en Safari. La dirección debe incluir el protocolo (http/https) y el puerto, si no es el 80/443 predeterminado. Por ejemplo: https://metube.example.com
o http://192.168.1.1:8081
. El atajo se puede encontrar aquí.
iOS tiene requisitos estrictos para archivos de video, que requieren códec de video H264 o H265 y códec de audio AAC en contenedor MP4. Esto a veces puede ser una calidad más baja que la mejor calidad disponible. Para acomodar los requisitos de iOS, al descargar un formato MP4, puede elegir "Best (iOS)" para obtener los mejores formatos de calidad lo más compatible posible con los requisitos de iOS.
Kushfest ha creado un Bookmarklet de Chrome para enviar la página web actualmente abierta a Metube. Tenga en cuenta que si se encuentra en una página HTTPS, su instancia de Metube debe configurarse con HTTPS
como true
en el entorno, o estar detrás de un proxy inverso HTTPS (ver más abajo) para que funcione Bookmarklet.
GitHub no permite incorporar a JavaScript como un enlace, por lo que el marcador debe crearse manualmente copiando el siguiente código a un nuevo marcador que cree en su barra de marcadores. Cambie el nombre de host en la URL a continuación para señalar su instancia de 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 ha contribuido con una versión de 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." ) } } } ) ( ) ;
Los Bookmarklets anteriores usan alert()
como una notificación de éxito/falla. Lo siguiente mostrará un mensaje de tostada en su lugar:
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." ) } } } ) ( ) ;
DOTVHS ha creado una extensión para Raycast que permite agregar videos a Metube directamente desde Raycast.
Es posible configurar Metube para escuchar en modo HTTPS. Ejemplo 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
También es posible ejecutar Metube detrás de un proxy inverso, para admitir la autenticación. El soporte HTTPS también se puede agregar de esta manera.
Cuando se ejecuta detrás de un proxy inverso que reasigna la URL (es decir, sirve a Metube en un subdirectorio y no bajo raíz), no olvide establecer la variable de entorno URL_PREFIX en el valor correcto.
Si está utilizando la imagen de LinuxServer/Swag para sus necesidades de proxy de reverso (lo que puedo recomendar sinceramente), ya incluye fragmentos listos para proxyer Metube tanto en los modos de subdirigencia como de subdominio en el directorio nginx/proxy-confs
en el volumen de configuración. También incluye Authelia que se puede utilizar para la autenticación.
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: Las directivas adicionales proxy_set_header
están ahí para hacer que WebSocket funcione.
Contribuido por Pie-Yt. Fuente aquí.
# 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 >
El siguiente ejemplo CaddyFile obtiene un proxy inverso detrás de Caddy.
example.com {
route /metube/* {
uri strip_prefix metube
reverse_proxy metube :8081
}
}
El motor que alimenta las descargas de video reales en Metube es YT-DLP. Dado que los sitios de video cambian regularmente sus diseños, se requieren actualizaciones frecuentes de YT-DLP para mantenerse al día.
Hay una compilación nocturna automática de Metube que busca una nueva versión de YT-DLP, y si existe, la compilación lo saca y publica una imagen de Docker actualizada. Por lo tanto, para mantenerse al día con los cambios, se recomienda actualizar su contenedor de metubos regularmente con la última imagen.
Recomiendo instalar y configurar Watchtower para este propósito.
Antes de hacer una pregunta o enviar un problema para Metube, recuerde que Metube es solo una interfaz de usuario para YT-DLP. Cualquier problema que pueda experimentar con la autenticación a los sitios web de video, el posprocesamiento, los permisos, otras configuraciones YTDL_OPTIONS
que parecen no funcionar, o cualquier otra cosa que concierne al funcionamiento de la biblioteca YT-DLP subyacente, no es necesario abrir en el proyecto Metube. Para depurar y solucionarlos, se recomienda intentar usar el binario YT-DLP directamente primero, sin pasar por la interfaz de usuario, y una vez que está funcionando, importando las opciones que funcionaron para usted en YTDL_OPTIONS
.
Para probar directamente con el comando YT-DLP, puede descargarlo y ejecutarlo localmente, o para una mejor simulación de sus condiciones reales, puede ejecutarlo dentro del contenedor de Metube. Suponiendo que su contenedor de Metube se llama metube
, ejecute lo siguiente en su host de Docker para obtener un caparazón dentro del contenedor:
docker exec -ti metube sh
cd /downloads
Una vez allí, puede usar el comando YT-DLP libremente.
El desarrollo de Metube se basa en las contribuciones de código de la comunidad. El programa, tal como está actualmente, se ajusta a mis propios casos de uso y, por lo tanto, es completado en lo que a mí respecta. Si sus casos de uso son diferentes y requieren funciones adicionales, no dude en enviar PRS que implementen esas características. Es aconsejable crear un problema primero para discutir la implementación planificada, porque en un esfuerzo por reducir el hinchazón, algunos PR pueden no ser aceptados. Sin embargo, tenga en cuenta que abrir una solicitud de función cuando no tiene la intención de implementar la función rara vez dará como resultado que la solicitud se cumpla.
Asegúrese de tener Node.js y 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
Una imagen de Docker se puede construir localmente (también construirá la interfaz de usuario):
docker build -t metube .