Função para baixar videos do Youtube utilizando PHP

Atenção, essa função já não funciona mais no youtube, segue o link desta função atualizada: Nova Função para baixar videos do Youtube utilizando PHP – Janeiro 2012

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:

<!--?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 2011-08-26
    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("'PLAYER_CONFIG': ", $youtube_page);
            $data2 = explode("  });",$data1[1]);
 
            //atribuindo somente o JSON a uma variavel
            $youtube_json = $data2[0];
 
            //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 2011 do Youtube, críticas, sugestões e melhorias no código podem ser postadas nos comentários. Obrigado.

Deixe um comentário

5 Comentários.

  1. Olá, muito bom o script, mais eu gostaria de saber se tem como ao invés de salvar no servidor ele baixar o arquivo para meu computador?

    Agradeço desde já

  2. Olá,

    Há algumas semanas o script parou de funcionar… Alguma correção?

    Obrigado!

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*


Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Trackbacks and Pingbacks: