web-dev-qa-db-fra.com

Récupérer la plus haute résolution de vignettes YouTube

Je veux obtenir la plus haute vignette youtube "maxresdefault.jpg"

Comme celui-ci

http://i.ytimg.com/vi/Cj6ho1-G6tw/maxresdefault.jpg

J'utilise ce code php simple

<?php

$youtub_id = "Cj6ho1-G6tw";
echo "http://i.ytimg.com/vi/".$youtub_id."/maxresdefault.jpg";

?>

Le problème avec le code ci-dessus est qu'il existe des vidéos comme celle-ci http://youtu.be/VGazSZUYyf4NOT HD

Et le résultat est gris petit 404 image de youtube

http://i.ytimg.com/vi/VGazSZUYyf4/maxresdefault.jpg

Alors, comment obtenir la plus haute vignette YouTube, donc si "maxresdefault" n'est pas disponible, obtenez la prochaine grande vignette "hqdefault", sinon, obtenez le prochain "mqdefault" etc ...

J'ai essayé d'utiliser gdata youtube mais de toute façon la vidéo hd ou non "maxresdefault" ne s'affiche pas.

14
Jim

La raison en est que la résolution sur Tirer le meilleur parti des cartes n’est pas d’au moins 720p.

En regardant le api pour cette vidéo spécifique , vous pouvez voir qu’il n’ya pas de maxresdefault.

Seules les vidéos dont la résolution est 720p ou supérieure ont maxresdefault. Ceci n'est pas répertorié dans l'API dans les vidéos supérieures. Donc, afin d’obtenir la résolution la plus élevée possible, vous devriez également vérifier si la variable maxresdefault fonctionne également.

<media:thumbnail url='http://i1.ytimg.com/vi/VGazSZUYyf4/default.jpg' height='90' width='120' time='00:15:12.500' yt:name='default'/>
<media:thumbnail url='http://i1.ytimg.com/vi/VGazSZUYyf4/mqdefault.jpg' height='180' width='320' yt:name='mqdefault'/>
<media:thumbnail url='http://i1.ytimg.com/vi/VGazSZUYyf4/hqdefault.jpg' height='360' width='480' yt:name='hqdefault'/>
<media:thumbnail url='http://i1.ytimg.com/vi/VGazSZUYyf4/1.jpg' height='90' width='120' time='00:07:36.250' yt:name='start'/>
<media:thumbnail url='http://i1.ytimg.com/vi/VGazSZUYyf4/2.jpg' height='90' width='120' time='00:15:12.500' yt:name='middle'/>
<media:thumbnail url='http://i1.ytimg.com/vi/VGazSZUYyf4/3.jpg' height='90' width='120' time='00:22:48.750' yt:name='end'/>

Votre meilleure option pour une vignette de la plus haute qualité est d’utiliser l’API et d’obtenir l’image avec le plus grand attribut yt:name.

La commande est:

default
mqdefault
hqdefault
sddefault

Exemple de code de cela en action:

<?php

$youtub_id = "VGazSZUYyf4";

$images = json_decode(file_get_contents("http://gdata.youtube.com/feeds/api/videos/".$youtub_id."?v=2&alt=json"), true);
$images = $images['entry']['media$group']['media$thumbnail'];
$image  = $images[count($images)-4]['url'];

$maxurl = "http://i.ytimg.com/vi/".$youtub_id."/maxresdefault.jpg";
$max    = get_headers($maxurl);

if (substr($max[0], 9, 3) !== '404') {
    $image = $maxurl;   
}

echo '<img src="'.$image.'">';

Cela fonctionne à la fois sur $youtub_id = "Cj6ho1-G6tw"; et $youtub_id = "VGazSZUYyf4";.

18
David Chen

Vous pouvez utiliser getimagesize() et vérifier si l'image existe (il y a aussi file_exists(), mais cela pourrait ne pas fonctionner très bien dans ce cas).

Vous pouvez utiliser cette fonction pour récupérer la capture d'écran de la résolution la plus élevée d'une vidéo particulière.

Code:

function fetch_highest_res ($videoid) {
    $resolutions = array('maxresdefault', 'hqdefault', 'mqdefault');     
    foreach($resolutions as $res) {
        $imgUrl = "http://i.ytimg.com/vi/$videoid/$res.jpg";
        if(@getimagesize(($imgUrl))) 
            return $imgUrl;
    }
}

Utilisation:

echo fetch_highest_res('Cj6ho1-G6tw').'<br>';
echo fetch_highest_res('VGazSZUYyf4');

Sortie:

http://i.ytimg.com/vi/Cj6ho1-G6tw/maxresdefault.jpg
http://i.ytimg.com/vi/VGazSZUYyf4/hqdefault.jpg

Remarque: Cette solution n'est peut-être pas la meilleure et constitue un contournement si vous ne souhaitez pas utiliser l'API.

7
Amal Murali

Toutes les autres réponses qui dépendent du nettoyage d'URL statique ne sont pas prises en charge. Ils peuvent être modifiés et vous devrez peut-être modifier votre application à tout moment.

Pour cela, vous devez utiliser Data API v3 . Vous devriez aller avec une requête videos-> list avec id = videoId et part = snippet. Dans la réponse, vous allez vérifier snippet.thumbnails. ['High']. Url

6
Ibrahim Ulukaya

Grâce à la réponse d'Ibrahim Ulukaya, j'ai pu comprendre pourquoi la réponse correcte de David Chen ne fonctionnait plus; Google a déconseillé d'utiliser cette API. (Méchant, méchant, méchant, méchant, Google .)

L'URL suivante renverra une liste d'objets miniatures à l'aide de Data API v3 :

https://www.googleapis.com/youtube/v3/videos?id={VIDEO_ID}&key={API_KEY}&part=snippet&fields=items/snippet/thumbnails

Le {VIDEO_ID} peut être trouvé dans toute URL de vidéo YouTube et le {API_KEY} vous oblige à:

Une fois que vous avez l'URL avec vos VIDEO_ID et API_KEY substitués aux espaces réservés, vous devriez récupérer un JSON qui ressemble à ceci:

{
 "items": [
  {
   "snippet": {
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/7Ey-Xkwn1s0/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/7Ey-Xkwn1s0/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/7Ey-Xkwn1s0/hqdefault.jpg",
      "width": 480,
      "height": 360
     },
     "standard": {
      "url": "https://i.ytimg.com/vi/7Ey-Xkwn1s0/sddefault.jpg",
      "width": 640,
      "height": 480
     },
     "maxres": {
      "url": "https://i.ytimg.com/vi/7Ey-Xkwn1s0/maxresdefault.jpg",
      "width": 1280,
      "height": 720
     }
    }
   }
  }
 ]
}

À partir de là, je suppose que vous saurez quoi faire ...?

J'espère que cela t'aides.

1
MikeSchinkel