Search code examples
phpyoutubeyoutube-apigoogle-api-php-clientaspect-ratio

Determine if YouTube video is widescreen?


I would like to know with certainty if a YouTube video is widescreen or not using the v3 API. There are many old videos that have a 4:3 ratio, so I need to detect this.

This was possible with API v2, but it is officially retired now. Here are the API v3 docs.

An API call looks something like this:

https://www.googleapis.com/youtube/v3/videos?id=[VIDEOID]&part=snippet&key=[DEVELOPERKEY]

Also, the thumbnail data always returns dimensions of 4:3, so that doesn't help. Here is an example:

[thumbnails] => Array
(
    [default] => Array
    (
        [url] => https://i.ytimg.com/vi/nnnnnnnnn/default.jpg
        [width] => 120
        [height] => 90
    )
    ...
)

Any ideas?

(I'm currently hacking this by analyzing pixels in the thumbnails where tell-tale black bars on 4:3 videos will be.)

Here is a sample video in 4:3 ratio:

https://www.youtube.com/watch?v=zMJ-Dl4eJu8 (old martial arts video)

martial arts in 4:3

and one in 16:9:

https://www.youtube.com/watch?v=7O2Jqi-LhEI (a new workout video)

workout video


Update: One promising suggestion was to explore fileDetails.videoStreams[].aspectRatio but it seems that this is only available to the video owner. Otherwise requesting fileDetails results in

The request cannot access user rating information. This error may occur because the request is not properly authorized


Solution

  • If you're open to using a different method other than V3 of the API, then I believe it is possible via the oEmbed API.

    http://www.youtube.com/oembed?url={VIDEO_URL}&format=json
    

    Like so:

    http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=zMJ-Dl4eJu8&format=json
    

    Would produce:

    {  
        "provider_url":"https:\/\/www.youtube.com\/",
        "thumbnail_url":"https:\/\/i.ytimg.com\/vi\/zMJ-Dl4eJu8\/hqdefault.jpg",
        "thumbnail_height":360,
        "height":344,
        "type":"video",
        "version":"1.0",
        "html":"\u003ciframe width=\"459\" height=\"344\" src=\"https:\/\/www.youtube.com\/embed\/zMJ-Dl4eJu8?feature=oembed\" frameborder=\"0\" allowfullscreen\u003e\u003c\/iframe\u003e",
        "author_name":"hadronica2",
        "width":459,
        "provider_name":"YouTube",
        "author_url":"https:\/\/www.youtube.com\/user\/hadronica2",
        "title":"Aikido - Kazuo Chiba sensei - 1\u00ba part",
        "thumbnail_width":480
    }
    

    In the examples you've given, the output was as follows:

    http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=zMJ-Dl4eJu8&format=json

    Width: 459
    Height: 344
    Ratio: w/h = 1.3343 = 4:3 (ish)
    

    http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=zMJ-Dl4eJu8&format=json

    Width: 480
    Height: 270
    Ratio: w/h = 1.7777 = 16/9
    

    This appears to work in the examples you've provided.