From d234ec5185867bd526646f48e1c015e763f84902 Mon Sep 17 00:00:00 2001 From: DiogoMarques Date: Mon, 18 Jan 2016 13:10:02 +0000 Subject: [PATCH 1/4] Get better resolutions from youtube with fallback for default resolution. --- embed_video/backends.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/embed_video/backends.py b/embed_video/backends.py index c982af8..639bdd0 100644 --- a/embed_video/backends.py +++ b/embed_video/backends.py @@ -18,6 +18,11 @@ EMBED_VIDEO_YOUTUBE_DEFAULT_QUERY +def checkUrl(url): + r = requests.head(url) + return int(r.status_code) < 400 + + class EmbedVideoException(Exception): """ Parental class for all embed_video exceptions """ pass @@ -303,8 +308,14 @@ class YoutubeBackend(VideoBackend): ) pattern_url = '{protocol}://www.youtube.com/embed/{code}' - pattern_thumbnail_url = '{protocol}://img.youtube.com/vi/{code}/hqdefault.jpg' + pattern_thumbnail_url = '{protocol}://img.youtube.com/vi/{code}/{resolution}' default_query = EMBED_VIDEO_YOUTUBE_DEFAULT_QUERY + resolutions = [ + 'maxresdefault.jpg', + 'sddefault.jpg', + 'hqdefault.jpg' + 'mqdefault.jpg', + ] def get_code(self): code = super(YoutubeBackend, self).get_code() @@ -322,6 +333,22 @@ def get_code(self): return code + def get_thumbnail_url(self): + """ + Returns thumbnail URL folded from :py:data:`pattern_thumbnail_url` and + parsed code. + + :rtype: str + """ + for resolution in self.resolutions: + temp_thumbnail_url = self.pattern_thumbnail_url.format( + code=self.code, protocol=self.protocol, resolution=resolution) + if checkUrl(temp_thumbnail_url): + return temp_thumbnail_url + break + return self.pattern_thumbnail_url.format( + code=self.code, protocol=self.protocol, resolution='hqdefault.jpg') + class VimeoBackend(VideoBackend): """ From 6573ef549f3bc41805116d8dca0755dd43b79a0f Mon Sep 17 00:00:00 2001 From: DiogoMarques Date: Mon, 18 Jan 2016 16:03:31 +0000 Subject: [PATCH 2/4] IssueID #53: Fixed code for get thumbnail from youtube, some fixes to testes about django 1.9.1 --- embed_video/backends.py | 13 +++---------- embed_video/tests/backends/tests_youtube.py | 6 ++++++ embed_video/tests/django_settings.py | 2 ++ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/embed_video/backends.py b/embed_video/backends.py index 639bdd0..b1e42b1 100644 --- a/embed_video/backends.py +++ b/embed_video/backends.py @@ -18,11 +18,6 @@ EMBED_VIDEO_YOUTUBE_DEFAULT_QUERY -def checkUrl(url): - r = requests.head(url) - return int(r.status_code) < 400 - - class EmbedVideoException(Exception): """ Parental class for all embed_video exceptions """ pass @@ -313,7 +308,7 @@ class YoutubeBackend(VideoBackend): resolutions = [ 'maxresdefault.jpg', 'sddefault.jpg', - 'hqdefault.jpg' + 'hqdefault.jpg', 'mqdefault.jpg', ] @@ -343,11 +338,9 @@ def get_thumbnail_url(self): for resolution in self.resolutions: temp_thumbnail_url = self.pattern_thumbnail_url.format( code=self.code, protocol=self.protocol, resolution=resolution) - if checkUrl(temp_thumbnail_url): + if int(requests.head(temp_thumbnail_url).status_code) < 400: return temp_thumbnail_url - break - return self.pattern_thumbnail_url.format( - code=self.code, protocol=self.protocol, resolution='hqdefault.jpg') + return None class VimeoBackend(VideoBackend): diff --git a/embed_video/tests/backends/tests_youtube.py b/embed_video/tests/backends/tests_youtube.py index c48732f..23d9e90 100644 --- a/embed_video/tests/backends/tests_youtube.py +++ b/embed_video/tests/backends/tests_youtube.py @@ -40,3 +40,9 @@ def test_thumbnail(self): for url in self.urls: backend = self.instance(url[0]) self.assertIn(url[1], backend.thumbnail) + + def test_get_better_resolution_youtube(self): + backend = self.instance('https://www.youtube.com/watch?v=1Zo0-sWD7xE') + self.assertIn( + 'img.youtube.com/vi/1Zo0-sWD7xE/maxresdefault.jpg', + backend.thumbnail) diff --git a/embed_video/tests/django_settings.py b/embed_video/tests/django_settings.py index e9b53cb..a1c8acf 100644 --- a/embed_video/tests/django_settings.py +++ b/embed_video/tests/django_settings.py @@ -9,6 +9,8 @@ STATIC_URL = MEDIA_URL = '/static/' INSTALLED_APPS = ( + 'django.contrib.contenttypes', + 'django.contrib.auth', 'embed_video', ) From d14876cbe1dcfbacfdefe9e92f1d8ae73983a2cf Mon Sep 17 00:00:00 2001 From: DiogoMarques Date: Tue, 19 Jan 2016 12:14:21 +0000 Subject: [PATCH 3/4] Fixed south test, only for django < 1.9 --- embed_video/fields.py | 18 ++++++++++-------- embed_video/tests/tests_fields.py | 17 +++++++++++------ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/embed_video/fields.py b/embed_video/fields.py index 5619089..c239a42 100644 --- a/embed_video/fields.py +++ b/embed_video/fields.py @@ -1,6 +1,7 @@ from django.db import models from django import forms from django.utils.translation import ugettext_lazy as _ +from django import VERSION from .backends import detect_backend, UnknownIdException, \ UnknownBackendException @@ -19,14 +20,15 @@ def formfield(self, **kwargs): defaults.update(kwargs) return super(EmbedVideoField, self).formfield(**defaults) - def south_field_triple(self): - from south.modelsinspector import introspector - cls_name = '%s.%s' % ( - self.__class__.__module__, - self.__class__.__name__ - ) - args, kwargs = introspector(self) - return (cls_name, args, kwargs) + if VERSION < (1, 9): + def south_field_triple(self): + from south.modelsinspector import introspector + cls_name = '%s.%s' % ( + self.__class__.__module__, + self.__class__.__name__ + ) + args, kwargs = introspector(self) + return (cls_name, args, kwargs) class EmbedVideoFormField(forms.URLField): diff --git a/embed_video/tests/tests_fields.py b/embed_video/tests/tests_fields.py index 2a1f1af..c0bd689 100644 --- a/embed_video/tests/tests_fields.py +++ b/embed_video/tests/tests_fields.py @@ -2,6 +2,7 @@ from unittest import TestCase from django.forms import ValidationError +from django import VERSION from ..fields import EmbedVideoField, EmbedVideoFormField from ..backends import UnknownBackendException, UnknownIdException, \ @@ -16,12 +17,16 @@ def test_formfield_form_class(self): self.assertIsInstance(self.field.formfield(), EmbedVideoFormField) - def test_south(self): - self.assertEqual(self.field.south_field_triple(), - ( - 'embed_video.fields.EmbedVideoField', - [], {'max_length': '200'} - )) + if VERSION < (1, 9): + def test_south(self): + self.assertEqual( + self.field.south_field_triple(), + ( + 'embed_video.fields.EmbedVideoField', + [], + {'max_length': '200'} + ) + ) class EmbedVideoFormFieldTestCase(TestCase): From cb39c24b1f584ea46e2014e2c95430e6ad57a517 Mon Sep 17 00:00:00 2001 From: DiogoMarques Date: Tue, 19 Jan 2016 12:32:15 +0000 Subject: [PATCH 4/4] Changed python version on tests 3.3 to 3.4 due to incompatibility django 1.9 and python 3.3 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0526b78..3e0716a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ sudo: false language: python python: - "2.7" - - "3.3" + - "3.4" cache: pip env: - DJANGO_VERSION=1.5.2