- yt-dlp es una herramienta de descarga por línea de comandos que permite bajar audio y video desde miles de sitios, y es un fork de youtube-dl
- Para la desencriptación de n/sig de YouTube, ahora se requiere un runtime externo de JavaScript (por ejemplo, Deno, Node.js, Bun, QuickJS) junto con el módulo recién agregado yt-dlp-ejs
- Deno está configurado como runtime predeterminado, y los usuarios pueden especificar otro runtime con la opción
--js-runtimes
- Con este cambio, para usar completamente las funciones relacionadas con YouTube es obligatorio instalar yt-dlp-ejs y un runtime de JS
- Agregar una dependencia de runtime externo es una medida necesaria para responder a los cambios en la estructura de cifrado de YouTube, y será un elemento clave para el mantenimiento futuro
Resumen de yt-dlp
- yt-dlp es un fork de youtube-dl, y es un proyecto desarrollado sobre youtube-dlc, que ya no recibe mantenimiento
- Permite descargar audio y video desde miles de sitios web, y ofrece varias funciones como selección de formatos, posprocesamiento, subtítulos y plugins
Cambios relacionados con el soporte de YouTube
- Se requiere el paquete yt-dlp-ejs para la desencriptación de los valores n/sig de YouTube
- Este paquete se distribuye bajo Unlicense e incluye componentes con licencias MIT e ISC
- Para ejecutar yt-dlp-ejs es obligatorio un runtime de JavaScript
- Runtimes compatibles: deno (recomendado), node.js, bun, QuickJS
- La configuración relacionada puede indicarse con la opción
--js-runtimes
- La opción
--no-js-runtimes permite restablecer la configuración predeterminada del runtime
Instalación y dependencias
- yt-dlp soporta las versiones Python 3.10+ (CPython) y 3.11+ (PyPy)
- Dependencias fuertemente recomendadas:
- ffmpeg / ffprobe: para combinar audio y video y para el posprocesamiento
- yt-dlp-ejs: para descifrar el cifrado de YouTube
- JavaScript runtime: para ejecutar yt-dlp-ejs
- Como dependencias de red opcionales están certifi, brotli, requests, curl_cffi, entre otras
Principales opciones de comando
--js-runtimes RUNTIME[:PATH]: especifica el runtime de JS a usar
--no-js-runtimes: desactiva todos los runtimes de JS
--remote-components COMPONENT: opción para permitir componentes externos de JS
--no-remote-components: bloquea la carga de componentes remotos
Importancia
- Con este cambio, yt-dlp ahora exige obligatoriamente un runtime externo de JS para brindar soporte completo a la estructura de cifrado más reciente de YouTube
- Se trata de un cambio estructural para responder a las continuas actualizaciones de seguridad y cifrado de YouTube, y representa una modificación clave para el mantenimiento futuro y la expansión de funciones
2 comentarios
Guau... es impresionante lo bien que bloquean, y también lo impresionante que es que logren saltárselo. ¿Cómo lo analizan y cómo consiguen romperlo?
Opiniones en Hacker News
Ya viene incluido en los repos de Arch, así que funciona de inmediato
Solo hay que agregar una bandera al comando
yt-dlp --cookies-from-browser firefox --remote-components ejs:github ...Al ejecutarlo, descarga el solver en tiempo de ejecución y tarda apenas unos 0.5 segundos. Da la impresión de que la velocidad de inicio de la descarga mejoró bastante
Aun así, cuando se ejecuta en entornos restringidos, estaría bueno poder descargar el solver por adelantado con un comando aparte. Ya está bastante bien, pero sería más cómodo si hubiera automatización de empaquetado
Si la preocupación es la seguridad, usando Deno el sandboxing está bastante bien resuelto
Si Deno o Node no están disponibles para ese OS, también se podría considerar QuickJS, escrito en C. Es lento, pero funciona en casi cualquier entorno
Eso sí, en ese caso se pierde el sandboxing. Aun así, si el código viene del dominio oficial de YouTube, me parece razonable confiar en él
/home/username/.cache)O también se puede intentar la automatización de empaquetado con
make yt-dlp-extraÚltimamente YouTube empezó a obligar el encabezado referrer en videos embebidos
Si entras directamente a
youtube.com/embed/<videoid>, aparece un error, y en el FAQ también se aclara que es una política intencionalSegún la documentación oficial, quien embebe debe proporcionar un HTTP Referer; si no, se muestra la pantalla de “error 153”
Cuando salió QuickTime en 1991, parecía obvio que los videos simplemente se podían copiar, pegar y guardar
Ahora cuesta creer lo mala que se volvió la experiencia de usuario incluso con videos que ni siquiera tienen DRM
Ahora con el reproductor del sistema o VLC ya se resuelve casi todo
Desde 2010 uso yt-dlp, incluyendo la época de youtube-dl, para archivar todos los videos a los que les doy like
Ahora ya tengo guardados decenas de miles de videos, y una buena parte de ellos ya desapareció del sitio
También guardo videos como los resúmenes de sumo de NHK, que solo se publican durante un mes
A veces pienso que, en esta batalla interminable entre bloqueo de anuncios e inserción de anuncios, al final podría aparecer AGI/ASI.
Los dos bandos van a usar LLM, y los humanos vamos a quedar en el medio perdiendo dinero y atención
En 10 años quizá YouTube sea totalmente inaccesible desde el navegador
Si pasa a dominar una generación acostumbrada a apps de tablet, Google podría sentirse con la confianza suficiente como para abandonar la web
En yt-dlp issue #14404 se propuso usar Selenium o un navegador headless, pero
el equipo de mantenimiento respondió que eso sería una declaración de derrota y va en contra del espíritu del proyecto
El scraping es realmente un trabajo durísimo. Es impresionante poder mantener algo así cuando las APIs se rompen seguido y el proveedor te odia
Se nota que YouTube cada vez adopta una postura más hostil hacia los usuarios
bloquear bloqueadores de anuncios, recolectar contenido para entrenar IA, restringir la API… parece que se aprovechan de no tener competencia
Son muy sensibles a mantener contentos a los anunciantes, pero tratan a usuarios y creadores como consumibles
Empezar gratis, eliminar a la competencia y luego construir una estructura monopólica fue una especie de estrategia de carnada.
Ahora hace falta una alternativa nueva. Aunque sea paga, estaría bien un servicio transparente
Según la wiki de yt-dlp EJS, se recomienda Deno porque
permite ejecutar código con permisos restringidos y puede obtener dependencias de EJS remotamente desde npm
es más seguro usar aislamiento a nivel SO/VM como Firecracker