Ejecutar yt-dlp en un VPS le da a las descargas largas una máquina que sigue en línea después de que cierres el portátil. También crea un camino limpio entre una descarga programada de un canal y una biblioteca multimedia que Jellyfin puede analizar.
El servidor cambia tres partes del flujo de trabajo: la instalación necesita las dependencias actuales de YouTube, los vídeos que exigen cuenta necesitan una transferencia segura de cookies y la automatización necesita un ritmo de peticiones deliberado. La configuración siguiente resuelve las tres sin dar por hecho que toda descarga necesita cookies, una interfaz web o un proveedor de PO Token.
TL;DR
- Instala yt-dlp en un entorno virtual de Python con ffmpeg, ffprobe, yt-dlp-ejs y un runtime de JavaScript compatible. Deno es el runtime que el proyecto recomienda ahora mismo.
- Empieza sin cookies de cuenta. Añádelas solo para listas privadas, vídeos con restricción de edad, contenido exclusivo para miembros u otro caso que exija cuenta.
- Mantén el comportamiento por defecto de yt-dlp con un solo fragmento hasta que tengas un motivo medido para cambiarlo. Usa las opciones de espera y horarios escalonados para reducir la presión de peticiones.
- La CLI pura más systemd es la configuración fiable más simple. Elige Pinchflat para reglas de canales sin intervención, MeTube para una cola desde el navegador, o Tube Archivist para una interfaz de visionado con búsqueda.
- Trata el almacenamiento como la variable principal de dimensionamiento. Prueba una muestra representativa antes de comprar capacidad de disco para un archivo completo.
Usa yt-dlp de forma responsable
Archiva contenido solo cuando tengas permiso y tu uso cumpla las condiciones de la plataforma y la ley aplicable.
- Buenos candidatos son tus propias subidas, el contenido de dominio público y el material cuyo titular de derechos ha autorizado la descarga.
- Una suscripción a YouTube Premium no concede por sí misma permiso para copiar vídeos fuera de las funciones que ofrece YouTube.
- Los permisos y restricciones de YouTube limitan la descarga y el acceso automatizado salvo que el servicio o los titulares de derechos correspondientes lo autoricen.
- Este tutorial no trata la elusión de DRM, la redistribución comercial ni formas de evadir las medidas de control de la plataforma.
Qué necesitas antes de empezar
La instalación base es pequeña, pero los archivos multimedia no lo son. Prepara el servidor y la ruta de almacenamiento antes de descargar un canal entero.
- Un VPS con Ubuntu 22.04 o posterior, o una versión actual de Debian, con acceso SSH
- Python 3.10 o posterior
- Almacenamiento suficiente para una muestra representativa más margen para archivos parciales y postprocesado
- Un navegador local aparte, solo si necesitas cookies de cuenta
- Opcional: Jellyfin, Emby u otro servidor multimedia que pueda leer el directorio del archivo
¿Por qué poner yt-dlp en un VPS?
Un VPS resulta útil cuando el trabajo debe seguir corriendo con independencia de tu ordenador diario. Le da al descargador un proceso persistente, un sistema de archivos predecible y un planificador que no se detiene cuando un portátil se suspende o cambia de red.
Los compromisos importan. El límite mensual de transferencia de tu servidor puede convertirse en un tope cuando reproduces el archivo hacia fuera, y una IP de VPS puede toparse con límites de peticiones antes que tu conexión doméstica. También asumes las actualizaciones, la gestión de credenciales, las copias de seguridad, la limpieza del almacenamiento y la seguridad del servidor multimedia. Para una descarga puntual, un portátil es más simple. Para descargas recurrentes o una biblioteca compartida, un VPS es más fácil de operar.
Dimensiona el VPS en torno al almacenamiento y la reproducción
yt-dlp descarga y remultiplexa el contenido; normalmente no transcodifica cada archivo. Eso mantiene modestas las necesidades constantes de CPU y memoria del descargador, mientras que el uso de disco varía según la duración, la resolución, el códec y el formato elegido.
Usa estas asignaciones como puntos de partida conservadores, no como mínimos oficiales:
| Instalación | Asignación inicial | Enfoque de almacenamiento | La mejor opción |
|---|---|---|---|
| yt-dlp puro con systemd | 2 vCPU, 2 GB RAM | Dimensionar a partir de una muestra | Descargas programadas sin interfaz |
| MeTube o Pinchflat | 2 vCPU, 4 GB RAM | Dimensionar a partir de una muestra | Cola en el navegador o suscripciones a canales |
| Tube Archivist | 4 vCPU, 8 GB RAM | Disco local con margen de crecimiento | Archivo con búsqueda y reproducción integrada |
Una prueba pequeña necesita unos 2 GB de memoria disponible y una instalación de mediana a grande unos 4 GB, según la guía de despliegue de Tube Archivist. Empezar por encima de ese suelo deja sitio al sistema operativo, a Docker, a la actividad de Elasticsearch y a otro servicio como Jellyfin.
Antes de dimensionar un archivo completo, simula o descarga un grupo representativo en la resolución elegida. Revisa el directorio resultante con du, divide por el número de vídeos completados y ten en cuenta las subidas inusualmente largas.
du -sh ~/archive
find ~/archive -type f \( -name '*.mp4' -o -name '*.mkv' \) | wc -l
df -h ~/archive
La muestra resulta más útil que una estimación genérica de gigabytes por vídeo, porque refleja la duración y la mezcla de formatos reales del canal.
Instala yt-dlp y sus dependencias actuales
El proyecto yt-dlp admite Python 3.10 y posteriores. La lista de dependencias de yt-dlp recomienda encarecidamente ffmpeg, ffprobe, yt-dlp-ejs y un runtime de JavaScript compatible para un soporte completo de YouTube.
Empieza por los paquetes del sistema y un entorno de Python aislado:
sudo apt update
sudo apt install -y python3 python3-venv ffmpeg curl nano
python3 -m venv ~/yt-dlp-venv
source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"
Deno viene activado por defecto en yt-dlp y es el runtime que la guía de EJS guía EJS del proyecto recomienda ahora mismo. Instálalo, añádelo al PATH de tu shell y verifica cada componente:
curl -fsSL https://deno.land/install.sh | sh
export PATH="$HOME/.deno/bin:$PATH"
echo 'export PATH="$HOME/.deno/bin:$PATH"' >> ~/.profile
yt-dlp --version
ffmpeg -version | head -1
deno --version
yt-dlp --simulate --verbose "https://www.youtube.com/watch?v=VIDEO_ID"
La salida detallada enumera las dependencias que yt-dlp detecta. Si falta ffmpeg, yt-dlp avisa y no puede fusionar las pistas de vídeo y audio de mejor calidad por separado ni ejecutar varios pasos de postprocesado.
Para una instalación con pip, actualiza volviendo a ejecutar pip dentro del entorno virtual. El comando integrado yt-dlp -U es para los binarios de versión, no para los paquetes de pip.
source ~/yt-dlp-venv/bin/activate
python -m pip install -U --pre "yt-dlp[default]"
Los canales de actualización se describen en las notas de actualización de yt-dlp. Los canales stable, nightly y master están todos disponibles, y nightly es el que el proyecto recomienda a los usuarios habituales, porque las correcciones de extractores llegan allí antes de la siguiente versión estable.
Añade cookies solo para el contenido que exige cuenta
Prueba primero la URL de destino sin cookies. La guía de YouTube de yt-dlp dice que las cookies solo hacen falta para contenido que exige cuenta, incluidas las listas privadas, los vídeos con restricción de edad y el contenido para miembros. El inicio de sesión con OAuth ya no funciona con yt-dlp.
Cuando hagan falta cookies, exporta una sesión de YouTube dedicada en tu ordenador local. El procedimiento de exportación de cookies del proyecto usa una ventana de navegación privada para que YouTube no rote la sesión exportada en una pestaña normal abierta:
- Abre una única ventana privada o de incógnito e inicia sesión en YouTube.
- En la misma pestaña, abre el archivo robots.txt de YouTube.
- Exporta solo las cookies de youtube.com en formato Netscape con una de las extensiones que enumera la FAQ de yt-dlp.
- Cierra la ventana privada y no vuelvas a abrir esa sesión.
- Copia el archivo al VPS y restringe sus permisos.
scp cookies.txt your-user@your-vps-ip:~/cookies.txt
ssh your-user@your-vps-ip 'chmod 600 ~/cookies.txt'
Prueba el archivo con una URL que exija cuenta:
~/yt-dlp-venv/bin/yt-dlp \
--cookies ~/cookies.txt \
--simulate \
"https://www.youtube.com/watch?v=VIDEO_ID"
Los archivos de cookies son credenciales de sesión, y las extensiones de navegador exigen una elección cuidadosa, según las FAQ de yt-dlp sobre cookies. La guía del extractor de YouTube también advierte de que usar una cuenta con yt-dlp puede acarrear un bloqueo temporal o permanente. Usa cookies solo cuando el destino lo exija, mantén el archivo en privado y emplea una cuenta aparte en lugar de tu cuenta principal de Google.
No pongas --cookies en la configuración global cuando la mayoría de los destinos son públicos. Usa un segundo archivo de configuración o añade la opción solo a los trabajos que la necesiten.
Trata los PO Tokens como una solución condicional de problemas
Un Proof of Origin Token no es un requisito universal de instalación. YouTube exige actualmente estos tokens para ciertas combinaciones de cliente y petición, y la matriz exacta va cambiando.
Se recomienda un plugin proveedor para el cliente mweb cuando fallan los clientes por defecto, según la guía de PO Tokens de yt-dlp. Menciona bgutil-ytdlp-pot-provider como una de las opciones destacadas, pero el plugin exige tanto un proveedor de tokens como un plugin de yt-dlp. Instalar solo el paquete de Python no es una configuración completa.
Sigue este orden cuando falle una descarga de YouTube:
- Actualiza yt-dlp, yt-dlp-ejs y el runtime de JavaScript.
- Reproduce el fallo con --verbose y sin forzar ningún cliente adicional.
- Añade cookies solo si el vídeo exige una cuenta.
- Si el error apunta a la exigencia de PO Token, sigue las instrucciones vigentes del proveedor enlazadas desde la guía oficial.
Así se mantiene un apaño volátil fuera de una instalación base que por lo demás es estable.
Elige una interfaz según el flujo de trabajo
La decisión principal no es qué interfaz tiene la lista de funciones más larga. Decide si necesitas una cola en el navegador, suscripciones basadas en reglas o una biblioteca local completa al estilo de YouTube.
| Opción | Despliegue | Puntos fuertes | Principal compromiso |
|---|---|---|---|
| CLI pura | Sin interfaz | Scripts, archivos de configuración, systemd, control exacto de las opciones | Sin interfaz de navegador |
| MeTube | Un solo contenedor Docker | Descargas desde el navegador, más suscripciones a canales y listas | Gestión de biblioteca limitada tras la descarga |
| Pinchflat | Un solo contenedor Docker | Reglas para canales y listas, RSS, retención, salida para media center | Pensado para gestionar descargas, no para ver dentro de la aplicación |
| Tube Archivist | Contenedores de la aplicación, Redis y Elasticsearch | Búsqueda, metadatos, colas, páginas de canal y reproducción | La mayor carga de memoria y operativa |
Para un flujo ligero en el navegador, MeTube admite suscripciones a canales y listas que comprueban periódicamente si hay novedades y las encolan de forma automática. Sigue siendo la opción más simple cuando lo que quieres es sobre todo un formulario web y una cola de descargas.
Pinchflat encaja mejor con el archivado continuo de canales que se van a consumir desde Jellyfin, Plex, Kodi o un cliente RSS. Es autónomo, revisa las fuentes periódicamente, admite reglas de retención y deja la reproducción, a propósito, a otra aplicación.
Tube Archivist justifica sus servicios adicionales cuando quieres que el propio archivo se comporte como un sitio de vídeo con búsqueda. Si Jellyfin ya te da la interfaz de reproducción, empieza con la CLI pura o con Pinchflat y añade Tube Archivist solo cuando su modelo de búsqueda y metadatos resuelva un problema que tengas de verdad.
Crea una configuración de archivado reproducible
Guarda las opciones duraderas en un solo archivo y pasa la URL del canal desde la línea de comandos o el planificador. Este ejemplo limita la salida a 1080p, registra los identificadores de los vídeos completados, añade un ritmo suave de peticiones y escribe metadatos que siguen siendo útiles fuera de yt-dlp.
Crea los directorios y el archivo de configuración:
mkdir -p ~/.config/yt-dlp ~/archive
nano ~/.config/yt-dlp/archive.conf
Añade estas opciones:
-P "~/archive"
-o "%(channel)s/%(upload_date>%Y-%m-%d)s - %(title)s [%(id)s].%(ext)s"
-f "bv*[height<=1080]+ba/b[height<=1080]"
--merge-output-format mp4
--download-archive ~/archive/downloaded.txt
--sleep-requests 1
--sleep-interval 5
--max-sleep-interval 10
--write-info-json
--write-thumbnail
--write-subs
--write-auto-subs
--sub-langs en.*
--embed-subs
--embed-thumbnail
--embed-metadata
--sponsorblock-mark all
Haz una prueba con un solo vídeo antes de darle a yt-dlp un canal entero:
~/yt-dlp-venv/bin/yt-dlp \
--config-location ~/.config/yt-dlp/archive.conf \
"https://www.youtube.com/watch?v=VIDEO_ID"
Después ejecuta la URL de un canal o una lista con la misma configuración:
~/yt-dlp-venv/bin/yt-dlp \
--config-location ~/.config/yt-dlp/archive.conf \
"https://www.youtube.com/@CHANNEL/videos"
El archivo --download-archive registra los identificadores descargados con éxito, así que las ejecuciones posteriores los omiten. Mantén al principio el valor por defecto --concurrent-fragments 1. La guía de YouTube de yt-dlp recomienda esperas entre vídeos cuando una sesión alcanza los límites de peticiones; no publica un techo universal y seguro de concurrencia de fragmentos para las IP de VPS.
Programa las descargas con systemd
Un temporizador de systemd a nivel de usuario le da a la tarea una planificación persistente y registros, sin meter un comando largo en cron. El retardo aleatorio también evita que todas las fuentes programadas arranquen en el mismo segundo. Para no depender del PATH del gestor de usuario, el servicio apunta yt-dlp directamente a la ruta de instalación por defecto de Deno.
Crea el servicio:
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/yt-dlp-archive.service
[Unit]
Description=Archive a YouTube channel with yt-dlp
[Service]
Type=oneshot
ExecStart=%h/yt-dlp-venv/bin/yt-dlp --js-runtimes deno:%h/.deno/bin/deno --config-location %h/.config/yt-dlp/archive.conf https://www.youtube.com/@CHANNEL/videos
Crea el temporizador:
nano ~/.config/systemd/user/yt-dlp-archive.timer
[Unit]
Description=Run the yt-dlp archive daily
[Timer]
OnCalendar=*-*-* 04:00:00
RandomizedDelaySec=30m
Persistent=true
[Install]
WantedBy=timers.target
Activa el temporizador y permite que el servicio de usuario se ejecute cuando no has iniciado sesión:
systemctl --user daemon-reload
systemctl --user enable --now yt-dlp-archive.timer
sudo loginctl enable-linger "$USER"
systemctl --user list-timers
journalctl --user -u yt-dlp-archive.service -n 100 --no-pager
Para varios canales, crea una instancia de servicio por canal o usa temporizadores separados. Escalónalos en vez de lanzar varias descargas grandes a la vez.
Conecta el archivo a Jellyfin
Monta o expón el mismo directorio ~/archive a Jellyfin y añádelo como biblioteca. Para la estructura cruda de canal/fecha, la biblioteca Music Videos de Jellyfin acepta carpetas anidadas y nombres de archivo arbitrarios, sin buscar metadatos en línea. La etiqueta no es perfecta para archivos que no son de música, pero encaja mejor con el sistema de archivos que el tipo "Shows", que espera carpetas de series y temporadas con nombres de episodio SxxEyy. Evita Mixed Content salvo que aceptes la advertencia de Jellyfin de que sus resultados de metadatos pueden no ser fiables.
Las opciones de metadatos, miniatura y subtítulos de la configuración de yt-dlp conservan información útil junto a cada archivo o dentro de él. Aun así, Jellyfin puede necesitar ajustes manuales de metadatos, porque un canal de YouTube no encaja limpiamente en una base de datos de series de televisión.
Si quieres nombres de archivo y metadatos adaptados a Jellyfin con menos trabajo manual, Pinchflat trae preajustes de media center para ese flujo. Para la elección más amplia entre servidores multimedia, nuestra comparativa entre Jellyfin y Plex cubre los compromisos de reproducción, acceso remoto y transcodificación.
Pon el stack en un servidor permanente
Cuando el flujo funcione con un pequeño conjunto de prueba, muévelo a El VPS Linux de Cloudzy , para que las descargas programadas y tu biblioteca multimedia sigan en línea sin ocupar tu ordenador diario. También puedes desplegar Jellyfin como aplicación de un clic y apuntar su biblioteca al directorio de salida de yt-dlp.
Construye sobre un VPS Linux con acceso root, NVMe y la potencia de AMD EPYC.
Ver planes LinuxPreguntas frecuentes
¿Necesita yt-dlp una GPU en un VPS?
No. yt-dlp puede descargar y remultiplexar contenido sin GPU. La GPU entra en juego cuando Jellyfin u otro servidor multimedia tiene que transcodificar el vídeo para clientes incompatibles o conexiones de menos ancho de banda; la reproducción directa no requiere esa conversión.
¿Puede yt-dlp reanudar una descarga interrumpida?
Sí. yt-dlp activa por defecto los archivos parciales y la continuación, así que una ejecución posterior suele retomar los fragmentos ya descargados en vez de empezarlos de nuevo. No añadas --no-continue, --no-part ni --force-overwrites si quieres ese comportamiento.
