- MeTube es una interfaz web autoalojada para
yt-dlp que permite descargar medios desde YouTube y decenas de sitios compatibles directamente desde el navegador
- Soporta la descarga de video, audio, subtítulos y miniaturas, y también permite bajar playlists y canales ajustando el formato de salida y las opciones de descarga
- Puedes suscribirte a canales y playlists para revisar periódicamente si hay elementos nuevos y poner automáticamente las subidas nuevas en la cola
- Se ejecuta con Docker o docker-compose, y configura mediante variables de entorno opciones como la cantidad de descargas simultáneas, la ruta de almacenamiento, la plantilla de nombre de archivo, HTTPS, CORS, tema y nivel de logs
- Las opciones de
yt-dlp se combinan en el orden de opciones globales, presets y overrides por descarga; como los overrides por descarga permiten ingresar opciones arbitrarias, solo deben habilitarse en un entorno de confianza
Qué hace MeTube
- MeTube es una interfaz web autoalojada basada en
yt-dlp
- Permite descargar medios desde YouTube y decenas de sitios compatibles con
yt-dlp
- Sus funciones principales son las siguientes
- Descargar video, audio, subtítulos y miniaturas desde la interfaz del navegador
- Descargar playlists y canales
- Configurar la ruta de salida y las opciones de descarga
- Suscribirse a canales y playlists para revisar periódicamente si hay contenido nuevo
- Agregar automáticamente subidas nuevas a la cola de descarga
Cómo se ejecuta
- Puede ejecutarse directamente con Docker
docker run -d -p 8081:8081 -v /path/to/downloads:/downloads ghcr.io/alexta69/metube
- El ejemplo con docker-compose usa la imagen
ghcr.io/alexta69/metube y monta /downloads del contenedor en el directorio de descargas del host
services:
metube:
image: ghcr.io/alexta69/metube
container_name: metube
restart: unless-stopped
ports:
- "8081:8081"
volumes:
- /path/to/downloads:/downloads
Configuración de descargas y almacenamiento
- MAX_CONCURRENT_DOWNLOADS limita la cantidad de descargas que pueden ejecutarse al mismo tiempo, y su valor predeterminado es
3
- Si DELETE_FILE_ON_TRASHCAN está en
true, al enviar un elemento a la papelera desde la sección “Completed” de la UI también se elimina el archivo descargado en el servidor
- DEFAULT_OPTION_PLAYLIST_ITEM_LIMIT define la cantidad máxima de elementos descargables de una playlist; el valor predeterminado
0 significa sin límite
- Los valores predeterminados relacionados con suscripciones también se ajustan mediante variables de entorno
- SUBSCRIPTION_DEFAULT_CHECK_INTERVAL: intervalo de revisión automática por suscripción, por defecto
60 minutos
- SUBSCRIPTION_SCAN_PLAYLIST_END: cantidad máxima de elementos de playlist o canal a recuperar al revisar una suscripción, por defecto
50
- SUBSCRIPTION_MAX_SEEN_IDS: límite superior de IDs de video almacenados por suscripción, por defecto
50000
- DOWNLOAD_DIR es la ruta donde se guardan las descargas; en la imagen de Docker el valor predeterminado es
/downloads
- Las descargas solo de audio pueden usar una ruta separada mediante AUDIO_DOWNLOAD_DIR
- Con CUSTOM_DIRS y CREATE_CUSTOM_DIRS puedes elegir subdirectorios de descarga desde la UI o hacer que se creen automáticamente
- En STATE_DIR se guardan archivos de estado persistente como
queue.json, pending.json, completed.json y subscriptions.json
- TEMP_DIR es la ruta para archivos temporales de descarga; usar un SSD o un sistema de archivos en RAM puede ayudar al rendimiento, pero un sistema de archivos en RAM puede impedir reanudar descargas
Nombre de archivos y opciones de yt-dlp
- OUTPUT_TEMPLATE es la plantilla de nombre de archivo para las descargas, y su valor predeterminado es
%(title)s.%(ext)s
- Se pueden configurar por separado plantillas para descargas de capítulos, playlists y canales
-
OUTPUT_TEMPLATE_CHAPTER
-
OUTPUT_TEMPLATE_PLAYLIST
- OUTPUT_TEMPLATE_CHANNEL
- Las opciones de
yt-dlp se definen como un objeto JSON
- La jerarquía de opciones se aplica de lo más general a lo más específico
- Opciones globales: valores predeterminados para todas las descargas
- Presets: grupos de opciones con nombre que se eligen por descarga en la UI
- Overrides por descarga: opciones de entrada libre que se aplican solo a una descarga específica
- Si hay claves en conflicto, tiene prioridad la configuración más específica
- Los overrides por descarga tienen prioridad sobre los presets
- Los presets tienen prioridad sobre las opciones globales
- Si en el JSON el valor de una opción se establece en
null, esa opción se elimina para esa descarga
YTDL_OPTIONS_FILE y YTDL_OPTIONS_PRESETS_FILE monitorean cambios en los archivos y los recargan automáticamente, por lo que no hace falta reiniciar el contenedor
- Si usas archivos y variables de entorno al mismo tiempo y defines la misma clave o el mismo nombre de preset, la configuración del archivo tiene prioridad
Presets y overrides
- Los presets aparecen en “Option Presets”, debajo de Advanced Options en la UI
- Los presets de ejemplo realizan las siguientes tareas
- sponsorblock: elimina segmentos de sponsor, selfpromo e interaction
- embed-subs: descarga subtítulos en inglés y alemán y los incrusta en el archivo de video
- limit-rate: limita la velocidad de descarga a aproximadamente 5 MB/s
- Si seleccionas varios presets, se aplican en orden, y en caso de repetir una misma opción, el preset posterior sobrescribe al anterior
- Si configuras ALLOW_YTDL_OPTIONS_OVERRIDES en
true, aparecerá en la UI un campo JSON de entrada libre llamado “Custom yt-dlp Options”
- Los overrides por descarga están deshabilitados de forma predeterminada
- Si activas esta función, cualquier persona con acceso a la UI podrá pasar opciones arbitrarias de la API de
yt-dlp, y según las opciones podría ser posible ejecutar comandos arbitrarios dentro del contenedor, por lo que solo debe habilitarse en un entorno de confianza
- MeTube fuerza su propio comportamiento de
extract_flat y noplaylist durante la etapa inicial de obtención de metadatos, y los presets no pueden sobrescribir esas claves en esta etapa
Cookies, integración con navegador y ejecuciones rápidas
- Cuando necesitas descargar videos restringidos o privados, puedes usar cookies del navegador
- Exporta las cookies como
cookies.txt con una extensión de Firefox o Chrome
- Súbelas con Upload Cookies en Advanced Options de MeTube
- Elimina las cookies subidas con Delete Cookies en esa misma sección
- Las extensiones del navegador permiten enviar directamente un video a MeTube con clic derecho
- Para usarlo en páginas HTTPS, la instancia de MeTube debe estar detrás de un proxy inverso HTTPS
- Como la extensión hace solicitudes desde orígenes
chrome-extension://... o moz-extension://..., se requiere la configuración CORS_ALLOWED_ORIGINS=*
- La extensión de Chrome puede instalarse desde Google Chrome Webstore o desde el código fuente
- La extensión de Firefox puede instalarse desde Firefox Addons o usar el código fuente
- El Shortcut de iOS permite enviar una URL a MeTube desde el menú de compartir de Safari
- El bookmarklet envía a MeTube la página web actualmente abierta, y en páginas HTTPS MeTube debe estar configurado con HTTPS o detrás de un proxy inverso HTTPS
- Como el bookmarklet envía solicitudes cross-origin desde el origen de la página actual hacia MeTube, debes agregar los orígenes de los sitios que vayas a usar en CORS_ALLOWED_ORIGINS
- La extensión de MeTube para Raycast permite agregar videos directamente desde Raycast
Servidor web, HTTPS y proxy inverso
- La configuración relacionada con el servidor web se ajusta con variables de entorno
- HOST tiene como valor predeterminado
0.0.0.0
- PORT tiene como valor predeterminado
8081
- URL_PREFIX se usa para despliegues en subruta detrás de un proxy inverso
- PUBLIC_HOST_URL y PUBLIC_HOST_AUDIO_URL cambian la URL base de los enlaces de descarga de archivos completados
- Si configuras HTTPS en
true y defines CERTFILE y KEYFILE, MeTube se ejecutará en modo HTTPS
- El proxy inverso puede usarse para terminación HTTPS o autenticación
- La imagen
linuxserver/swag incluye fragmentos de configuración de subfolder y subdomain para MeTube, además de configuración de autenticación con Authelia
- El ejemplo de NGINX hace proxy de la ruta
/metube/ hacia http://metube:8081 y configura los encabezados Upgrade y Connection para que WebSocket funcione correctamente
- También se proporcionan ejemplos de proxy inverso para Apache y Caddy
Actualizaciones, solución de problemas y desarrollo local
- MeTube depende de yt-dlp, y como los sitios de video cambian de diseño con frecuencia,
yt-dlp necesita actualizaciones frecuentes
- Cuando sale una nueva versión estable de
yt-dlp, se publica automáticamente una nueva imagen Docker de MeTube
- Puedes usar watchtower para mantener el contenedor actualizado
- Si quieres seguir el canal nightly de
yt-dlp, configura YTDL_NIGHTLY_UPDATE_TIME con la hora en formato HH:MM en la que se hará la actualización diaria y el reinicio de MeTube
- Para problemas de autenticación, posprocesamiento, permisos o
YTDL_OPTIONS, se recomienda primero depurar directamente en yt-dlp y luego llevar a MeTube las opciones que sí funcionen
- Para compilar y ejecutar localmente se necesitan Node.js 22+ y Python 3.13
- La UI se compila con
pnpm, las dependencias de Python se instalan con uv sync y luego se ejecuta con uv run python3 app/main.py
- La imagen Docker puede compilarse localmente con
docker build -t metube ., y en este proceso también se compila la UI
1 comentarios
Opiniones de Hacker News
También vale la pena considerar Tube Archivist. Es demasiado si solo quieres bajar unos cuantos videos, pero lo uso para conservar e indexar mis canales de tecnología favoritos.
Permite buscar en todo el texto y los metadatos, no solo en transcripciones/subtítulos, sino también en comentarios, títulos y descripciones; frustrantemente, es mucho mejor que lo que ofrece Alphabet.
https://www.tubearchivist.com/
https://github.com/kieraneglin/pinchflat
Si fuera almacenamiento temporal, lo entendería, pero una herramienta que se autodenomina software de “archivo” debería asumir que quizá no sobreviva más que los datos que intenta preservar.
Me ilusioné porque parecía un clon de PeerTube con función de descarga, pero al ver el resultado se me pasó;
yt-dlpcon una configuración y scripts inteligentes hace mejor el trabajo de archivado.https://news.ycombinator.com/item?id=41100820
Por suerte tengo la cadena de formato que usé para guardar los nombres de archivo, y como TubeSync usa un backend con Django y PostgreSQL, quizá pueda vincularlos con los ID de YouTube. Aun así, la migración parece una pesadilla bastante grande.
Lo que de verdad quiero es un TiVo para YouTube.
Hay alrededor de 100 canales que sigo casi religiosamente, pero que suben contenido con poca frecuencia, y no quiero perderme nunca sus videos.
Tampoco quiero andar revisando en YouTube cientos de videos nuevos de canales que publican cuatro veces al día para encontrar el 1 o 2 que realmente quiero ver. Al final termino perdiéndomelos.
Me gustaría tener un feed priorizado con solo lo que realmente quiero o necesito ver, y sería todavía mejor si pudiera descargarlo todo y verlo por DLNA.
Hacer que no nos perdamos lo que nos gusta no es la forma en que opera YouTube. La forma de YouTube es hacer que veamos videos estirados de 3 minutos a 18–22 minutos, mientras nos ata la retroalimentación a la cara.
Si el problema es que no quieres crear una cuenta, está bien y NewPipe encaja bien, pero existe una página dedicada que muestra en orden cronológico los videos de los canales que elegiste; decir que “hacer que no nos perdamos lo que nos gusta no es la forma de YouTube” suena un poco raro.
La capacidad de descubrimiento no es buena, pero si ese no es el caso de uso que necesitas, vale la pena echarle un vistazo.
https://fraidyc.at/
Hay algo que no entiendo. ¿Por qué tiene que estar alojado en un servidor? ¿No bastaría con que fuera una app independiente que corra en Windows/Linux/mac?
Hace poco empecé a usar
yt-dlpy pensé en crear una app sencilla. ¿Vale la pena intentarlo? ¿Ya existen alternativas de este tipo?Mucha gente ejecuta apps autoalojadas en servidores externos, homelabs o una combinación de ambos, y configura esos recursos como una infraestructura con respaldos y demás. Si dejas la PC/laptop/tablet/teléfono como clientes o cachés relativamente simples, cuando se pierden o se dañan es fácil reemplazarlos: solo vuelves a traer el contenido local sincronizado con el servidor. Esa es una de las razones por las que este enfoque de autoalojamiento es popular
He visto algunas apps de escritorio que envuelven
yt-dlp. No las he usado directamente, así que no puedo hablar de su estabilidad o confiabilidad, pero si no quieres crear una nueva solo por diversión, conviene buscar primero. Puede que ya exista lo que quieresyt-dlppara hacer streaming cuando le pides abrir una URL compatible. Parabolic es una herramienta dedicada de descarga que usayt-dlphttps://flathub.org/apps/details/io.github.celluloid_player....
https://flathub.org/apps/org.nickvision.tubeconverter
yt-dlp. Se puede hacer con mucho menos código y complejidad; yo lo uso como un programa en C muy pequeño. Un pequeño script de shell también funciona perfectamenteLo que nadie menciona es que
yt-dlpya no puede descargar itag 22, y itag 18 tiene límite de velocidad. Por esoyt-dlptiene que bajar por separado los archivos de audio y video y luego unirlos conffmpegLos ingresos publicitarios de YouTube acaban de quedar por debajo de las estimaciones de consenso. La accesibilidad a los videos de YouTube podría empeorar en el futuro
Si no tienes la costumbre de elegir formatos específicos, probablemente no lo notes mucho. Por ejemplo, algunas personas usaron durante años solo itag 18 y 22
https://freetubeapp.io/
Una app web dockerizada es mucho más fácil de crear y mantener que clientes de escritorio/móviles separados para Windows, macOS, Android, iOS y Linux
Sería bueno tener una interfaz que se integre con Jellyfin. Algo como buscar en YouTube, descargar con
yt-dlpy luego hacer streaming por Jellyfin sin anunciosyt-dlpes manual. Un plugin de Jellyfin sería excelenteBastante genial. Ahora uso https://cobalt.tools y también está bien
Descubrí que Brave para iOS tiene un botón de playlist para descargar videos de YouTube y guardarlos en el dispositivo. Permite PiP y reproducción offline, y no tiene anuncios
Usa una licencia abierta basada en el backend iOS de Mozilla, y me pregunto por qué más apps no hacen esto. Encontraron la forma de que Apple lo aceptara, y el CEO incluso publicó aquí defendiendo que esa técnica era válida
En esencia, funciona solo después de cargar el video dentro del sitio web normal de YouTube, y es como un botón de modo lectura que aplica no solo a YouTube, sino a cualquier contenido de video
Me sorprende un poco que haya tantas herramientas para espejar YouTube. Si usan algo así, ¿cuál es la razón para descargar/archivar videos en lugar de simplemente hacer streaming desde YouTube?
Entiendo que a veces conviene archivarlos por si los eliminan de YouTube, pero en mi caso eso pasa muy rara vez. Veo el video y listo; si no puedo volver a verlo, no me importa demasiado
Primero, quitar los anuncios es una razón bastante importante para mucha gente
Segundo, como ya escribiste, si un video o incluso un canal entero desaparece por reclamos de copyright u otras denuncias, ya no se puede volver a reproducir por streaming. Dependiendo del contenido que vean, esto puede ser mucho más importante para algunas personas que para ti
Tercero, puedes descargarlos para reproducción offline. También se puede con la app oficial de YouTube, pero hay que pagar Premium, el precio parece excesivo y aun así sigue afectado por el problema de las eliminaciones
Cuarto, indexación local. Si quieres referenciar videos más tarde para volver a verlos o compartirlos, puede ser más cómodo organizarlos con tu propia estructura que mantener marcadores de la copia en YouTube o buscarlos cada vez
Puede ser una mezcla de esas razones, y seguramente hay otras que no estoy considerando o no recuerdo
La mayoría de lo que descargo lo veo una vez y lo borro
Además, a veces no se puede hacer streaming desde YouTube. Puede haberse caído internet, puede que estés con un plan móvil en el extranjero y salga caro, o quizá simplemente quieras eliminar esos anuncios horribles
Relacionado: Yark: YouTube Archiver with Offline UI
https://news.ycombinator.com/item?id=41100820
Si se envolviera uno de los servidores basados en
yt-dlpcon una herramienta de creación de imágenes muy simple, tipo Pi-hole y una app cliente de front-end decente para reproducción, creo que podría despegar mucho, igual que Pi-hole se difundió entre usuarios menos técnicos.La idea sería comprar una Raspberry Pi, grabar una imagen en una tarjeta microSD, elegir tus canales favoritos de YouTube e instalar la app cliente, y entonces todo tu contenido favorito de YouTube estaría disponible localmente y sin anuncios.
Por ahora uso TubeSync. Sus funciones son simples y tiene muchos bugs, pero para mí funciona lo suficientemente bien.
Lo único que necesito es suscribirme a canales o playlists, descargar los videos a una ruta específica y revisar una vez al día si hay contenido nuevo.
La única UX necesaria es la configuración de canales; después solo tiene que guardar los archivos y dejar que Plex se encargue. ¿Alguien conoce una mejor alternativa?