From cf3104421c2789487c3fed57b3d4ac800958c9bc Mon Sep 17 00:00:00 2001 From: Juda Kaleta Date: Sat, 19 Jul 2014 09:48:00 +0200 Subject: [PATCH 1/2] Catch UnknownIdException, detect video_url in youtube --- embed_video/backends.py | 16 +++++++++------- embed_video/tests/tests_backend.py | 3 ++- embed_video/tests/tests_tags.py | 9 +++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/embed_video/backends.py b/embed_video/backends.py index 332ec11..5eb1595 100644 --- a/embed_video/backends.py +++ b/embed_video/backends.py @@ -36,7 +36,7 @@ class UnknownBackendException(EmbedVideoException): pass -class UnknownIdException(EmbedVideoException): +class UnknownIdException(VideoDoesntExistException): """ Exception thrown if backend is detected, but video ID cannot be parsed. """ @@ -231,13 +231,15 @@ class YoutubeBackend(VideoBackend): code = super(YoutubeBackend, self).get_code() if not code: - parse_data = urlparse.urlparse(self._url) + parsed_url = urlparse.urlparse(self._url) + parsed_qs = urlparse.parse_qs(parsed_url.query) - try: - code = urlparse.parse_qs(parse_data.query)['v'][0] - except KeyError: - raise UnknownIdException( - 'Cannot get ID from `{0}`'.format(self._url)) + if 'v' in parsed_qs: + code = parsed_qs['v'][0] + elif 'video_id' in parsed_qs: + code = parsed_qs['video_id'][0] + else: + raise UnknownIdException('Cannot get ID from `{0}`'.format(self._url)) return code diff --git a/embed_video/tests/tests_backend.py b/embed_video/tests/tests_backend.py index b617d45..e0f8c54 100644 --- a/embed_video/tests/tests_backend.py +++ b/embed_video/tests/tests_backend.py @@ -57,7 +57,8 @@ class YoutubeBackendTestCase(BackendTestMixin, TestCase): ('https://www.youtube.com/watch?v=XPk521voaOE&feature=youtube_gdata_player', 'XPk521voaOE'), ('http://www.youtube.com/watch?v=6xu00J3-g2s&list=PLb5n6wzDlPakFKvJ69rJ9AJW24Aaaki2z', '6xu00J3-g2s'), ('https://m.youtube.com/#/watch?v=IAooXLAPoBQ', 'IAooXLAPoBQ'), - ('https://m.youtube.com/watch?v=IAooXLAPoBQ', 'IAooXLAPoBQ') + ('https://m.youtube.com/watch?v=IAooXLAPoBQ', 'IAooXLAPoBQ'), + ('http://www.youtube.com/edit?video_id=eBea01qmnOE', 'eBea01qmnOE') ) instance = YoutubeBackend diff --git a/embed_video/tests/tests_tags.py b/embed_video/tests/tests_tags.py index 36c7193..64f260f 100644 --- a/embed_video/tests/tests_tags.py +++ b/embed_video/tests/tests_tags.py @@ -97,6 +97,15 @@ class EmbedVideoNodeTestCase(TestCase): rendered = 'http://www.youtube.com/embed/jsrRJyHBvzw?wmode=opaque' self.assertEqual(template.render(self._grc()).strip(), rendered) + def test_tag_youtube_invalid_url(self): + template = Template(""" + {% load embed_video_tags %} + {% video 'http://www.youtube.com/edit?abcd=efgh' as ytb %} + {{ ytb.url }} + {% endvideo %} + """) + self.assertEqual(template.render(self._grc()).strip(), '') + def test_tag_vimeo(self): template = Template(""" {% load embed_video_tags %} From be8796617301e9e3a50e3427383f8b7d46443239 Mon Sep 17 00:00:00 2001 From: Juda Kaleta Date: Sat, 19 Jul 2014 10:08:35 +0200 Subject: [PATCH 2/2] Improve EmbedVideoFormField validation --- embed_video/fields.py | 5 +++-- embed_video/tests/tests_fields.py | 15 ++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/embed_video/fields.py b/embed_video/fields.py index b1aa157..5619089 100644 --- a/embed_video/fields.py +++ b/embed_video/fields.py @@ -38,12 +38,13 @@ class EmbedVideoFormField(forms.URLField): def validate(self, url): # if empty url is not allowed throws an exception super(EmbedVideoFormField, self).validate(url) - + if not url: return try: - detect_backend(url) + backend = detect_backend(url) + backend.get_code() except UnknownBackendException: raise forms.ValidationError(_(u'URL could not be recognized.')) except UnknownIdException: diff --git a/embed_video/tests/tests_fields.py b/embed_video/tests/tests_fields.py index d6946c2..2a1f1af 100644 --- a/embed_video/tests/tests_fields.py +++ b/embed_video/tests/tests_fields.py @@ -4,7 +4,8 @@ from unittest import TestCase from django.forms import ValidationError from ..fields import EmbedVideoField, EmbedVideoFormField -from ..backends import UnknownBackendException, UnknownIdException +from ..backends import UnknownBackendException, UnknownIdException, \ + YoutubeBackend class EmbedVideoFieldTestCase(TestCase): @@ -27,14 +28,14 @@ class EmbedVideoFormFieldTestCase(TestCase): def setUp(self): self.formfield = EmbedVideoFormField() - def test_validation_unknownbackend(self): + def test_validation_unknown_backend(self): with patch('embed_video.fields.detect_backend') as mock_detect_backend: mock_detect_backend.return_value = True mock_detect_backend.side_effect = UnknownBackendException self.assertRaises(ValidationError, self.formfield.validate, ('http://youtube.com/v/123/',)) - def test_validation_unknownid(self): + def test_validation_unknown_id(self): with patch('embed_video.fields.detect_backend') as mock_detect_backend: mock_detect_backend.return_value = True mock_detect_backend.side_effect = UnknownIdException @@ -42,11 +43,15 @@ class EmbedVideoFormFieldTestCase(TestCase): ('http://youtube.com/v/123/',)) def test_validation_correct(self): - url = 'http://my-testing.url.com' + url = 'http://www.youtube.com/watch?v=gauN0gzxTcU' with patch('embed_video.fields.detect_backend') as mock_detect_backend: - mock_detect_backend.return_value = True + mock_detect_backend.return_value = YoutubeBackend(url) self.assertEqual(url, self.formfield.validate(url)) + def test_validation_unknown_code(self): + url = 'http://www.youtube.com/edit?abcd=abcd' + self.assertRaises(ValidationError, self.formfield.validate, url) + def test_validation_super(self): self.assertRaises(ValidationError, self.formfield.validate, '')