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 diff --git a/embed_video/backends.py b/embed_video/backends.py index c982af8..b1e42b1 100644 --- a/embed_video/backends.py +++ b/embed_video/backends.py @@ -303,8 +303,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 +328,20 @@ 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 int(requests.head(temp_thumbnail_url).status_code) < 400: + return temp_thumbnail_url + return None + class VimeoBackend(VideoBackend): """ 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/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', ) 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):