12 pontos por GN⁺ 2025-11-13 | 2 comentários | Compartilhar no WhatsApp
  • yt-dlp é uma ferramenta de download via linha de comando que permite baixar áudio e vídeo de milhares de sites, sendo um fork do youtube-dl
  • Para a descriptografia de n/sig do YouTube, agora é necessário um runtime externo de JavaScript (como Deno, Node.js, Bun ou QuickJS) junto com o novo módulo yt-dlp-ejs
  • O Deno foi definido como runtime padrão, e o usuário pode especificar outros runtimes com a opção --js-runtimes
  • Com essa mudança, para usar completamente os recursos relacionados ao YouTube, tornou-se obrigatório instalar o yt-dlp-ejs e um runtime JS
  • A adição da dependência de um runtime externo é uma medida necessária para responder às mudanças na estrutura de criptografia do YouTube e será um elemento central da manutenção futura

Visão geral do yt-dlp

  • O yt-dlp é um fork do youtube-dl, desenvolvido com base no youtube-dlc, que não é mais mantido
  • Ele permite baixar áudio e vídeo de milhares de sites e oferece vários recursos de seleção de formatos, pós-processamento, legendas e plugins

Mudanças no suporte ao YouTube

  • O pacote yt-dlp-ejs passou a ser necessário para a descriptografia dos valores n/sig do YouTube
    • Esse pacote é distribuído sob a Unlicense e inclui componentes sob as licenças MIT e ISC
  • A execução do yt-dlp-ejs exige um runtime JavaScript
    • Runtimes compatíveis: deno (recomendado), node.js, bun, QuickJS
    • A configuração relacionada pode ser definida com a opção --js-runtimes
  • A opção --no-js-runtimes pode ser usada para limpar a configuração padrão de runtime

Instalação e dependências

  • O yt-dlp oferece suporte às versões Python 3.10+ (CPython) e 3.11+ (PyPy)
  • Dependências fortemente recomendadas:
    • ffmpeg / ffprobe: para mesclagem de áudio e vídeo e pós-processamento
    • yt-dlp-ejs: para descriptografia do YouTube
    • runtime JavaScript: para executar o yt-dlp-ejs
  • Entre as dependências opcionais de rede estão certifi, brotli, requests, curl_cffi e outras

Principais opções de comando

  • --js-runtimes RUNTIME[:PATH]: define o runtime JS a ser usado
  • --no-js-runtimes: desativa todos os runtimes JS
  • --remote-components COMPONENT: opção que pode permitir componentes JS externos
  • --no-remote-components: bloqueia o carregamento de componentes remotos

Importância

  • Com essa mudança, o yt-dlp agora exige obrigatoriamente um runtime JS externo para dar suporte completo à estrutura de criptografia mais recente do YouTube
  • Trata-se de uma mudança estrutural para responder às contínuas atualizações de segurança e criptografia do YouTube, sendo uma alteração central para a manutenção futura e a expansão de recursos

2 comentários

 
kimjoin2 2025-11-14

Uau... é impressionante tanto bloquearem quanto conseguirem furar isso. Como será que analisam e conseguem romper isso?

 
GN⁺ 2025-11-13
Comentário no Hacker News
  • Já vem incluído no repositório do Arch, então funciona de imediato
    Basta adicionar a flag no comando yt-dlp --cookies-from-browser firefox --remote-components ejs:github ...
    Na execução, ele baixa o solver em tempo de execução, e isso leva só cerca de 0,5 segundo. Dá a sensação de que o início do download ficou bem mais rápido
    Ainda assim, ao rodar em ambientes restritos, seria bom poder baixar o solver antes com um comando separado. Do jeito que está já é satisfatório, mas seria ainda mais prático com automação de empacotamento

    • Bom saber que ficou mais rápido. Hoje em dia o YouTube nem funciona direito no navegador, então é impressionante ver uma equipe conseguindo manter o acesso viável por script em Python
    • Fico curioso sobre em que ambiente Python funciona mas JS não
      Se a preocupação for segurança, usando Deno o sandbox funciona bem
      Se for um SO que não suporta Deno nem Node, também daria para considerar o QuickJS, escrito em C. É lento, mas funciona em quase todo lugar
      Nesse caso, porém, o sandbox desaparece. Ainda assim, se for código servido pelo domínio oficial do YouTube, eu consideraria confiável
    • Se você quiser baixar o solver antes, basta baixar qualquer vídeo uma vez e depois copiar o arquivo ejs do diretório de cache do yt-dlp (por exemplo, /home/username/.cache)
      Ou então tentar a automação de empacotamento com make yt-dlp-extra
    • O pacote yt-dlp-ejs no AUR parece servir exatamente para esse propósito
    • Eu instalei o Deno manualmente com Chocolately, e o yt-dlp também com choco, então a versão é v2025.10.22
  • Recentemente o YouTube começou a exigir o cabeçalho referrer em vídeos incorporados
    Se você acessar diretamente youtube.com/embed/<videoid>, aparece um erro, e o FAQ também diz que isso é uma política intencional
    Segundo a documentação oficial, quem incorpora precisa fornecer o HTTP Referer; caso contrário, aparece a tela de “error 153”

    • A maioria dos serviços de incorporação está cada vez mais indo nessa direção. O objetivo é aumentar o rastreamento. Em alguns casos, chegam até a exigir login
    • Na prática, dá para contornar isso com uma linha simples de redirecionamento em JS. O custo de implementação é de centenas de milhares de dólares, e o custo do bypass é zero. No fim, soa como uma mensagem de “se quisermos, podemos bloquear à vontade”
  • Quando o QuickTime saiu em 1991, eu achava natural poder simplesmente copiar, colar e salvar vídeos
    Hoje é difícil acreditar como até vídeos sem DRM pioraram tanto em termos de experiência do usuário

    • Hoje está muito melhor do que antes. Antigamente era comum instalar RealPlayer, Flash, pacotes de codec e acabar detonando o sistema com adware.
      Agora, com o player padrão do sistema ou só o VLC, quase tudo se resolve
    • O começo dos anos 90 foi a fase mais empolgante dos PCs. Hoje, com o smartphone no centro de tudo, a ideia de copiar/salvar para o usuário comum sobrevive mais em screenshot ou gravação de tela
    • Vídeo tem densidade de dados muito alta, então o custo de hospedagem é grande. Por isso só sobraram plataformas gigantes como o YouTube, e alternativas como Nebula, PeerTube e Odysee têm limitações de qualidade ou custo
    • Antes o objetivo era otimizar pensando no usuário, mas agora vivemos numa era em que as empresas agem priorizando o próprio interesse
    • O padrão de transmissão ATSC 3 também criou problema de compatibilidade com receptores antigos ao adicionar DRM tardiamente
  • Desde 2010 eu uso yt-dlp (incluindo a época do youtube-dl) para arquivar todos os vídeos que curti
    Hoje já tenho dezenas de milhares de vídeos salvos, e uma parte considerável deles já sumiu do site
    Também guardo vídeos como os highlights de sumô da NHK, que ficam disponíveis só por um mês

    • Dá para chamar isso de colecionismo digital. Seria interessante criar algo como o Google Memories para relembrar vídeos antigos periodicamente
    • Muitos canais apagam ou removem os próprios vídeos, então comecei a salvar conteúdo bom antes que desaparecesse
    • Tudo na internet pode sumir a qualquer momento. O que é importante precisa ser salvo por você mesmo para poder ver de novo
    • Não imaginava encontrar aqui outra pessoa que salva vídeos de sumô. Tem bastante gente como nós
    • Em tempos de excesso de conteúdo, eu me pergunto se faz sentido guardar tudo. Antes eu arquivava MP3, filmes e tudo mais, mas hoje só mantenho fotos na nuvem
  • No meio da guerra sem fim entre bloqueio de anúncios e inserção de anúncios, às vezes penso que AGI/ASI pode acabar surgindo daí.
    Os dois lados vão usar LLMs, e os humanos ficarão no meio, perdendo carteira e atenção

  • Daqui a 10 anos, talvez o YouTube se torne totalmente inacessível no navegador
    Se a geração acostumada com apps de tablet virar maioria, o Google talvez ganhe confiança para abandonar a web

    • Para realmente impor DRM, seria preciso hardware dedicado. O stream criptografado teria de tocar apenas em dispositivos com certificação L2
    • Webapps mobile têm bugs demais e são praticamente inutilizáveis. Os comentários também somem com frequência
    • Mesmo assim, o Google sempre manteve uma estratégia centrada na web
    • Ainda existe muita gente que assiste YouTube no navegador, e também há alternativas como o bilibili, da China
    • Mas, como a geração com poder de compra ainda usa navegador, não acho que o Google vá abandonar completamente esse mercado
  • Na issue #14404 do yt-dlp, houve uma sugestão de usar Selenium ou navegador headless,
    mas a equipe de manutenção respondeu que “isso seria uma declaração de derrota e iria contra o espírito do projeto”

  • Fazer scraping é realmente um trabalho ingrato. É impressionante manter algo funcionando quando a API quebra com frequência e o provedor nos odeia

    • Esse “o provedor nos odeia” é justamente parte da graça do projeto
    • Eu nunca conseguiria manter o yt-dlp. É um trabalho desgastante demais
  • Dá para sentir que o YouTube está ficando cada vez mais hostil aos usuários
    Bloqueio de adblock, coleta de conteúdo para treinar IA, restrições de API — parece estar explorando a falta de concorrência

    • Na verdade, o cliente real do Google é o anunciante. Nós somos apenas o produto deles
      Eles são sensíveis à satisfação dos anunciantes, mas tratam usuários e criadores como descartáveis
      Começar de graça, eliminar concorrentes e depois formar uma estrutura monopolista foi uma espécie de estratégia de isca.
      Agora precisamos de uma nova alternativa. Mesmo que seja paga, seria bom um serviço transparente
    • Ultimamente aumentaram os anúncios não puláveis especialmente em vídeos infantis
    • O custo operacional do YouTube é tão alto que penso que o bloqueio de anúncios pode de fato afetar a sustentabilidade do serviço
    • No fim, o próprio UX caótico (enshittification) de hoje acabou virando parte do modelo de negócio
  • Segundo a wiki de EJS do yt-dlp, o Deno é recomendado porque
    permite executar código com permissões restritas e buscar remotamente as dependências EJS via npm

    • Mas não dá para superestimar o sandboxing do Deno como mecanismo de segurança. Como o isolamento no nível de runtime é fraco,
      o mais seguro é usar isolamento em nível de SO/VM, como Firecracker
    • Antes o yt-dlp interpretava JS só com Python, mas, com as exigências de runtime ficando cada vez mais complexas, o interpretador próprio foi chegando ao limite