Get video id from Vimeo url

27,412

Solution 1

Since 2016. And @Martin Ender said no longer up to date


So here is a API solution : (without regexp but API caller and safe!)

jQuery :

function GetVimeoIDbyUrl(url) {
  var id = false;
  $.ajax({
    url: 'https://vimeo.com/api/oembed.json?url='+url,
    async: false,
    success: function(response) {
      if(response.video_id) {
        id = response.video_id;
      }
    }
  });
  return id;
}

Minify :

function GetVimeoIDbyUrl(e){var i=!1;return $.ajax({url:"https://vimeo.com/api/oembed.json?url="+e,async:!1,success:function(e){e.video_id&&(i=e.video_id)}}),i}

Pure/Native JS : (IE9+ & Modern browsers)

function GetVimeoIDbyUrl(url) {
  var id = false;
  var request = new XMLHttpRequest();
  request.open('GET', 'https://vimeo.com/api/oembed.json?url='+url , false);
  request.onload = function() {
    if (request.status >= 200 && request.status < 400) {
      var response = JSON.parse(request.responseText);
      if(response.video_id) {
        id = response.video_id;
      }
    }
  };
  request.send();
  return id;
}

Minify :

function GetVimeoIDbyUrl(e){var t=!1,o=new XMLHttpRequest;return o.open("GET","https://vimeo.com/api/oembed.json?url="+e,!1),o.onload=function(){if(o.status>=200&&o.status<400){var e=JSON.parse(o.responseText);e.video_id&&(t=e.video_id)}},o.send(),t}

Demo : https://jsbin.com/mevejoxudo/1/edit?js,output

Some type of url doesn't support ? : https://vimeo.com/help/contact#tech-api ( Tell them, dont tell me hehe :D )

Solution 2

Update: I notice that this answer is getting some attention every now and then (through votes or comments). The answer is more than two years old, and likely the URL types supported are no longer up to date. I will not actively maintain this regex - it is merely intended as an answer to the question and hence only takes care of the formats listed there. Use this at your own risk, or - even better - use it merely as a starting point to develop your own regex based on an up-to-date and comprehensive list of URL formats.

See @l2aelba's answer for API solution https://stackoverflow.com/a/37695721/622813


This would be the full regex, which also ensures that the format is correct:

/https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)/

You can now retrieve the group name in capturing group 1 (if present), the album ID in capturing group 2 (if present) and the video ID in capturing group 3 (always).

Demo

Solution 3

var r = /(videos|video|channels|\.com)\/([\d]+)/,
    a = "https://vimeo.com/album/2222222/video/11111111";

console.log(a.match(r)[2]); // 11111111;

http://jsbin.com/asuqic/7/edit

Solution 4

The following regex will return the id on group 1 for those who only want to retrieve this information. It works with all the example URLs given in the question. It also works without http:// and https://. It also works with URLs like player.vimeo.com/...

/^.*(?:vimeo.com)\\/(?:channels\\/|groups\\/[^\\/]*\\/videos\\/|album\\/\\d+\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?)/
Share:
27,412
l2aelba
Author by

l2aelba

https://paypal.me/l2aelba

Updated on July 05, 2020

Comments

  • l2aelba
    l2aelba almost 4 years

    I'm trying to find the best regexp to fetch vimeo video id from URL.

    Example urls :

    https://vimeo.com/11111111
    http://vimeo.com/11111111
    https://www.vimeo.com/11111111
    http://www.vimeo.com/11111111
    https://vimeo.com/channels/11111111
    http://vimeo.com/channels/11111111
    https://vimeo.com/groups/name/videos/11111111
    http://vimeo.com/groups/name/videos/11111111
    https://vimeo.com/album/2222222/video/11111111
    http://vimeo.com/album/2222222/video/11111111
    https://vimeo.com/11111111?param=test
    http://vimeo.com/11111111?param=test
    

    My current regexp which doesn't work:

    /http:\/\/(www\.)?vimeo.com\/(\d+)($|\/)/
    

    Playground & Test here : http://jsbin.com/asuqic/1/edit?javascript,live

  • l2aelba
    l2aelba over 11 years
    some error ? Line 1: vimeo_Reg = /https?:\/\/(?:www\.)?vimeo.com\/(?:channels\/|groups\/[^\/]‌​*\/videos\/|album\/\‌​d+\/video\/|)(\d+)($‌​|\/|?)/; --- Unescaped '?'.
  • Martin Ender
    Martin Ender over 11 years
    @l2aelba sorry, copy paste mistake. copy the code from my answer into the demo.
  • l2aelba
    l2aelba over 11 years
    can you edit your demo link to jsbin.com/asuqic/11/edit?javascript,live ? i think your answer will be accepted :D
  • Martin Ender
    Martin Ender over 11 years
    @l2aelba then I guess I had the wrong link in my answer again :D ... anyway, all settled now ;)
  • Aurelin
    Aurelin almost 10 years
    I came across a link that goes vimeo.com/channels/channelname/video_id (probably because this thread is a bit old) which isn't covered by your result. I changed it up to /https?:\/\/(?:www\.)?vimeo.com\/(?:channels\/\w*\/*|groups\‌​/([^\/]*)\/videos\/|‌​album\/(\d+)\/video\‌​/|)(\d+)(?:$|\/|\?)/‌​; But then I get the wrong result for "vimeo.com/11111111". Maybe you can see right away what I am doing wrong haha
  • Martin Ender
    Martin Ender almost 10 years
    @Aurelin I think you wanted channels\/(?:\w+\/)? in order to ensure that there is another / after the channel name parameter. I'll edit the post, and finally fix that typo.
  • Aurelin
    Aurelin almost 10 years
    Ah yes thank you! What is the ?: for, if you don't mind explaining?
  • Martin Ender
    Martin Ender almost 10 years
  • Raghav
    Raghav over 9 years
  • Kareem Elshahawy
    Kareem Elshahawy about 9 years
    I'm not expert in javascript regex and I can't support this kind of urls "vimeo.com/user18322218/review/66338120/7678a41439" can you handle it?
  • Gary Willoughby
    Gary Willoughby about 9 years
    Is there such a thing for youtube?
  • Didier Ghys
    Didier Ghys almost 9 years
    Here is the unescaped version + added support for vimeo.com/channels/channelname/1111111111: /^.*(?:vimeo.com)\/(?:channels\/|channels\/\w+\/|groups\/[^\‌​/]*\/videos\/|album\‌​/\d+\/video\/|video\‌​/|)(\d+)(?:$|\/|\?)/
  • Niko Jojo
    Niko Jojo about 8 years
    it will return : 11111111?param=test
  • ForguesR
    ForguesR almost 8 years
    It would be nice to retrieve playback starting time with a capturing group 4. For instance vimeo.com/11111111#t=1m2s.