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

58

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 player Flash)?

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

    
por PaulD 26.06.2014 / 14:44

2 respostas

47

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

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

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

Para encontrar o fluxo de vídeo, você terá que 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 lá em texto simples, mas também pode ser gerado em tempo real com alguns tokens de download específicos. Muitas vezes, o JavaScript é ofuscado para dificultar a sua reengenharia. Ou as informações de vídeo podem estar contidas em um arquivo XML carregado de forma assíncrona pelo JS.

Para o vídeo de download progressivo em HTML5, o arquivo de origem real é geralmente mencionado diretamente no source child da tag video , portanto, se você pesquisar na página mp4 ou similar. 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 mais tecnologias avançadas de reprodução como o MPEG DASH ou o HTTP Live Streaming (HLS) da Apple, é necessário analisar um meta -informação de arquivo para obter o fluxo de vídeo real. O metarquivo ( .mpd , por exemplo, em DASH, e .m3u8 , para HLS) conterá links para segmentos de vídeo e áudio, que você teria que combinar posteriormente para obter um arquivo reproduzível.

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

    
por 26.06.2014 / 14:57
31

YouTube Bookmarklet

Foi assim que eu fiz com JavaScript

Comece com ytplayer.config.args object. Isso contém todos os URLs para o vídeo. Está dividido em

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

Cada um deles é 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 então você precisará decodificá-los. Agora a parte complicada.

O YouTube tem pelo menos três níveis de segurança para os vídeos deles

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 são normalmente usados em filmes completos oficiais e são protegido com SWF Tipo de Verificação 2. Isso tem sido em torno desde 2011 e ainda tem que ser engenharia reversa.

Os vídeos do tipo "s" são os mais difíceis que podem ser baixados. Você Tipicamente, os veremos em vídeos VEVO e afins. Eles começam com um 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("")
}

Esta função é dinâmica, normalmente muda todos os dias. Para tornar mais difícil a função é hospedada em um URL como

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

isto introduz o problema de Política de mesma origem . Essencialmente, você não pode baixar este arquivo de www.youtube.com porque eles são domínios diferentes. Uma solução alternativa para esse problema é CORS . Com CORS, s.ytimg.com poderia adicionar este cabeçalho

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

e permitiria o download do JavaScript a partir de www.youtube.com . Claro 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: *

Então, agora que você fez o proxy do seu arquivo JS, e usou a função para embaralhar a assinatura, você pode usar isso na querystring para baixar um vídeo.

    
por 27.06.2014 / 07:09

Tags