diff --git a/tests/videodinges/views/test_video.py b/tests/videodinges/views/test_video.py
index 50478d5..967430e 100644
--- a/tests/videodinges/views/test_video.py
+++ b/tests/videodinges/views/test_video.py
@@ -245,52 +245,6 @@ class VideoTestCase(UploadMixin, TestCase):
content,
)
- def test_video_view_renders_transcoding_types_in_correct_order(self):
-
- video = factories.create(
- models.Video,
- title='Vid 1',
- slug='vid-1',
- default_quality='480p',
- )
- factories.create(
- models.Transcoding,
- video=video,
- quality='480p',
- type='video/mp4; codecs="avc1.64001e,mp4a.40.2"',
- url='http://480p.mp4',
- )
- factories.create(
- models.Transcoding,
- video=video,
- quality='480p',
- type='video/webm; codecs="vp9, opus"',
- url='http://480p.vp9.webm',
- )
- factories.create(
- models.Transcoding,
- video=video,
- quality='480p',
- type='video/webm; codecs="vp8, vorbis"',
- url='http://480p.vp8.webm',
- )
-
- resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
-
- self.assertEqual(resp.status_code, 200)
-
- content:str = resp.content.decode(resp.charset)
-
- self.assertInHTML(
- """""",
- content,
- )
-
class VideoWithTrackTestCase(UploadMixin, TestCase):
def setUp(self):
@@ -480,3 +434,228 @@ class VideoWithTrackTestCase(UploadMixin, TestCase):
""",
content,
)
+
+
+class VideoWithCodecOrderCookieTestCase(UploadMixin, TestCase):
+ """ Test the order of the codecs """
+ def setUp(self):
+ super().setUp()
+ self.client = Client()
+
+ self.video = factories.create(
+ models.Video,
+ title='Vid 1',
+ slug='vid-1',
+ default_quality='480p',
+ )
+ factories.create(
+ models.Transcoding,
+ video=self.video,
+ quality='480p',
+ type='video/mp4; codecs="avc1.64001e,mp4a.40.2"',
+ url='http://480p.mp4',
+ )
+ factories.create(
+ models.Transcoding,
+ video=self.video,
+ quality='480p',
+ type='video/webm; codecs="vp9, opus"',
+ url='http://480p.vp9.webm',
+ )
+ factories.create(
+ models.Transcoding,
+ video=self.video,
+ quality='480p',
+ type='video/webm; codecs="vp8, vorbis"',
+ url='http://480p.vp8.webm',
+ )
+
+ def test_video_view_renders_transcoding_types_in_correct_order_without_cookie(self):
+
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
+
+ def test_video_view_renders_transcoding_types_in_correct_order_with_empty_cookie(self):
+
+ self.client.cookies['video_codecs_prio'] = ''
+
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
+
+ def test_video_view_renders_transcoding_types_in_correct_order_with_only_vp8_mentioned(self):
+
+ self.client.cookies['video_codecs_prio'] = 'vp8'
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
+
+ def test_video_view_renders_transcoding_types_in_correct_order_with_only_h264_mentioned(self):
+
+ self.client.cookies['video_codecs_prio'] = 'h.264'
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
+
+ def test_video_view_renders_transcoding_types_in_correct_order_with_vp8_and_h264_mentioned(self):
+
+ self.client.cookies['video_codecs_prio'] = 'vp8 h.264'
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
+
+ def test_video_view_renders_transcoding_types_in_correct_order_with_h264_and_vp8_mentioned(self):
+
+ self.client.cookies['video_codecs_prio'] = 'h.264 vp8'
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
+
+ def test_video_view_renders_transcoding_types_in_correct_order_with_h264_and_vp9_and_vp8_mentioned(self):
+
+ self.client.cookies['video_codecs_prio'] = 'h.264 vp9 vp8'
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
+
+ def test_video_view_renders_transcoding_types_in_correct_order_with_h264_and_vp8_and_vp9_mentioned(self):
+
+ self.client.cookies['video_codecs_prio'] = 'h.264 vp8 vp9'
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
+
+ def test_video_view_renders_transcoding_types_ignores_garbage_in_cookie(self):
+
+ self.client.cookies['video_codecs_prio'] = 'bwarpblergh crap bla'
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
+
+ def test_video_view_renders_transcoding_types_in_correct_order_with_h264_and_vp8_and_crap_and_vp9_mentioned(self):
+
+ self.client.cookies['video_codecs_prio'] = 'h.264 vp8 nonexistent-thing vp9'
+ resp:HttpResponse = self.client.get(reverse('video', args=['vid-1']))
+
+ self.assertEqual(resp.status_code, 200)
+
+ content:str = resp.content.decode(resp.charset)
+
+ self.assertInHTML(
+ """""",
+ content,
+ )
diff --git a/videodinges/views.py b/videodinges/views.py
index 840f0c5..61f2cc3 100644
--- a/videodinges/views.py
+++ b/videodinges/views.py
@@ -44,9 +44,12 @@ def video(request: HttpRequest, slug: str) -> HttpResponse:
}
for transcoding in quality
]
- # sort by transcoding type priority
+
+ client_codec_prios = _get_codec_prios_from_client(request.COOKIES.get('video_codecs_prio', ''))
+ # sort by client desired order, or transcoding type priority
sources.sort(
- key=lambda i: models.get_transcoding_type_by_name(i['type']).priority,
+ key=lambda i: client_codec_prios.get(models.get_transcoding_type_by_name(i['type']).short_name) or \
+ models.get_transcoding_type_by_name(i['type']).priority,
reverse=True
)
template_data['sources'] = sources
@@ -92,3 +95,17 @@ def _url_for(transcoding: models.Transcoding) -> str:
return transcoding.url
elif transcoding.upload:
return transcoding.upload.file.url
+
+def _get_codec_prios_from_client(prio_string: str) -> Dict[str, int]:
+ """
+ Get prios from prio string.
+ For they are more important than build-in prios, they have
+ values higher than the max value of the build-in prios.
+ """
+ max_prio = max(tt.priority for tt in models.transcoding_types) + 1
+ client_codecs_prio = prio_string.split(' ')
+ client_codecs_prio.reverse()
+ return {
+ v: max_prio + i
+ for i, v in enumerate(client_codecs_prio)
+ }