How do I get a YouTube video thumbnail from the YouTube API?

后端 未结 30 2729
Happy的楠姐
Happy的楠姐 2020-11-21 07:06

If I have a YouTube video URL, is there any way to use PHP and cURL to get the associated thumbnail from the YouTube API?

相关标签:
30条回答
  • 2020-11-21 07:49

    Each YouTube video has four generated images. They are predictably formatted as follows:

    https://img.youtube.com/vi/<insert-youtube-video-id-here>/0.jpg
    https://img.youtube.com/vi/<insert-youtube-video-id-here>/1.jpg
    https://img.youtube.com/vi/<insert-youtube-video-id-here>/2.jpg
    https://img.youtube.com/vi/<insert-youtube-video-id-here>/3.jpg
    

    The first one in the list is a full size image and others are thumbnail images. The default thumbnail image (i.e., one of 1.jpg, 2.jpg, 3.jpg) is:

    https://img.youtube.com/vi/<insert-youtube-video-id-here>/default.jpg
    

    For the high quality version of the thumbnail use a URL similar to this:

    https://img.youtube.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg
    

    There is also a medium quality version of the thumbnail, using a URL similar to the HQ:

    https://img.youtube.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg
    

    For the standard definition version of the thumbnail, use a URL similar to this:

    https://img.youtube.com/vi/<insert-youtube-video-id-here>/sddefault.jpg
    

    For the maximum resolution version of the thumbnail use a URL similar to this:

    https://img.youtube.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg
    

    All of the above URLs are available over HTTP too. Additionally, the slightly shorter hostname i3.ytimg.com works in place of img.youtube.com in the example URLs above.

    Alternatively, you can use the YouTube Data API (v3) to get thumbnail images.

    0 讨论(0)
  • 2020-11-21 07:49

    You can use YouTube Data API to retrieve video thumbnails, caption, description, rating, statistics and more. API version 3 requires a key*. Obtain the key and create a videos: list request:

    https://www.googleapis.com/youtube/v3/videos?key=YOUR_API_KEY&part=snippet&id=VIDEO_ID
    

    Example PHP Code

    $data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?key=YOUR_API_KEY&part=snippet&id=T0Jqdjbed40");
    $json = json_decode($data);
    var_dump($json->items[0]->snippet->thumbnails);
    

    Output

    object(stdClass)#5 (5) {
      ["default"]=>
      object(stdClass)#6 (3) {
        ["url"]=>
        string(46) "https://i.ytimg.com/vi/T0Jqdjbed40/default.jpg"
        ["width"]=>
        int(120)
        ["height"]=>
        int(90)
      }
      ["medium"]=>
      object(stdClass)#7 (3) {
        ["url"]=>
        string(48) "https://i.ytimg.com/vi/T0Jqdjbed40/mqdefault.jpg"
        ["width"]=>
        int(320)
        ["height"]=>
        int(180)
      }
      ["high"]=>
      object(stdClass)#8 (3) {
        ["url"]=>
        string(48) "https://i.ytimg.com/vi/T0Jqdjbed40/hqdefault.jpg"
        ["width"]=>
        int(480)
        ["height"]=>
        int(360)
      }
      ["standard"]=>
      object(stdClass)#9 (3) {
        ["url"]=>
        string(48) "https://i.ytimg.com/vi/T0Jqdjbed40/sddefault.jpg"
        ["width"]=>
        int(640)
        ["height"]=>
        int(480)
      }
      ["maxres"]=>
      object(stdClass)#10 (3) {
        ["url"]=>
        string(52) "https://i.ytimg.com/vi/T0Jqdjbed40/maxresdefault.jpg"
        ["width"]=>
        int(1280)
        ["height"]=>
        int(720)
      }
    }
    

    * Not only that you need a key, you might be asked for billing information depending on the number of API requests you plan to make. However, few million requests per day are free.

    Source article.

    0 讨论(0)
  • 2020-11-21 07:49

    If you're using the public API, the best way to do it is using if statements.

    If the video is public or unlisted, you set the thumbnail using the URL method. If the video is private you use the API to get the thumbnail.

    <?php
        if($video_status == 'unlisted'){
            $video_thumbnail = 'http://img.youtube.com/vi/'.$video_url.'/mqdefault.jpg';
            $video_status = '<i class="fa fa-lock"></i>&nbsp;Unlisted';
        }
        elseif($video_status == 'public'){
            $video_thumbnail = 'http://img.youtube.com/vi/'.$video_url.'/mqdefault.jpg';
            $video_status = '<i class="fa fa-eye"></i>&nbsp;Public';
        }
        elseif($video_status == 'private'){
            $video_thumbnail = $playlistItem['snippet']['thumbnails']['maxres']['url'];
            $video_status = '<i class="fa fa-lock"></i>&nbsp;Private';
        }
    
    0 讨论(0)
  • 2020-11-21 07:49

    YouTube is serving thumbnails from 2 servers. You just need to replace <YouTube_Video_ID_HERE> with your own YouTube video id. These days webP is best format for fast loading of images due to small image size.

    https://img.youtube.com https://i.ytimg.com

    Examples are with https://i.ytimg.com server just because it’s shorter, no other particular reason. You can use both.

    Player Background Thumbnail (480x360):

    WebP
    https://i.ytimg.com/vi_webp/<YouTube_Video_ID_HERE>/0.webp
    
    JPG
    https://i.ytimg.com/vi/<YouTube_Video_ID_HERE>/0.jpg
    

    Video frames thumbnails (120x90)

    WebP:
    Start: https://i.ytimg.com/vi_webp/<YouTube_Video_ID_HERE>/1.webp
    Middle: https://i.ytimg.com/vi_webp/<YouTube_Video_ID_HERE>/2.webp
    End: https://i.ytimg.com/vi_webp/<YouTube_Video_ID_HERE>/3.webp
    
    JPG:
    Start: https://i.ytimg.com/vi/<YouTube_Video_ID_HERE>/1.jpg
    Middle: https://i.ytimg.com/vi/<YouTube_Video_ID_HERE>/2.jpg
    End: https://i.ytimg.com/vi/<YouTube_Video_ID_HERE>/3.jpg
    

    Lowest quality thumbnail (120x90)

    WebP
    https://i.ytimg.com/vi_webp/<YouTube_Video_ID_HERE>/default.webp
    
    JPG
    https://i.ytimg.com/vi/<YouTube_Video_ID_HERE>/default.jpg
    

    Medium quality thumbnail (320x180)

    WebP
    https://i.ytimg.com/vi_webp/<YouTube_Video_ID_HERE>/mqdefault.webp
    
    JPG
    https://i.ytimg.com/vi/<YouTube_Video_ID_HERE>/mqdefault.jpg
    

    High quality thumbnail (480x360)

    WebP
    https://i.ytimg.com/vi_webp/<YouTube_Video_ID_HERE>/hqdefault.webp
    
    JPG
    https://i.ytimg.com/vi/<YouTube_Video_ID_HERE>/hqdefault.jpg
    

    Standard quality thumbnail (640x480)

    WebP
    https://i.ytimg.com/vi_webp/<YouTube_Video_ID_HERE>/sddefault.webp
    
    JPG
    https://i.ytimg.com/vi/<YouTube_Video_ID_HERE>/sddefault.jpg
    

    Unscaled thumbnail resolution

    WebP
    https://i.ytimg.com/vi_webp/<YouTube_Video_ID_HERE>/maxresdefault.webp
    
    JPG
    https://i.ytimg.com/vi/<YouTube_Video_ID_HERE>/maxresdefault.jpg
    
    0 讨论(0)
  • 2020-11-21 07:50

    Just to add/expand on the solutions given, I feel it is necessary to note that, as I had this problem myself, one can actually grab multiple YouTube videos content, in this case, thumbnails, with one HTTP request:

    Using a Rest Client, in this case, HTTPFUL, you can do something like this:

    <?php
    header("Content-type", "application/json");
    
    //download the httpfull.phar file from http://phphttpclient.com
    include("httpful.phar");
    
    $youtubeVidIds= array("nL-rk4bgJWU", "__kupr7KQos", "UCSynl4WbLQ", "joPjqEGJGqU", "PBwEBjX3D3Q");
    
    
    $response = \Httpful\Request::get("https://www.googleapis.com/youtube/v3/videos?key=YourAPIKey4&part=snippet&id=".implode (",",$youtubeVidIds)."")
    
    ->send();
    
    print ($response);
    
    ?>
    
    0 讨论(0)
  • 2020-11-21 07:51

    I have used YouTube thumbnails in this way:

    $url = 'http://img.youtube.com/vi/' . $youtubeId . '/0.jpg';
    $img = dirname(__FILE__) . '/youtubeThumbnail_'  . $youtubeId . '.jpg';
    file_put_contents($img, file_get_contents($url));
    

    Remember YouTube prevents to include images directly from their server.

    0 讨论(0)
提交回复
热议问题