Como funcionam todos esses serviços "Salvar vídeo do YouTube"?

62

Quero dizer, como eles funcionam, geralmente? Como eles recebem o link para um fluxo de vídeo em si (não apenas a página que contém um Flash player)?

Fiz uma pesquisa na Web, mas não consegui encontrar nada útil (todos os links apontam para esses serviços, mas nenhum deles diz como eles são realmente implementados).

PaulD
fonte

Respostas:

51

Existe um downloader de linha de comando de código aberto muito popular chamado youtube-dl, que faz exatamente isso. Ele pega os links reais de arquivos de vídeo e áudio de um determinado link do YouTube - ou qualquer outro site popular de vídeo como o Vimeo, Yahoo! Vídeo, uStream etc.

Para ver como isso é feito, consulte o extrator do YouTube . Isso é demais para mostrar aqui. Existem outros extratores para sites mais simples . Steven Penny também tem um downloader JavaScript simples para o YouTube, que é um pouco mais direto.

Mas, basicamente, para um reprodutor de vídeo Flash, ele deve ser inicializado e configurado por meio de JavaScript. Simplesmente, o player do objeto Flash receberá um URL de um fluxo de vídeo para carregar.

Para encontrar o fluxo de vídeo, você precisa analisar o código HTML e JS da página de vídeo para encontrar o código de inicialização relevante e, a partir daí, tentar encontrar o link para o arquivo MP4 real. Pode estar em texto simples, mas também pode ser gerado em tempo real com alguns tokens de download específicos. Freqüentemente, o JavaScript é ofuscado para dificultar sua reengenharia. Ou as informações do vídeo podem estar contidas em um arquivo XML carregado de forma assíncrona por JS.

No vídeo de download progressivo em HTML5, o arquivo de origem real geralmente é mencionado diretamente no sourcefilho da videotag, portanto, se você pesquisar na página mp4ou algo semelhante. Por exemplo, no noticiário alemão Tagesschau 100 , você encontrará:

<source src="http://media.tagesschau.de/video/2014/0626/TV-20140626-1649-5801.webl.h264.mp4" type="video/mp4">

Para tecnologias de reprodução mais avançadas, como MPEG DASH ou HTTP Live Streaming (HLS) da Apple, você precisa analisar um arquivo de meta-informações para obter o fluxo de vídeo real. O metarquivo ( .mpdpor exemplo, no DASH e .m3u8no HLS) conterá links para segmentos de vídeo e áudio, que você precisará combinar posteriormente para obter um arquivo reproduzível.

Não há solução geral para isso. Requer inspeção cuidadosa e depuração do site de destino.

slhck
fonte
3
Uma pergunta, qual é a política do YouTube / Google sobre isso? Eles estão bem com isso, ou não tanto?
JMK
31
Os Termos de Serviço do YouTube em §5.1.L proíbem o consumo de seu conteúdo por outros meios que não o streaming, portanto, teoricamente, não é permitido. Na prática, eles não serão capazes de aplicar isso. Qualquer downloader pode simular mais ou menos que está apenas transmitindo.
slhck
2
@StevenPenny você tem alguma versão não minificada disso?
TankorSmash
5
O @slhck Flash também pode fazer solicitações HTTP por si só. Em vez disso, ele usa o mecanismo HTTP do navegador. Se o próprio Flash fizesse as solicitações, elas não seriam "visíveis" para o navegador. Claro que seria ótimo para os anunciantes. ;)
Daniel B
3
@slhck eles não podem aplicá-lo de forma programática , mas se eles expuserem sua equipe de advogados, poderão aplicá-lo legalmente ?
Cruncher
35

Bookmarklet do YouTube

Foi assim que fiz com JavaScript

Comece com o ytplayer.config.argsobjeto. Este contém todos os URLs para o vídeo. É dividido em

url_encoded_fmt_stream_map // traditional: contains video and audio stream
adaptive_fmts              // DASH: contains video or audio stream

Cada uma delas é uma matriz separada por vírgula do que eu chamaria de "objetos de fluxo". Cada "objeto de fluxo" conterá valores como este

url  // direct HTTP link to a video
itag // code specifying the quality
s    // signature, security measure to counter downloading

Cada URL será codificado, assim você precisará decodificá-los. Agora a parte complicada.

O YouTube possui pelo menos três níveis de segurança para seus vídeos

unsecured // as expected, you can download these with just the unencoded URL
s         // see below
RTMPE     // uses "rtmpe://" protocol, no known method for these

Os vídeos RTMPE geralmente são usados ​​em filmes oficiais completos e são protegidos com o SWF Verification Type 2. Isso existe desde 2011 e ainda não foi feito com engenharia reversa.

Os vídeos do tipo "s" são os mais difíceis que podem realmente ser baixados. Você os verá tipicamente nos vídeos VEVO e similares. Eles começam com uma assinatura como

AA5D05FA7771AD4868BA4C977C3DEAAC620DE020E.0F421820F42978A1F8EAFCDAC4EF507DB5

Em seguida, a assinatura é embaralhada com uma função como esta

function mo(a) {
  a = a.split("");
  a = lo.rw(a, 1);
  a = lo.rw(a, 32);
  a = lo.IC(a, 1);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 77);
  a = lo.IC(a, 3);
  a = lo.wS(a, 44);
  return a.join("")
}

Essa função é dinâmica, normalmente muda todos os dias. Para dificultar, a função está hospedada em um URL como

http://s.ytimg.com/yts/jsbin/html5player-en_US-vflycBCEX.js

isso introduz o problema da política de mesma origem . Essencialmente, você não pode baixar este arquivo www.youtube.comporque são domínios diferentes. Uma solução alternativa para esse problema é o CORS . Com o CORS, s.ytimg.compoderia adicionar este cabeçalho

Access-Control-Allow-Origin: http://www.youtube.com

e permitiria o download do JavaScript www.youtube.com. Claro que eles não fazem isso. Uma solução alternativa para essa solução alternativa é usar um proxy CORS. Este é um proxy que responde com o seguinte cabeçalho a todas as solicitações

Access-Control-Allow-Origin: *

Portanto, agora que você procurou seu arquivo JS em proxy e usou a função para embaralhar a assinatura, é possível usá-lo na cadeia de consulta para baixar um vídeo.

Steven Penny
fonte
11
Você sabe (para reprodução de DASH) como o player do YouTube determina os intervalos de bytes a serem solicitados na representação de mídia? O arquivo MPD lista apenas segmentos.
slhck
2
Não exatamente. Há um único arquivo para vídeo e áudio, mas o YouTube solicita-os por intervalos de bytes, em vários blocos. Se você mudar para outra qualidade, também mudará o intervalo de bytes. Apenas imaginando como o jogador sabe qual segundo corresponde a qual deslocamento de byte.
slhck
11
Você pode dar um exemplo de um stipo de vídeo e RTMPEtipo de vídeo?
Chloe
@SurajJain aqui é nova página - I será reescrever esta resposta como eu usar um método diferente agora github.com/svnpenn/umber/blob/master/bmklet/youtube/download.js
Steven Penny
O link fornece um 404. Você removeu o repositório?
darksoulsong 25/07
1

Minha resposta: a partir de 22 de janeiro de 2019, o uso desses métodos poderá ser pego se você tentar ignorar sem vincular também as informações do usuário.

Por quê? como sou um novo usuário desta plataforma, não posso comentar sobre a regra especificada por @ Daniel-B . De acordo com os novos ToS (em alemão como eu estou na Alemanha; traduza) para o YouTube abaixo de US $ 6,1 G $:

Você concorda que qualquer sistema automatizado (incluindo - mas não limitado a - qualquer robô, spider ou leitor offline) de usar o que o site acessa de tal maneira que mais solicitações ao servidor dentro de um prazo especificado sejam direcionadas pelo YouTube, capazes de produzir razoavelmente como um humano dentro do mesmo período, usando um navegador da web padrão não modificado e disponível ao público;

Agora eles podem descobrir o tempo de duração de cada solicitação e acompanhar se você está violando. Como é possível agora, considerando esse cenário e seu endereço IP externo, será conhecido mesmo se você usar uma VPN para se proteger sem vincular detalhes do usuário a qualquer serviço.

user103720
fonte
11
Viajante de boas-vindas do futuro ... Não está claro como isso responde à pergunta do autor
Ramhound
Se você quisesse avisar o autor, com relação a uma resposta específica, deveria ter enviado um comentário e recusado qualquer resposta que não considerasse útil devido aos possíveis problemas legais que poderiam ocorrer. Esta resposta parece mais com o que você encontraria em uma postagem no fórum de discussão e o
Superusuário