27 puntos por GN⁺ 2025-09-25 | 1 comentarios | Compartir por WhatsApp
  • En yt-dlp, para seguir usando con normalidad la descarga de YouTube, pronto será obligatorio instalar Deno (o un runtime de JavaScript compatible)
  • Debido a cambios recientes del lado de YouTube, ya no es posible resolver los desafíos de JS solo con el "intérprete" de JavaScript integrado
  • Los usuarios de ejecutables de PyInstaller solo deberán tener Deno listo, mientras que quienes usen el paquete de PyPI necesitarán instalar componentes adicionales de JavaScript
  • Se mantiene abierta la posibilidad de soportar otros runtimes de JavaScript (Node, Bun, etc.), pero solo Deno es adecuado en términos de seguridad y sandboxing
  • Más adelante se ofrecerán opciones e instrucciones específicas sobre cómo instalar Deno y dependencias relacionadas, así como para indicar rutas

yt-dlp anuncia cambios para las descargas de YouTube y nuevos requisitos

Motivo de la introducción del nuevo requisito

  • En un futuro cercano, para usar correctamente la función de descarga de YouTube, será obligatorio instalar Deno u otro runtime de JavaScript compatible
  • Hasta ahora, yt-dlp resolvía los desafíos de JS de YouTube usando un intérprete de JavaScript integrado, pero debido a cambios recientes en la lógica interna de YouTube, ese método por sí solo ya no puede responder adecuadamente
  • El alcance de los cambios es tan grande que, para funcionar correctamente, yt-dlp tendrá que usar obligatoriamente un algoritmo basado en un runtime oficial de JavaScript para poder superar las solicitudes de YouTube

Preparación y respuesta según el tipo de usuario

  • Instalar Deno (o un runtime de JS compatible)
    • Más adelante se anunciarán, por medio del FAQ y otros canales, los runtimes adicionales compatibles
  • Puede ser necesario instalar algunos componentes de JavaScript requeridos por yt-dlp
    • La necesidad de trabajo adicional varía según el método de instalación y la forma de distribución de yt-dlp

Lista de verificación por distribución oficial

  • Ejecutables oficiales distribuidos con PyInstaller (yt-dlp.exe, yt-dlp_macos, yt-dlp_linux, etc.)
    • Basta con instalar Deno; los componentes adicionales ya vienen incluidos en el ejecutable
  • Paquete de PyPI (pip, pipx, etc.)
    • Es necesario instalar yt-dlp con el grupo de dependencias de la opción default y actualizar a la versión más reciente
    • Ejemplo: pip install -U "yt-dlp[default]"
  • Binario oficial zipimport (yt-dlp para Unix)
    • Será necesario añadir una bandera para que Deno descargue dependencias de npm
    • O bien, instalar en el entorno de Python un paquete separado de resolución JS para yt-dlp (las opciones y el nombre del paquete se anunciarán más adelante)
  • Paquetes de terceros (pacman, brew, etc.)
    • Las medidas pueden variar según la política de cada distribución, pero se puede usar el método de respuesta previsto para los usuarios del binario zipimport

Debate sobre runtimes y seguridad

  • Existe la posibilidad de dar soporte a runtimes alternativos de JS como Node o Bun, pero por ahora estos runtimes no ofrecen el mismo nivel de seguridad y sandboxing que Deno
  • Se sigue discutiendo si se dará soporte a otros runtimes de JS en el futuro; hasta que eso se defina, la guía se basará en Deno

Información adicional sobre la instalación de Deno

  • Al igual que yt-dlp, Deno puede usarse simplemente descargando un ejecutable único desde GitHub y colocándolo en una ruta accesible
  • Más adelante se incorporará en yt-dlp la opción --js-runtimes para poder indicar la ruta del ejecutable de Deno (el nombre y uso de la opción podrían cambiar)
  • Si descargas Deno con curl u otro método y lo colocas en la misma carpeta que el ejecutable de yt-dlp, debería funcionar correctamente

FAQ e información complementaria

  • Según el sistema operativo o el gestor de paquetes que uses, puede ser necesario agregarlo al PATH
  • En algunos entornos, como Linux, Deno puede registrarse automáticamente en el PATH
  • Las preguntas adicionales y los problemas de instalación se atenderán mediante el FAQ o la comunidad

Otras reacciones de la comunidad y próximas actualizaciones

  • Algunos usuarios ya están preguntando por distintos efectos colaterales, como el fin del soporte para sistemas de 32 bits, opciones de distribución y otros temas
  • El equipo de desarrollo de yt-dlp se está preparando para ofrecer mejores guías y formas de soporte basadas en reportes de issues, parches y feedback de la comunidad

Conclusión y resumen

  • Debido a cambios en la estructura del sistema de YouTube, la arquitectura de funcionamiento y los requisitos de yt-dlp cambian de forma importante
  • Como cambio clave, si quieres seguir descargando de YouTube con normalidad, será obligatorio preparar Deno u otro runtime de JS
  • Será necesario responder rápidamente según las instrucciones correspondientes a cada método oficial de distribución
  • Se seguirán publicando instrucciones adicionales, FAQ y guías de instalación

1 comentarios

 
GN⁺ 2025-09-25
Opiniones de Hacker News
  • Soy suscriptor de pago de YouTube Premium. El fin de semana pasado intenté descargar videos para verlos en el tren, pero tanto en el iPad como en el iPhone se quedaban atorados en “Esperando descarga...”. Reiniciar tampoco ayudó, y tras intentarlo durante una hora me rendí. Terminé bajando los videos con yt-dlp y los pasé a una memoria USB-C para verlos. Cuando pronto introduzcan la política de “restricción de compartir Premium entre familiares”, ahí sí pienso cancelar de verdad. Mi familia usa bastante el entorno sin anuncios.

    • Yo también soy suscriptor Premium, pero me pasó algo parecido en la app del iPad. Aunque intente descargar videos para mostrárselos al bebé, no funciona bien a la primera. Me frustré tanto que compré de segunda mano una Samsung Galaxy Tab A7 y le instalé una ROM personalizada con LineageOS. Tengo todos los medios que quiero en una tarjeta SD de 1 TB y los reproduzco sin problema con VLC. Además, NewPipe, bajado desde la tienda F-Droid, puede descargar videos de YouTube con mucha más estabilidad que la app oficial. Al principio pensaba llenar el dispositivo con medios usando algo como yt-dlp, pero ya ni hace falta.

    • Pago YouTube Premium, pero en el teléfono veo con ReVanced porque tengo que desactivar la traducción automática. No entiendo por qué en la app oficial el usuario no puede cambiar esa configuración.

    • Si subes un video a YouTube y luego intentas descargarlo desde el panel del creador —por ejemplo, si hiciste un livestream y no guardaste respaldo local, o si tu computadora anda justa de recursos—, solo te deja bajarlo en 720p de baja calidad. En cambio, con yt-dlp sí puedes obtener la mejor calidad.

    • Cancelé la suscripción porque el entorno sin anuncios no funcionaba en YouTube Kids (uso un ShieldTV). Probablemente era un bug, pero como no hay soporte al cliente no había nada que hacer. Yo pagaba Play Music y me obligaron a cambiar a YouTube, así que esa fue de verdad la última decepción.

    • Si estabas esperando noticias sobre la política de restricción del plan familiar, te cuento que ya hay información al respecto. A mí también me llegó un correo de YouTube sobre eso. Por ahora sigo usándolo sin anuncios, pero no sé cuándo lo aplicarán de verdad. Se puede revisar este artículo relacionado.

  • Me impresiona el esfuerzo de ingeniería que metieron en el “intérprete de JavaScript” de yt-dlp yt-dlp jsinterp.py

    • Es el enfoque perfecto para resolver el problema. De verdad impresiona que hayan llegado tan lejos sin agregar sobrecarga extra.

    • La parte más escondida e importante de este anuncio es justamente esa. No sabía que ya hubieran llegado a una estructura tan compleja y me parece admirable.

    • El enfoque consiste en interpretar solo una parte de JavaScript. Se puede ver la discusión relacionada en HN en este enlace.

    • Le eché una mirada rápida al código y terminé conociendo ChainMap de Python.

    • Me da curiosidad cuánto JavaScript llega a interpretar en la práctica, y si, siendo menos de 1,000 líneas de código, podría usarse en una clase introductoria de compiladores.

  • Llevo más de 30 años coleccionando medios digitales; soy un “digital hoarder”. No tengo medios físicos como VHS o DVD, todo lo guardo en digital. También tengo algunos materiales raros o que podrían desaparecer. Mi sistema, que “funciona como un Netflix en casa”, empezó a interesarle a mi esposa, y le gustó ver sin anuncios. Nunca pensé que fuera algo tan especial y creía que todo el mundo simplemente usaría streaming. Durante años les dije a conocidos: “si te gusta algún programa que yo tenga, avísame”. En los últimos dos años, familiares y amigos han querido acceso a mi servidor Jellyfin o me han pedido que les arme un pequeño servidor debajo de la TV. Últimamente además agregué archivado de canales de YouTube a Jellyfin, y para cada canal uso un directorio y un comando de yt-dlp para bajar videos automáticamente. Eso sí, como no puedo descargarlos en el códec h264 que quiero, los recodifico. Los videos de YouTube vienen en códec AV1, y como mi smart TV todavía no lo soporta, los codifico yo mismo.

    • Antes corría un script sencillo, pero ahora uso ytdltt GitHub de ytdltt por medio de un bot de Telegram para organizar por directorios y descargar videos de YouTube como audiolibros cuando mi mamá los quiere, y luego accede a ellos desde Jellyfin. Mi mamá ya juntó unos 1.2 TB de audiolibros en tres años.

    • Para algo parecido también vale la pena probar tubesync.

    • Cuando no podía descargar contenido en h264, la documentación de yt-dlp se me hacía difícil, pero la forma que sí me funciona ahora es algo así:
      yt-dlp -f "bestvideo[width<800][vcodec~='^(avc|h264)']+bestaudio[acodec~='^((mp|aa))']"

    • Hace poco conocí Pinchflat GitHub de Pinchflat, una alternativa web estilo *arr que usa yt-dlp por detrás. Agregas a una playlist los videos que quieres descargar y los baja automáticamente.

    • Me pregunto si hace falta registrar cookies y cosas así para evadir la detección de bots, o incluso usar VPN.

  • Ya se acabó la época en que bastaba con pedir datos simples desde la web; ahora hay que ejecutar miles de líneas de JavaScript ofuscado. Antes podías obtener y cachear fácilmente un archivo JSON de 1 KB, pero ahora tienes que correr un navegador completo que intercambia 10 MB de datos en 100 solicitudes, mientras se arruina el entorno de análisis y el perfil de seguridad. Es malo para todos.

    • Viéndolo de forma positiva, este entorno tan incómodo abrió una oportunidad de negocio para 10,000 empresas de scraping que raspan 10 MB de basura y luego lo ofrecen como una API decente. Pero ahora la calidad del contenido de los sitios también ha bajado, así que estos temas cada vez importan menos.

    • Ahora la web se siente como un juego interminable de scraping-antibloqueo-evasión a medida que todo se vuelve más complejo. Pero con la llegada de la IA/los LLMs, aunque cueste más, ya se puede extraer cualquier información. Pronto los LLM también pasarán todos los CAPTCHAs. Puede que estemos entrando en una etapa donde el “agujero analógico” siempre esté abierto. Basta con apuntar una cámara y un micrófono a una pantalla y al audio para que la IA lo interprete mejor que un humano.

    • Por suerte, el scraping pequeño como el de yt-dlp es más fácil que nunca. Invirtiendo una o dos horas, puedes armar fácilmente un script con Firefox headless y mitmproxy, y mientras no pongas varios VPS a raspar un sitio entero a gran escala, puedes archivar sin problema el contenido que te interesa. Cloudflare tampoco bloquea a los usuarios comunes de bajo volumen. La automatización moderna de navegadores es tan fácil que, incluso si el sitio es una SPA, un usuario individual puede rasparlo sin mucho problema. Los CAPTCHAs también se pueden resolver manualmente a pequeña escala. Últimamente, cuando me aparece uno, recibo una alerta por Discord, lo resuelvo desde la laptop y sigo con el scraping. Como la app “World Garden” quería controlar los webtoons que compré, decidí que mis datos los controlo yo.

    • En realidad, incluso para ese JSON de 1 KB, en la web moderna tienes que bajar megabytes de JavaScript para ejecutarlo y recién mostrar los datos. Lo que yo quiero es simplemente recibir 10-20 KB de HTML, un poco de CSS y archivos de imagen. Con video, basta con descargar directamente el mp4 y ya está. Es simple y eficiente, pero si lo que quieres es vender algo, la historia cambia.

    • La razón de toda esta complejidad es vender más publicidad.

  • Nsig/sig: es un token especial que debe incluirse obligatoriamente en las llamadas a la API. Se genera en base.js (el código del reproductor) y clientes de terceros como yt-dlp tienen que extraerlo sorteando las restricciones. Antes se obtenía el token extrayendo partes del código con regex y similares, pero ahora el código está tan disperso que ya hace falta ejecutar base.js completo para obtenerlo.
    PoToken: es una prueba de origen (token) que Google reforzó recientemente. Sin eso aparece un error 403. En Android se usa DroidGuard, en iOS un módulo integrado de la app y en la web hace falta ejecutar código JS (challenge). Antes había que emitirlo con herramientas externas, pero con la actualización basada en Deno de yt-dlp se anticipa que pronto podrá venir integrado.
    SABR: tecnología de streaming adaptativo de bitrate del lado del servidor, usada junto con el protocolo UMP de Google. El servidor recibe la posición de reproducción y el estado del búfer para controlar el buffering óptimo e incluso la inserción de anuncios. El soporte para clientes de terceros todavía está en proceso.
    Ejemplos de extracción de Nsig/sig:

    • Ahora entiendo por qué Google y Cloudflare quieren limitar la web a unos pocos navegadores firmados y con verificación de integridad.

    • Sobre PoToken en la web, me pregunto cómo es que ejecutar un snippet de JS demuestra que no eres un bot. Si al final es solo JS del cliente, ¿no debería funcionar también en Chromium headless?

    • Apenas Google lo introdujo, ya están saliendo formas de evadirlo. Al final, incluso una gran empresa no puede impedirlo si entrega el contenido al cliente. Por eso todos quieren construir ecosistemas cerrados y propietarios: así pueden obligarte a ver todos los anuncios o cobrarte por usarlo.

  • Hace poco también salió en HN la idea de que YouTube quiere que las herramientas de descarga sigan funcionando artículo relacionado 1 artículo relacionado 2. YouTube opera un servicio global usado por 3,000 millones de personas, y da la impresión de que nunca intenta bloquear las descargas por completo, sino solo “lo suficiente”. Si todos los usuarios del mundo usaran iPhone o Android modernos, creo que podrían meter DRM de inmediato.

    • yt-dlp aprovecha la API para smart TVs antiguas. Como esos dispositivos ya no reciben actualizaciones de software, si ese tráfico desaparece, esta función también podría terminarse.

    • No me parece que tenga ninguna lógica la teoría conspirativa de que una plataforma de contenido quiera permitir descargas aunque eso rompa su modelo de ingresos.

  • El reproductor y la página de YouTube se han vuelto tan pesados que, irónicamente, en PCs viejas van todavía peor. Últimamente veía videos cambiando watch?v= por /embed/ para verlos en 480p, y si bajas ese mismo video y lo reproduces localmente, el CPU apenas llega a 3%. Pero incluso eso está dejando de funcionar poco a poco. Mientras tanto, otros sitios (por ejemplo, los de porno) sí se preocupan por optimizar la experiencia y no parecen tener mucho interés en bloquear herramientas de descarga.
    Video (normal)
    Video (embed)

    • A GitHub le pasa algo parecido: está tan poco optimizado que casi no se puede usar ni en una PC con i5 de 8ª generación. Por eso yo mejor tomo snapshots y los reviso offline.

    • La degradación reciente del rendimiento de YouTube se debe a que obligan a todos a usar códecs modernos y pesados. Mi laptop puede reproducir sin problema video 4K en h264, pero si solo veo un video de YouTube a 720p, enseguida se calienta y se traba. Con la extensión del navegador h264ify puedes bloquear ciertos códecs, y da coraje que no se pueda ajustar ese comportamiento básico. Al final, descargar el video y verlo así resulta más cómodo y confiable.

    • No soy solo yo. En el primer trimestre de 2025 usaba el reproductor embebido, pero en el tercer trimestre Google lo bloqueó a propósito. Ahora solo se puede acceder a YouTube con yt-dlp. Larga vida a yt-dlp y a sus desarrolladores.

    • Estoy pensando en dejar YouTube e irme a PeerTube o a plataformas peer-to-peer.

  • Hay reportes de que QuickJS (intérprete ligero de JS) es tan lento que tarda más de 20 minutos por video. Deno es muchísimo más rápido, y me pregunto cómo puede haber tanta diferencia.
    (Referencia issue #14404 / respuesta)

    • QuickJS es un intérprete basado en bytecode —lento, como Python— que prioriza la simplicidad y la estabilidad. En cambio, Deno usa un compilador JIT de altísima eficiencia al nivel de Chrome, y por esa diferencia, en ciertos tipos de código la velocidad de ejecución puede ser más de 20 veces superior. QuickJIT (un fork de QuickJS con JIT agregado usando TCC) probablemente seguiría siendo más lento que Deno, pero podría mejorar bastante.

    • Da miedo pensar que el rendimiento se haya degradado de forma tan dramática porque Google lo hizo intencionalmente para que otros intérpretes fueran lentos.

    • Qué dato tan interesante. En Minecraft (Bedrock, para modding) usan QuickJS, y aunque es más lento que V8, no parece haber una diferencia tan exagerada.

  • Ya es bastante claro que se acerca el fin de la época del ripping sencillo. Si tienes videos de YT que quieras conservar a largo plazo, te recomiendo instalar ya mismo algo como tubearchivist y hacer respaldo.

    • También recomiendo como alternativa pinchflat GitHub de Pinchflat. Está menos pulido que tubearchivist, pero en mi experiencia tiene menos bugs.

    • Creo que esta es la última oportunidad de conservar el valioso patrimonio cultural y educativo que YT acumuló gracias a su monopolio de mercado. tubearchivist se ve interesante, pero parece bastante engorroso de instalar y mantener, y además está pensado para descargar canales completos. En mi caso, con tener la carpeta de descargas me basta, siempre que exista una solución de servidor web local muy ligera que lea los nombres de los videos y me genere páginas con enlaces. Si alguien puede recomendar una alternativa ultraligera que se instale en unos cuantos clics, sería ideal.

    • También me pregunto por qué, si para las películas de YouTube ya existe una solución con DRM, todavía no han aplicado esa tecnología a todos los canales.

  • Me sorprendió que eligieran Deno, pero Deno se distribuye fácilmente como ejecutable único, así que reduce los problemas de instalación. El intérprete hecho en Python era un hack impresionante, pero tenía límites, y este tema ya se había discutido en el antiguo proyecto Youtube-dl discusión vieja en HN

    • Node no tiene las funciones de seguridad y aislamiento que sí tiene Deno. En el mismo hilo también se puede ver la opinión del maintainer.

    • La función de sandbox de Deno también fue una razón importante para elegirlo. No se puede confiar al 100%, pero sigue siendo mejor que nada.

    • yt-dlp no solo soporta YouTube, sino también muchos otros sitios de streaming de video, algunos a veces peligrosos. Por eso es imprescindible contar al menos con un sandboxing mínimo al estilo del navegador. Por diseño, tiene que ejecutar código no confiable, así que necesita una base de seguridad.