Capturando imagens de um vídeo do YouTube ou Vimeo com o PHP

Adaptado do original: http://darcyclarke.me/development/get-image-for-youtube-or-vimeo-videos-from-url/

Prefácio

Quando se está construindo uma aplicação social é sempre uma boa ideia incluir informações relevantes ao contexto. Isso ajuda a melhorar a experiência e torna tudo muito mais legal para o usuário.

Alguns projetos podem necessitar de uma ‘screenshot’ de algum vídeo. Isso é fácil de fazer e deixa seu site mais atraente para o usuário.
Com um script bem simples é possível obter a thumbnail de um vídeo do YouTube ou Vimeo através da URL.

Logo abaixo você vê o snippet que pode ser utilizado em qualquer uma de suas aplicações.

function video_imagem($url){
    $url_imagem = parse_url($url);
    if($url_imagem['host'] == 'www.youtube.com' || $url_imagem['host'] == 'youtube.com'){
        $array = explode("&", $url_imagem['query']);
        return "http://img.youtube.com/vi/".substr($array[0], 2)."/0.jpg";
    } else if($url_imagem['host'] == 'www.vimeo.com' || $url_imagem['host'] == 'vimeo.com'){
        $hash = unserialize(file_get_contents("http://vimeo.com/api/v2/video/".substr($url_imagem['path'], 1).".php"));
        return $hash[0]["thumbnail_small"];
    }
}

Você vai perceber que esse código possui um trecho determinar se a url passada pela função é de um vídeo do YouTube ou Vimeo e os cálculos necessários para trabalhar com ambos.

Seria interessante que você adicionasse uma contenção, caso o link não seja válido.

Para o YouTube

Você pode mudar a seguinte linha no script para retornar um tamanho diferente de imagem.

return "http://img.youtube.com/vi/".substr($array[0], 2)."/0.jpg";

Existem variações de thumbnail disponíveis baseado nas miniaturas escolhidas pelo usuário quando enviou o vídeo. Você pode mudar o número para conseguir uma thumb diferente. Incrementando o número no final da imagem, você verá a próxima thumb disponível.

return "http://img.youtube.com/vi/".substr($array[0], 2)."/default.jpg"; // Pequena - padrão
return "http://img.youtube.com/vi/".substr($array[0], 2)."/0.jpg"; // Grande - padrão
return "http://img.youtube.com/vi/".substr($array[0], 2)."/1.jpg";
return "http://img.youtube.com/vi/".substr($array[0], 2)."/2.jpg";
return "http://img.youtube.com/vi/".substr($array[0], 2)."/3.jpg";

Para o Vimeo

Você pode alterar a seguinte linha no script para retornar um tamanho de imagem diferente do Vimeo:

return $hash[0]["thumbnail_small"];

As variações são:

return $hash[0]["thumbnail_small"];
return $hash[0]["thumbnail_medium"];
return $hash[0]["thumbnail_large"];

Conclusão

As APIs de YouTube e Vimeo possuem muito mais informações que você pode capturar, incluindo o avatar de usuários e outras coisinhas bacanas. Tomara que esse pequeno script ajude a trazer um contexto mais bacana para os seus usuários ao invés de um simples link estático.

  • arthur

    não funciona para o vimeo:

    Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/site/public_html/teste.php on line 8

    • Arthur,

      O problema não é com o script, mas com o seu servidor. O erro mostrado indica que o servidor não permite fazer acesso remoto a URLs.

      Tente ver com a sua hospedagem se é possível liberar isso, senão terá que ir atrás de métodos alternativos pra fazer isso.

  • Thiago

    Não estou conseguindo usar esse código. poderia me ajudar?

  • A quem interessar, fiz uma implementação na função para aceitar os links curtos (http://youtu.be) do YouTube:

    <?php
    function video_imagem ($url) {
    $url = parse_url($url);
    if ($url["host"] == "www.youtube.com" || $url["host"] == "youtube.com") {
    // YouTube
    $array = explode("&", $url["query"]);
    return "http://img.youtube.com/vi/&quot; . substr($array[0], 2) . "/0.jpg";
    } else if ($url["host"] == "youtu.be") {
    // TouTube curto
    return "http://img.youtube.com/vi/&quot; . substr($url["path"], 1) . "/0.jpg";
    } else if ($url["host"] == "www

    video/" . substr($url["path"], 1) . ".php"));
    return $hash[0]["thumbnail_large"];
    }
    }
    ?>

  • Elisangela Silva

    posso usar esse código, mas no lugar em que esta a url do vídeo no youtube, colocar a url do video em meu site?