Olá pessoal, estou disponibilizando aqui uma função que eu fiz para baixar video do Youtube, com esta função você pode escolher até a qualidade e o tipo de video. A url do Youtube pode estar em qualquer formato. Segue abaixo a função atualizada para 01/2012:
<?php /** @author Leandro Alves Moreira <contato@killme.com.br> @param string $video_url Url do video em qualquer formato @param string $video_savepath Caminho em que sera salvo o arquivo, se nao for setado, ele ira salvar no mesmo diretorio do arquivo. @param string $video_filename Nome do arquivo sem extensao, se nao for setado o nome sera o id do video no Youtube @param string $video_quality Qualidade do video, opcoes: hd1080,hd720,large,medium,small @param string $video_type Tipo de video, opcoes: video/mp4, video/webm, video/x-flv @name getYoutubeVideo @return bool @version 2012-01-29 Download videos Youtube **/ function getYoutubeVideo($video_url = '', $video_savepath = '', $video_filename = '', $video_quality = null, $video_type = null ) { //setando algumas variaveis $video_ext = Array('video/mp4'=>'mp4','video/webm'=>'webm','video/x-flv'=>'flv'); $video_url_dl = ''; $video_found = false; $video_options = Array(); //validando parametros da funcao if(filter_var($video_url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED)) { //pegando html da pagina do youtube $youtube_page = file_get_contents($video_url); //procurando trecho do codigo em JSON $data1 = explode("yt.playerConfig = ", $youtube_page); $data2 = explode("yt.setConfig({",$data1[1]); //atribuindo somente o JSON a uma variavel $youtube_json = substr(trim($data2[0]), 0,-1); //decodificando JSON para Objeto $youtube_json_decoded = json_decode(html_entity_decode($youtube_json)); //inserindo as urls dos videos em um array $youtube_video_urls = explode(',',$youtube_json_decoded->args->url_encoded_fmt_stream_map); foreach($youtube_video_urls AS $key => $val) { //pegando somente a parte que interessa $val = explode(urlencode(';'), $val); //sobrescrevendo em cima da mesma informacao $youtube_video_urls[$key] = urldecode(urldecode(substr($val[0], 4))); } //verifica a qualidade selecionada do video, se a qualidade nao existir no youtube //ou nenhuma for selecionada, a melhor qualidade sera escolhida if(isset($video_quality)) { switch($video_quality) { case 'hd1080': case 'hd720': case 'large': case 'medium': case 'small': $video_options["quality"] = $video_quality; break; default: $video_options["quality"] = 'hd1080'; break; } } else { $video_options["quality"] = 'hd1080'; } //verifica o tipo do video, se tipo nao existir no youtube //ou nenhum for selecionado, mp4 sera escolhida if(isset($video_type)) { switch($video_type) { case 'video/mp4': case 'video/webm': case 'video/x-flv': $video_options["type"] = $video_type; break; default: $video_options["type"] = 'video/mp4'; break; } } else { $video_options["type"] = 'video/mp4'; } //procurando video foreach($youtube_video_urls AS $key => $val) { $parsed_url = parse_url($val); parse_str($parsed_url["query"], $parsed_query); if(in_array($video_options["type"], $parsed_query) && in_array($video_options["quality"], $parsed_query)) { $video_found = true; $video_url_dl = $val; break; } } //se o nome do arquivo nao for setado if(!isset($video_filename)) { $video_filename = $youtube_json_decoded->args->video_id.'.'.$video_ext[$video_options["type"]]; } else { $video_filename = $video_filename.'.'.$video_ext[$video_options["type"]]; } //se o caminho para salvar o arquivo nao for setado if(!isset($video_savepath) || !is_dir($video_savepath)) { $video_savepath = './'; } else { $video_savepath = $video_savepath.'/'; } //se o video foi encontrado if($video_found) { $video_stream = file_get_contents($video_url_dl); } else { $video_stream = file_get_contents($youtube_video_urls[0]); } //fazendo download do video e salvando $handle = fopen($video_savepath.$video_filename, 'w+'); fwrite($handle, $video_stream); fclose($handle); return true; } else { return false; } } ?>
Exemplo de uso:
getYoutubeVideo('http://www.youtube.com/watch?v=nm42UBPnpxI&feature=mh_lolz&list=FLwT0FQqRkWv3Tni9SlrEQuw', 'video/', 'teste2', 'hd720', 'video/mp4');
Essa função já está funcionando com a nova versão 2012 do Youtube, críticas, sugestões e melhorias no código podem ser postadas nos comentários. Obrigado.
olá Leandro, tudo bem? parabéns pelo artigo mas, testei aqui e não consegui fazer o download.
como eu faria este script funcionar para baixar diretamente via geturl, exemplo:
http://www.meusite.com/baixaryoutube.php?url=www.youtube.com/watch?v=Em6nR6k2eeI
tentei setar os parametros que vc especificou mas não obtive sucesso.
agradeço desde já, um forte abraço, Julio.
Não esta funcionando para todos os vídeos do you tube
nao esta funcionando fica carregando nada explica melhor como faz para baixa video