From 15813fa7cbf0242b4a2925f7a15ccb2155aa0d64 Mon Sep 17 00:00:00 2001 From: Brady Moe Date: Wed, 6 Jul 2016 16:21:57 -0500 Subject: [PATCH 1/2] adds wistia backened class and some tests adds wistia video support for embeds --- embed_video/backends.py | 44 ++++++++++++++++++++++ embed_video/settings.py | 1 + embed_video/tests/backends/tests_wistia.py | 31 +++++++++++++++ embed_video/tests/django_settings.py | 1 + 4 files changed, 77 insertions(+) create mode 100644 embed_video/tests/backends/tests_wistia.py diff --git a/embed_video/backends.py b/embed_video/backends.py index b1e42b1..b648c16 100644 --- a/embed_video/backends.py +++ b/embed_video/backends.py @@ -368,6 +368,50 @@ def get_thumbnail_url(self): return self.info.get('thumbnail_large') +class WistiaBackend(VideoBackend): + """ + Backend for Wistia URLs. + """ + domain = None + + re_detect = re.compile(r'https://(?P[a-z]+).wistia.com/medias/*', re.I) + re_code = re.compile(r'''wistia\.com/(medias/(.*/)?|deliveries/)(?P[a-z0-9;:@?&%=+/\$_.-]+)''', re.I) + + pattern_url = '{protocol}://fast.wistia.net/embed/iframe/{code}' + pattern_info = '{protocol}://fast.wistia.net/oembed?url={protocol}%3A%2F%2F{domain}.wistia.com%2Fmedias%2F{code}&embedType=async' + + @cached_property + def width(self): + """ + :rtype: str + """ + return self.info.get('width') + + @cached_property + def height(self): + """ + :rtype: str + """ + return self.info.get('height') + + def get_info(self): + try: + response = requests.get( + self.pattern_info.format(domain=self.domain, code=self.code, protocol=self.protocol), timeout=EMBED_VIDEO_TIMEOUT + ) + return json.loads(response.text) + except ValueError: + raise VideoDoesntExistException() + + def get_thumbnail_url(self): + """ + Returns thumbnail URL folded from :py:data:`pattern_thumbnail_url` and + parsed code. + :rtype: str + """ + return self.info.get('thumbnail_url') + + class SoundCloudBackend(VideoBackend): """ Backend for SoundCloud URLs. diff --git a/embed_video/settings.py b/embed_video/settings.py index b4db923..f24dcdc 100644 --- a/embed_video/settings.py +++ b/embed_video/settings.py @@ -4,6 +4,7 @@ EMBED_VIDEO_BACKENDS = getattr(settings, 'EMBED_VIDEO_BACKENDS', ( 'embed_video.backends.YoutubeBackend', 'embed_video.backends.VimeoBackend', + 'embed_video.backends.WistiaBackend', 'embed_video.backends.SoundCloudBackend', )) """ :type: tuple[str] """ diff --git a/embed_video/tests/backends/tests_wistia.py b/embed_video/tests/backends/tests_wistia.py new file mode 100644 index 0000000..c90e890 --- /dev/null +++ b/embed_video/tests/backends/tests_wistia.py @@ -0,0 +1,31 @@ +import requests +from mock import patch +from unittest import TestCase + +from . import BackendTestMixin +from embed_video.backends import WistiaBackend, VideoDoesntExistException + + +class WistiaBackendTestCase(BackendTestMixin, TestCase): + + urls = ( + ('https://support.wistia.com/medias/26sk4lmiix', '26sk4lmiix'), # This comes from the wistia docs + ('https://home.wistia.com/medias/342jss6yh5', '342jss6yh5'), + ) + + instance = WistiaBackend + + def test_wistia_get_info_exception(self): + with self.assertRaises(VideoDoesntExistException): + backend = WistiaBackend('http://support.wistia.com/123') + backend.get_info() + + def test_get_thumbnail_url(self): + backend = WistiaBackend('https://home.wistia.com/medias/342jss6yh5') + self.assertEqual(backend.get_thumbnail_url(), + 'https://embed-ssl.wistia.com/deliveries/7fc8174a908ad1d349196405671e0fbdaa1e84eb.jpg?image_crop_resized=960x540') + + @patch('embed_video.backends.EMBED_VIDEO_TIMEOUT', 0.000001) + def test_timeout_in_get_info(self): + backend = WistiaBackend('http://support.wistia.com/72304002') + self.assertRaises(requests.Timeout, backend.get_info) diff --git a/embed_video/tests/django_settings.py b/embed_video/tests/django_settings.py index a1c8acf..e4716fe 100644 --- a/embed_video/tests/django_settings.py +++ b/embed_video/tests/django_settings.py @@ -19,6 +19,7 @@ 'embed_video.backends.YoutubeBackend', 'embed_video.backends.VimeoBackend', 'embed_video.backends.SoundCloudBackend', + 'embed_video.backends.WistiaBackend', 'embed_video.tests.backends.tests_custom_backend.CustomBackend', ) From 5a4c84f3f7fcb776af2913e197f5f2f16c8224ae Mon Sep 17 00:00:00 2001 From: Brady Moe Date: Tue, 16 Aug 2016 16:45:17 -0500 Subject: [PATCH 2/2] quickfix to wistia embed --- embed_video/backends.py | 1 + embed_video/tests/backends/tests_wistia.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/embed_video/backends.py b/embed_video/backends.py index b648c16..6fc957a 100644 --- a/embed_video/backends.py +++ b/embed_video/backends.py @@ -373,6 +373,7 @@ class WistiaBackend(VideoBackend): Backend for Wistia URLs. """ domain = None + is_secure = True re_detect = re.compile(r'https://(?P[a-z]+).wistia.com/medias/*', re.I) re_code = re.compile(r'''wistia\.com/(medias/(.*/)?|deliveries/)(?P[a-z0-9;:@?&%=+/\$_.-]+)''', re.I) diff --git a/embed_video/tests/backends/tests_wistia.py b/embed_video/tests/backends/tests_wistia.py index c90e890..3085e55 100644 --- a/embed_video/tests/backends/tests_wistia.py +++ b/embed_video/tests/backends/tests_wistia.py @@ -17,7 +17,7 @@ class WistiaBackendTestCase(BackendTestMixin, TestCase): def test_wistia_get_info_exception(self): with self.assertRaises(VideoDoesntExistException): - backend = WistiaBackend('http://support.wistia.com/123') + backend = WistiaBackend('https://support.wistia.com/123') backend.get_info() def test_get_thumbnail_url(self):