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.