6 puntos por GN⁺ 2024-07-30 | 1 comentarios | Compartir por WhatsApp
  • 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
      1. Opciones globales: valores predeterminados para todas las descargas
      2. Presets: grupos de opciones con nombre que se eligen por descarga en la UI
      3. 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

 
GN⁺ 2024-07-30
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/

    • Estuve viendo TubeArchivist y no me gustó que requiera 3 contenedores. Luego encontré Pinchflat en el subreddit selfhosted; funciona con un solo contenedor, fue fácil de desplegar y hasta ahora anda bien.
      https://github.com/kieraneglin/pinchflat
    • Prefiero evitar esto. La forma de nombrar archivos depende del supuesto de que existe una base de datos.
      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-dlp con una configuración y scripts inteligentes hace mejor el trabajo de archivado.
    • Google no va a hacer que sus productos sean cómodos de usar de forma estructurada y avanzada. Ese enfoque favorece demasiado al usuario y le entrega demasiado control. A Google no le gusta eso.
    • También hay otra opción que apareció hoy más temprano en la portada: Yark: YouTube Archiver with Offline UI
      https://news.ycombinator.com/item?id=41100820
    • Hace tiempo que pienso en pasarme a Tube Archivist, pero tengo varios TB de videos de YouTube reunidos con TubeSync y no quiero volver a descargarlos.
      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.

    • ¿Eso no se resuelve con las suscripciones de YouTube? Si te suscribes a esos 100 canales y marcas la página de suscripciones, tienes un feed priorizado con solo lo que quieres ver.
      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.
    • NewPipe encaja muy bien para este uso. Si quitas la columna “Default Kiosk” del contenido de la página principal y dejas solo “What's New”, puedes ver únicamente los videos de los canales a los que estás suscrito. Las suscripciones de NewPipe no están integradas en absoluto con una cuenta de Google.
    • Tengo entendido que YouTube todavía usa RSS. Podrías probar eso.
    • Uso Invidious para esto. Me gusta porque tiene un feed priorizado solo de suscripciones.
      La capacidad de descubrimiento no es buena, pero si ese no es el caso de uso que necesitas, vale la pena echarle un vistazo.
    • Hay una extensión llamada fraidycat que uso exactamente para hacer eso.
      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-dlp y pensé en crear una app sencilla. ¿Vale la pena intentarlo? ¿Ya existen alternativas de este tipo?

    • Si quieres, un dispositivo Windows/Linux/OSX, o una máquina virtual/contenedor encima de él, puede ser el servidor. Así, quienes lo desarrollan no necesitan crear por separado una UX web y una UX nativa
      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 quieres
    • Celluloid usa automáticamente yt-dlp para hacer streaming cuando le pides abrir una URL compatible. Parabolic es una herramienta dedicada de descarga que usa yt-dlp
      https://flathub.org/apps/details/io.github.celluloid_player....
      https://flathub.org/apps/org.nickvision.tubeconverter
    • Si solo descargas videos de YouTube, ni siquiera necesitas necesariamente 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 perfectamente
      Lo que nadie menciona es que yt-dlp ya no puede descargar itag 22, y itag 18 tiene límite de velocidad. Por eso yt-dlp tiene que bajar por separado los archivos de audio y video y luego unirlos con ffmpeg
      Los 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
    • También está Freetube
      https://freetubeapp.io/
    • Puede que quieras descargar y guardar los videos en un NAS o servidor doméstico, no en el dispositivo que estás usando ahora
      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-dlp y luego hacer streaming por Jellyfin sin anuncios

    • Yo lo uso casi así, solo que el paso de yt-dlp es manual. Un plugin de Jellyfin sería excelente
  • Bastante genial. Ahora uso https://cobalt.tools y también está bien

    • Perfecto. Tiene una opción para descargar el formato de audio original de YouTube sin transcodificarlo a mp3
  • 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

    • Hay varias razones para descargar o archivar en lugar de hacer streaming desde YouTube
      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
    • Para mí es por la misma razón por la que la gente usaba VCR. No es “infracción de copyright”, sino guardar algo para verlo después o cuando no hay conexión a internet, o cuando esta es lenta
      La mayoría de lo que descargo lo veo una vez y lo borro
    • En la red doméstica de mis hijos bloqueo YouTube y en su lugar les doy acceso a DadTube, seleccionado por mí
    • Dices que te sorprende que existan herramientas así, pero tú mismo das la razón más importante por la que deben existir
      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
    • Es por los límites de uso de ancho de banda. Si quieres poner en repetición la misma playlist de videos musicales, consume bastante de tu cuota
  • Relacionado: Yark: YouTube Archiver with Offline UI
    https://news.ycombinator.com/item?id=41100820

  • Si se envolviera uno de los servidores basados en yt-dlp con 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?