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) + }