diff --git a/embed_video/backends.py b/embed_video/backends.py index fa137b3..db6e631 100644 --- a/embed_video/backends.py +++ b/embed_video/backends.py @@ -10,10 +10,10 @@ import requests import json DETECT_YOUTUBE = re.compile( - r'^(http(s)?://(www\.)?)?youtu(\.?)be(\.com)?/.*', re.I + r'^(http(s)?://)?(www\.)?youtu(\.?)be(\.com)?/.*', re.I ) DETECT_VIMEO = re.compile( - r'^(http(s)?://(www\.)?)?vimeo\.com/.*', re.I + r'^(http(s)?://)?(www\.)?(player\.)?vimeo\.com/.*', re.I ) DETECT_SOUNDCLOUD = re.compile( r'^(http(s)?://(www\.)?)?soundcloud\.com/.*', re.I @@ -100,8 +100,17 @@ class YoutubeBackend(VideoBackend): Backend for YouTube URLs. """ re_code = re.compile( - r'youtu(?:be\.com/watch\?v=|\.be/)(?P[\w-]*)(&(amp;)?[\w\?=]*)?', - re.I + r'''youtu(\.?)be(\.com)?/ # match youtube's domains + (embed/)? # match the embed url syntax + (v/)? + (watch\?v=)? # match the youtube page url + (ytscreeningroom\?v=)? + (feeds/api/videos/)? + (user\S*[^\w\-\s])? + (\S*[^\w\-\s])? + (?P[\w\-]{11})[a-z0-9;:@?&%=+/\$_.-]* # match and extract + ''', + re.I|re.X ) pattern_url = 'http://www.youtube.com/embed/%s?wmode=opaque' pattern_thumbnail_url = 'http://img.youtube.com/vi/%s/hqdefault.jpg' @@ -120,7 +129,8 @@ class VimeoBackend(VideoBackend): """ Backend for Vimeo URLs. """ - re_code = re.compile(r'vimeo\.com/(?P[0-9]+)', re.I) + + re_code = re.compile(r'''vimeo\.com/(video/)?(?P[0-9]+)''', re.I) pattern_url = 'http://player.vimeo.com/video/%s' def get_thumbnail_url(self): diff --git a/embed_video/tests/tests_backend.py b/embed_video/tests/tests_backend.py index 86e7e38..c99c944 100644 --- a/embed_video/tests/tests_backend.py +++ b/embed_video/tests/tests_backend.py @@ -13,19 +13,31 @@ class EmbedVideoTestCase(TestCase): ) youtube_urls = ( - ('http://www.youtube.com/watch?v=jsrRJyHBvzw', 'jsrRJyHBvzw'), - ('http://youtube.com/watch?v=jsrRJyHBvzw', 'jsrRJyHBvzw'), ('http://youtu.be/jsrRJyHBvzw', 'jsrRJyHBvzw'), - ('http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related', 'iwGFalTRHDA'), ('http://youtu.be/n17B_uFF4cA', 'n17B_uFF4cA'), - ('http://www.youtube.com/watch?v=t-ZRX8984sc', 't-ZRX8984sc'), ('http://youtu.be/t-ZRX8984sc', 't-ZRX8984sc'), + ('https://youtu.be/t-ZRX8984sc', 't-ZRX8984sc'), + ('http://youtube.com/watch?v=jsrRJyHBvzw', 'jsrRJyHBvzw'), + ('https://youtube.com/watch?v=jsrRJyHBvzw', 'jsrRJyHBvzw'), + ('http://www.youtube.com/v/0zM3nApSvMg?rel=0', '0zM3nApSvMg'), + ('https://www.youtube.com/v/0zM3nApSvMg?rel=0', '0zM3nApSvMg'), + ('http://www.youtube.com/embed/0zM3nApSvMg?rel=0', '0zM3nApSvMg'), + ('https://www.youtube.com/embed/0zM3nApSvMg?rel=0', '0zM3nApSvMg'), + ('http://www.youtube.com/watch?v=jsrRJyHBvzw', 'jsrRJyHBvzw'), + ('https://www.youtube.com/watch?v=t-ZRX8984sc', 't-ZRX8984sc'), + ('http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related', 'iwGFalTRHDA'), + ('https://www.youtube.com/watch?v=iwGFalTRHDA&feature=related', 'iwGFalTRHDA'), ('http://www.youtube.com/watch?feature=player_embedded&v=2NpZbaAIXag', '2NpZbaAIXag'), + ('https://www.youtube.com/watch?feature=player_embedded&v=2NpZbaAIXag', '2NpZbaAIXag'), ) vimeo_urls = ( ('http://vimeo.com/66577491', '66577491'), + ('https://vimeo.com/66577491', '66577491'), ('http://www.vimeo.com/66577491', '66577491'), + ('https://www.vimeo.com/66577491', '66577491'), + ('http://player.vimeo.com/video/66577491', '66577491'), + ('https://player.vimeo.com/video/66577491', '66577491'), ) soundcloud_urls = ( diff --git a/embed_video/tests/tests_tags.py b/embed_video/tests/tests_tags.py index 08f56e8..25957d0 100644 --- a/embed_video/tests/tests_tags.py +++ b/embed_video/tests/tests_tags.py @@ -120,11 +120,11 @@ class EmbedVideoNodeTestCase(TestCase): self.assertEqual(str(node), '') def test_embed_get_params(self): - url = 'http://youtu.be/13456' + url = 'http://youtu.be/jsrRJyHBvzw' backend = YoutubeBackend(url) params = _embed_get_params(backend, (3, 8)) - self.assertEqual('http://www.youtube.com/embed/13456?wmode=opaque', params['url']) + self.assertEqual('http://www.youtube.com/embed/jsrRJyHBvzw?wmode=opaque', params['url']) self.assertEqual(3, params['width']) self.assertEqual(8, params['height'])