From 63025f8f48cbcb717865e204a4d6fa15fc43c86a Mon Sep 17 00:00:00 2001 From: techdragon Date: Sat, 27 Jul 2013 19:09:17 +0800 Subject: [PATCH 1/8] Regex for youtube now handles more youtube urls correctly - rev bump --- embed_video/base.py | 3 ++- setup.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/embed_video/base.py b/embed_video/base.py index 1b92b05..dfa45ab 100644 --- a/embed_video/base.py +++ b/embed_video/base.py @@ -94,7 +94,8 @@ class SoundCloundBackend(VideoBackend): class YoutubeBackend(VideoBackend): re_code = re.compile( - r'youtu(?:be\.com/watch\?v=|\.be/)(?P[\w-]*)(&(amp;)?[\w\?=]*)?', + r'(?:http|https|)(?::\/\/|)(?:www.|)(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))(?P[\w\-]{11})[a-z0-9;:@?&%=+\/\$_.-]*', + # r'youtu(?:be\.com/watch\?v=|\.be/)(?P[\w-]*)(&(amp;)?[\w\?=]*)?', re.I ) pattern_url = 'http://www.youtube.com/embed/%s?wmode=opaque' diff --git a/setup.py b/setup.py index a8e3a2e..bb75344 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ CHANGES = read('CHANGES.rst') setup( name='django-embed-video', packages=find_packages(), - version='0.2.0', + version='0.2.1', author='Juda Kaleta', author_email='juda.kaleta@gmail.com', url='https://github.com/yetty/django-embed-video', From bde468db680eeb81c4a5866038171b87c16abc3d Mon Sep 17 00:00:00 2001 From: techdragon Date: Sat, 27 Jul 2013 20:58:11 +0800 Subject: [PATCH 2/8] Better youtube detection logic. - rev bump --- embed_video/base.py | 4 +++- setup.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/embed_video/base.py b/embed_video/base.py index dfa45ab..c1c35c4 100644 --- a/embed_video/base.py +++ b/embed_video/base.py @@ -4,7 +4,8 @@ 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 + r'(?:www.|)?youtu(\.?)be(\.com)?.*', re.I ) DETECT_VIMEO = re.compile( r'^(http(s)?://(www\.)?)?vimeo\.com.*', re.I @@ -95,6 +96,7 @@ class SoundCloundBackend(VideoBackend): class YoutubeBackend(VideoBackend): re_code = re.compile( r'(?:http|https|)(?::\/\/|)(?:www.|)(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))(?P[\w\-]{11})[a-z0-9;:@?&%=+\/\$_.-]*', + # r'(?:http|https|)(?::\/\/|)(?:www.|)(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))(?P[\w\-]{11})[a-z0-9;:@?&%=+\/\$_.-]*', # r'youtu(?:be\.com/watch\?v=|\.be/)(?P[\w-]*)(&(amp;)?[\w\?=]*)?', re.I ) diff --git a/setup.py b/setup.py index bb75344..7b88af4 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ CHANGES = read('CHANGES.rst') setup( name='django-embed-video', packages=find_packages(), - version='0.2.1', + version='0.2.2', author='Juda Kaleta', author_email='juda.kaleta@gmail.com', url='https://github.com/yetty/django-embed-video', From f8693c3c2e918d2a1685ea1c746ad9e15075b514 Mon Sep 17 00:00:00 2001 From: techdragon Date: Sat, 27 Jul 2013 21:26:00 +0800 Subject: [PATCH 3/8] Fixed regex comparator to use search() not match() so it can match the new youtube detection regex. - and rev bump --- embed_video/base.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/embed_video/base.py b/embed_video/base.py index c1c35c4..24b73a3 100644 --- a/embed_video/base.py +++ b/embed_video/base.py @@ -24,7 +24,7 @@ class NoIdFound(Exception): def detect_backend(url): - if DETECT_YOUTUBE.match(url): + if DETECT_YOUTUBE.search(url): return YoutubeBackend(url) elif DETECT_VIMEO.match(url): return VimeoBackend(url) diff --git a/setup.py b/setup.py index 7b88af4..68b0a51 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ CHANGES = read('CHANGES.rst') setup( name='django-embed-video', packages=find_packages(), - version='0.2.2', + version='0.2.3', author='Juda Kaleta', author_email='juda.kaleta@gmail.com', url='https://github.com/yetty/django-embed-video', From 7abfb3e7d2675080da24b7170491e4ae9657740d Mon Sep 17 00:00:00 2001 From: techdragon Date: Thu, 22 Aug 2013 18:19:25 +0800 Subject: [PATCH 4/8] new regexes - updated detection for youtube to detect ok without protocol - updated detection for vimeo to detect ok without protocol - updated vimeo video ID finding regex to handle embed video url format 'player.vimeo.com/video/ID' - updated youtube url to match more of the multiple youtube url formats --- embed_video/base.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/embed_video/base.py b/embed_video/base.py index 73de4c0..57ecc42 100644 --- a/embed_video/base.py +++ b/embed_video/base.py @@ -4,10 +4,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 @@ -56,8 +56,18 @@ class VideoBackend(object): class YoutubeBackend(VideoBackend): re_code = re.compile( - r'youtu(?:be\.com/watch\?v=|\.be/)(?P[\w-]*)(&(amp;)?[\w\?=]*)?', - re.I + # r'youtu(?:be\.com/watch\?v=|\.be/)(?P[\w-]*)(&(amp;)?[\w\?=]*)?', + 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' @@ -73,7 +83,8 @@ class YoutubeBackend(VideoBackend): class VimeoBackend(VideoBackend): - 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): From abc8df0ea08fda386956f3e26ef6098899e72e93 Mon Sep 17 00:00:00 2001 From: techdragon Date: Thu, 22 Aug 2013 20:05:39 +0800 Subject: [PATCH 5/8] trimming the regex comment out since its superfluous and breaks PEP8 --- embed_video/backends.py | 1 - 1 file changed, 1 deletion(-) diff --git a/embed_video/backends.py b/embed_video/backends.py index d52cc35..9c621b6 100644 --- a/embed_video/backends.py +++ b/embed_video/backends.py @@ -94,7 +94,6 @@ class YoutubeBackend(VideoBackend): Backend for YouTube URLs. """ re_code = re.compile( - # r'youtu(?:be\.com/watch\?v=|\.be/)(?P[\w-]*)(&(amp;)?[\w\?=]*)?', r'''youtu(\.?)be(\.com)?/ # match youtube's domains (embed/)? # match the embed url syntax (v/)? From 3f66fc3ef81c9c63092b2b31e8bbbb07b1b0710a Mon Sep 17 00:00:00 2001 From: techdragon Date: Thu, 22 Aug 2013 20:07:19 +0800 Subject: [PATCH 6/8] Added more test cases to the URLs for both youtube and vimeo --- embed_video/tests/tests_backend.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/embed_video/tests/tests_backend.py b/embed_video/tests/tests_backend.py index 86e7e38..24d757b 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 = ( From 2ddc2a0e04a0f58141af3cee3d3dc9d06d1a2204 Mon Sep 17 00:00:00 2001 From: techdragon Date: Thu, 22 Aug 2013 20:19:27 +0800 Subject: [PATCH 7/8] fixed missing commas --- embed_video/tests/tests_backend.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/embed_video/tests/tests_backend.py b/embed_video/tests/tests_backend.py index 24d757b..c99c944 100644 --- a/embed_video/tests/tests_backend.py +++ b/embed_video/tests/tests_backend.py @@ -19,10 +19,10 @@ class EmbedVideoTestCase(TestCase): ('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/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'), From 085b65024a4f71fe578d62ef693417927c445edc Mon Sep 17 00:00:00 2001 From: techdragon Date: Thu, 22 Aug 2013 20:20:57 +0800 Subject: [PATCH 8/8] fixed a test thats failing due to inappropriate inputs. - 13456 is an invalid video ID, its too short. --- embed_video/tests/tests_tags.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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'])