Skip to content

Instantly share code, notes, and snippets.

@bacoords
Last active March 19, 2026 09:40
Show Gist options
  • Select an option

  • Save bacoords/77ee4d13dfa76db03981cb4eb0df0c6f to your computer and use it in GitHub Desktop.

Select an option

Save bacoords/77ee4d13dfa76db03981cb4eb0df0c6f to your computer and use it in GitHub Desktop.
Grab a thumbnail of a private (but embeddable) Vimeo video
<?php
/**
* Grab the url of a publicly embeddable video hosted on vimeo
* @param str $video_url The "embed" url of a video
* @return str The url of the thumbnail, or false if there's an error
*/
function grab_vimeo_thumbnail($vimeo_url){
if( !$vimeo_url ) return false;
$data = json_decode( file_get_contents( 'http://vimeo.com/api/oembed.json?url=' . $vimeo_url ) );
if( !$data ) return false;
return $data->thumbnail_url;
}
@shaunkardinal
Copy link
Copy Markdown

unfortunately the PHP object only contains the one thumbnail_url, which is generally 640x360.

example https://vimeo.com/api/oembed.json?url=https://vimeo.com/311468941 returns

{"type":"video","version":"1.0","provider_name":"Vimeo","provider_url":"https:\/\/vimeo.com\/","title":"olson kundig | space needle century project | seattle","author_name":"nic lehoux","author_url":"https:\/\/vimeo.com\/niclehoux","is_plus":"1","account_type":"plus","html":"<iframe src=\"https:\/\/player.vimeo.com\/video\/311468941?h=674979c981&amp;app_id=122963\" width=\"640\" height=\"360\" frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture\" allowfullscreen title=\"olson kundig | space needle century project | seattle\"><\/iframe>","width":640,"height":360,"duration":158,"description":"","thumbnail_url":"https:\/\/i.vimeocdn.com\/video\/752300323-c9b7699f9dc14ec1484a39edca5506c5bf745e081cdab9d08fd9fc9c841d1183-d_640","thumbnail_width":640,"thumbnail_height":360,"thumbnail_url_with_play_button":"https:\/\/i.vimeocdn.com\/filter\/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F752300323-c9b7699f9dc14ec1484a39edca5506c5bf745e081cdab9d08fd9fc9c841d1183-d_640&src1=http%3A%2F%2Ff.vimeocdn.com%2Fp%2Fimages%2Fcrawler_play.png","upload_date":"2019-01-15 10:03:56","video_id":311468941,"uri":"\/videos\/311468941"}

getting the 1080p image is still possible via JS, but delivering via PHP would be ideal! welcome any other takes here...

@fo-rk
Copy link
Copy Markdown

fo-rk commented Feb 8, 2023

Hey @shaunkardinal, have a look at my last comment: you can use PHP to replace the ..._640 at the end of thumbnail_url with any crop you like, eg _1920x1080. It's undocumented, but works.

@shaunkardinal
Copy link
Copy Markdown

oh! i see the issue, a classic—the example code you gave had the separator/string mixed up! thanks again @monowales 🙏

return explode('_', $data->thumbnail_url)[0].'_1920x1080';

@sigkappel
Copy link
Copy Markdown

I just removed the resolution entirely and it give me the highest resolution image
return explode('_', $data->thumbnail_url)[0]

@Harsh-finology
Copy link
Copy Markdown

Does this work for private videos as well?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment