quarta-feira, 15 de julho de 2009

Baixando vídeos do Youtube sem programas

Olá pessoal. Sei que muitos de vocês já tentaram várias formas diferentes de baixar vídeos no Youtube, não é mesmo?

Downtube, youtube-dl, VDownloader, vixy.net, entre outras centenas de programas para Windows, Linux, MacOS, BSDs, Android, Amiga, Solaris, PS3, Wii, Atari 2600, e mais uma centena de plataformas, variando de acordo com a criatividade do desenvolvedor.

No entanto, todas as soluções sempre exigem que instalemos algum plugin, algum complemento no browser, ou mesmo algum programa no desktop. Alguns oferecem funcionalidades como extrair somente o audio ou converter o vídeo para outros formatos. Todos têm suas utilidades, não duvido, mas as vezes nos atrapalham quando o que queremos é simplesmenet baixar um simples vídeo pq queremos guardar ele pra assistir depois.

Foi pensando nisso que eu passei a procurar uma forma de baixar os vídeos do Youtube diretamente no browser, já que o link direto para o download está ali, dentro do plugin do flash, não concordam? E foi assim que começou a minha escalada para baixar vídeos do Youtube sem programa nenhum ...

Baixando vídeos do Youtube sem programas




Na verdade, não é sem programa nenhum, eu mentí para vocês. Eu uso um browser de verdade, que suporta HTML (Vivo Owned) e que suporta Javascript (TIM Owned) para a tarefa. Nada mais é necessario.

Primeiramente, minha tarefa foi procurar no código das páginas do Youtube para entender como se dava a passagem do endereço do vídeo para o plugin.

Primeiramente vc escolhe a opção Exibir Código fonte e em seguida procura a seguinte string: "watch_fullscreen?".

Em segundo lugar, na string que se sucede, procure por "video_id=" nessa mesma linha e copie tudo até "title", tomando o cuidado de não selecionar além dessa marcação. Exemplo:

No vídeo http://www.youtube.com/watch?v=LQPESY-pndw ...

Procurando por "watch_fullscreen?", eu encontro a seguinte linha:

var fullscreenUrl = '/watch_fullscreen?fs=1&
amp;q=Powerball&fexp=903202&enablecsi=1&watermark=http%3A%2F
%2Fs.ytimg.com%2Fyt%2Fswf%2Flogo-vfl106645.swf%2Chttp%3A%2F
%2Fs.ytimg.com%2Fyt%2Fswf%2Fhdlogo-vfl100714.swf&sourceid=ys&video_id=LQPESY-pndw&sw=0.05&l=129&
amp;sk=Fu1qxrtYsbEpFqawCS8wUEnCTBgs9XPNC&
amp;fmt_map=18%2F512000%2F9%2F0%2F115%2C34%2F0%2F9%2F0%2F115%2C5%2F0%2F7%2F0%2F0&
amp;vq=None&t=vjVQa1PpcFNV887vJ8ef0Z3QNlutTwvEBM59K9a3wy8%3D&hl=pt-br&
plid=AARtveSABDtSxKH9&keywords=Powerball%252CFitness%252CStrength&cr=BR&
amp;title
=Powerball - Akis Kritsinelis 20082rpm';


Uma bagunça, né ?? Mas parte que nos interessa, nesse caso, é a parte em negrito.

Agora, para baixar o vídeo, basta eu pegar essa string e juntar com o seguinte endereço: "http://www.youtube.com/get_video?", que no nosso caso ficaria assim:

http://www.youtube.com/get_video?video_id=LQPESY-pndw&
sw=0.05&l=129&sk=Fu1qxrtYsbEpFqawCS8wUEnCTBgs9XPNC&
amp;fmt_map=18%2F512000%2F9%2F0%2F115%2C34%2F0%2F9%2F0%2F115%2C5%2F0%2F7%2F0%2F0&
amp;vq=None&t=vjVQa1PpcFNV887vJ8ef0Z3QNlutTwvEBM59K9a3wy8%3D&hl=pt-br&
plid=AARtveSABDtSxKH9&keywords=Powerball%252CFitness%252CStrength&cr=BR&
amp;title


Não foi tão fácil, num primeiro momento, identificar o arquivo flv que continha o vídeo. Para a maioria das pessoas esse caminho não é intuitivo e infelismente está bastante sujeito à falhas e erros de BIOS e USB. Eu queria algo mais intuitivo. Eu tinha de fazer muito trabalho para baixar o vídeo (e eu sou muito preguiçoso, podem ter certeza disso). Então pensei novamente: "Será que não há uma forma mais formal de se passar informações de vídeos para o player? E lá fui eu de novo para o código, tentar entender o que acontece ali.

Javascript não é muito minha área, mas conheço o bastante para trabalhar com Json no Python. E na hora que estava conferindo o código da página do vídeo, achei algo interessante:

var swfArgs = {"q": "Powerball", "fexp": "903202",
"enablecsi": "1", "watermark": "http://s.ytimg.com/yt/swf/logo-vfl106645.swf,http:
//s.ytimg.com/yt/swf/hdlogo-vfl100714.swf", "sourceid": "ys", "video_id": "LQPESY-
pndw", "sw": "0.05", "l": 129, "sk": "Fu1qxrtYsbEpFqawCS8wUEnCTBgs9XPNC", "fmt_map":
"18/512000/9/0/115,34/0/9/0/115,5/0/7/0/0", "usef": 0, "vq": null, "t":
"vjVQa1PpcFNV887vJ8ef0Z3QNlutTwvEBM59K9a3wy8=", "hl": "pt-br", "plid":
"AARtveSABDtSxKH9", "keywords": "Powerball%2CFitness%2CStrength", "cr":
"BR"}


Isso nada mais é do que um dicionário de dados que com muita certeza é utilizado pelo player do youtube para obter as informações de que ele precisa para reproduzir. Então, tendo isso em mãos, foi ligeiramenet fácil escrever um script em javascript que interceptasse esse valor e montasse um link para baixar o vídeo, independente de qual vídeo estivéssemos querendo baixar. Segue aí o script:

javascript:window.location.href = "http://youtube.com/get_video?video_id=" + swfArgs["video_id"] + "&sk=" + swfArgs["sk"] + "&l=" + swfArgs["l"] + "&t=" + swfArgs["t"] + "&fmt_map" + swfArgs["fmt_map"];


Mais simples, impossível! No entanto, eu notei que para alguns vídeos esse script dava "invalid parameters". Alguma coisa nesses vídeos devia ser diferente, e impossibilitava o download dos mesmos. Descobri, por "fuçação", que alguns desses parâmetros não precisavam ser preenchidos, e podiam ficar vazios. Então, mudei o script para se adaptar à esses vídeos, da forma como colocada abaixo:

javascript:window.location.href = "http://youtube.com/get_video?video_id=" + swfArgs["video_id"] + "&sk=" + swfArgs["sk"] + "&l=" + swfArgs["l"] + "&t=" + swfArgs["t"];


Com certeza, isso facilita bastante a tarefa de baixar filmes do Youtube, não é mesmo? Tanto que uma das coisas que eu fiz foi colocar esse script na minha barra de favoritos do Firefox para facilitar ainda mais as coisas. Infelismente ele salva o vídeo com o nome de "video.flv", por isso não se esqueçam de renomear o arquivo depois de baixar ou na hora de salvar.

Por hoje é só pessoal !! Até mais !!

P.S.: Vendo agora, vi que o pessoal do Google Blog, usando o mesmo raciocínio que o meu, deu uma outra idéia interessante. Copiem e cole num vídeo do Youtube aí: Baixar Vídeo do Youtube