]> jfr.im git - yt-dlp.git/blobdiff - test/test_InfoExtractor.py
[test:download] Raise on network errors (#10283)
[yt-dlp.git] / test / test_InfoExtractor.py
index 016a2ac7f86a44551dddd22c83c4b006292a877f..31e8f82448d404c1e168391e5740a71a88153628 100644 (file)
@@ -41,7 +41,9 @@ def do_GET(self):
 
 
 class DummyIE(InfoExtractor):
-    pass
+    def _sort_formats(self, formats, field_preference=[]):
+        self._downloader.sort_formats(
+            {'formats': formats, '_format_sort_fields': field_preference})
 
 
 class TestInfoExtractor(unittest.TestCase):
@@ -67,6 +69,7 @@ def test_opengraph(self):
             <meta name="og:test1" content='foo > < bar'/>
             <meta name="og:test2" content="foo >//< bar"/>
             <meta property=og-test3 content='Ill-formatted opengraph'/>
+            <meta property=og:test4 content=unquoted-value/>
             '''
         self.assertEqual(ie._og_search_title(html), 'Foo')
         self.assertEqual(ie._og_search_description(html), 'Some video\'s description ')
@@ -79,6 +82,7 @@ def test_opengraph(self):
         self.assertEqual(ie._og_search_property(('test0', 'test1'), html), 'foo > < bar')
         self.assertRaises(RegexNotFoundError, ie._og_search_property, 'test0', html, None, fatal=True)
         self.assertRaises(RegexNotFoundError, ie._og_search_property, ('test0', 'test00'), html, None, fatal=True)
+        self.assertEqual(ie._og_search_property('test4', html), 'unquoted-value')
 
     def test_html_search_meta(self):
         ie = self.ie
@@ -258,19 +262,19 @@ def test_search_json_ld_realworld(self):
                 ''',
                 {
                     'chapters': [
-                        {"title": "Explosie Turnhout", "start_time": 70, "end_time": 440},
-                        {"title": "Jaarwisseling", "start_time": 440, "end_time": 1179},
-                        {"title": "Natuurbranden Colorado", "start_time": 1179, "end_time": 1263},
-                        {"title": "Klimaatverandering", "start_time": 1263, "end_time": 1367},
-                        {"title": "Zacht weer", "start_time": 1367, "end_time": 1383},
-                        {"title": "FinanciĆ«le balans", "start_time": 1383, "end_time": 1484},
-                        {"title": "Club Brugge", "start_time": 1484, "end_time": 1575},
-                        {"title": "Mentale gezondheid bij topsporters", "start_time": 1575, "end_time": 1728},
-                        {"title": "Olympische Winterspelen", "start_time": 1728, "end_time": 1873},
-                        {"title": "Sober oudjaar in Nederland", "start_time": 1873, "end_time": 2079.23}
+                        {'title': 'Explosie Turnhout', 'start_time': 70, 'end_time': 440},
+                        {'title': 'Jaarwisseling', 'start_time': 440, 'end_time': 1179},
+                        {'title': 'Natuurbranden Colorado', 'start_time': 1179, 'end_time': 1263},
+                        {'title': 'Klimaatverandering', 'start_time': 1263, 'end_time': 1367},
+                        {'title': 'Zacht weer', 'start_time': 1367, 'end_time': 1383},
+                        {'title': 'FinanciĆ«le balans', 'start_time': 1383, 'end_time': 1484},
+                        {'title': 'Club Brugge', 'start_time': 1484, 'end_time': 1575},
+                        {'title': 'Mentale gezondheid bij topsporters', 'start_time': 1575, 'end_time': 1728},
+                        {'title': 'Olympische Winterspelen', 'start_time': 1728, 'end_time': 1873},
+                        {'title': 'Sober oudjaar in Nederland', 'start_time': 1873, 'end_time': 2079.23},
                     ],
-                    'title': 'Het journaal - Aflevering 365 (Seizoen 2021)'
-                }, {}
+                    'title': 'Het journaal - Aflevering 365 (Seizoen 2021)',
+                }, {},
             ),
             (
                 # test multiple thumbnails in a list
@@ -297,13 +301,13 @@ def test_search_json_ld_realworld(self):
                     'thumbnails': [{'url': 'https://www.rainews.it/cropgd/640x360/dl/img/2021/12/30/1640886376927_GettyImages.jpg'}],
                 },
                 {},
-            )
+            ),
         ]
         for html, expected_dict, search_json_ld_kwargs in _TESTS:
             expect_dict(
                 self,
                 self.ie._search_json_ld(html, None, **search_json_ld_kwargs),
-                expected_dict
+                expected_dict,
             )
 
     def test_download_json(self):
@@ -362,7 +366,7 @@ def test_parse_html5_media_entries(self):
                     'height': 740,
                     'tbr': 1500,
                 }],
-                'thumbnail': '//pics.r18.com/digital/amateur/mgmr105/mgmr105jp.jpg'
+                'thumbnail': '//pics.r18.com/digital/amateur/mgmr105/mgmr105jp.jpg',
             })
 
         # from https://www.csfd.cz/
@@ -415,9 +419,9 @@ def test_parse_html5_media_entries(self):
                     'height': 1080,
                 }],
                 'subtitles': {
-                    'cs': [{'url': 'https://video.csfd.cz/files/subtitles/163/344/163344115_4c388b.srt'}]
+                    'cs': [{'url': 'https://video.csfd.cz/files/subtitles/163/344/163344115_4c388b.srt'}],
                 },
-                'thumbnail': 'https://img.csfd.cz/files/images/film/video/preview/163/344/163344118_748d20.png?h360'
+                'thumbnail': 'https://img.csfd.cz/files/images/film/video/preview/163/344/163344118_748d20.png?h360',
             })
 
         # from https://tamasha.com/v/Kkdjw
@@ -448,7 +452,7 @@ def test_parse_html5_media_entries(self):
                     'ext': 'mp4',
                     'format_id': '144p',
                     'height': 144,
-                }]
+                }],
             })
 
         # from https://www.directvnow.com
@@ -466,7 +470,7 @@ def test_parse_html5_media_entries(self):
                 'formats': [{
                     'ext': 'mp4',
                     'url': 'https://cdn.directv.com/content/dam/dtv/prod/website_directvnow-international/videos/DTVN_hdr_HBO_v3.mp4',
-                }]
+                }],
             })
 
         # from https://www.directvnow.com
@@ -484,7 +488,7 @@ def test_parse_html5_media_entries(self):
                 'formats': [{
                     'url': 'https://cdn.directv.com/content/dam/dtv/prod/website_directvnow-international/videos/DTVN_hdr_HBO_v3.mp4',
                     'ext': 'mp4',
-                }]
+                }],
             })
 
         # from https://www.klarna.com/uk/
@@ -543,8 +547,8 @@ def test_extract_jwplayer_data_realworld(self):
                 'id': 'XEgvuql4',
                 'formats': [{
                     'url': 'rtmp://192.138.214.154/live/sjclive',
-                    'ext': 'flv'
-                }]
+                    'ext': 'flv',
+                }],
             })
 
         # from https://www.pornoxo.com/videos/7564/striptease-from-sexy-secretary/
@@ -584,8 +588,8 @@ def test_extract_jwplayer_data_realworld(self):
                 'thumbnail': 'https://t03.vipstreamservice.com/thumbs/pxo-full/2009-12/14/a4b2157147afe5efa93ce1978e0265289c193874e02597.flv-full-13.jpg',
                 'formats': [{
                     'url': 'https://cdn.pornoxo.com/key=MF+oEbaxqTKb50P-w9G3nA,end=1489689259,ip=104.199.146.27/ip=104.199.146.27/speed=6573765/buffer=3.0/2009-12/4b2157147afe5efa93ce1978e0265289c193874e02597.flv',
-                    'ext': 'flv'
-                }]
+                    'ext': 'flv',
+                }],
             })
 
         # from http://www.indiedb.com/games/king-machine/videos
@@ -606,12 +610,12 @@ def test_extract_jwplayer_data_realworld(self):
                 'formats': [{
                     'url': 'http://cdn.dbolical.com/cache/videos/games/1/50/49678/encode_mp4/king-machine-trailer.mp4',
                     'height': 360,
-                    'ext': 'mp4'
+                    'ext': 'mp4',
                 }, {
                     'url': 'http://cdn.dbolical.com/cache/videos/games/1/50/49678/encode720p_mp4/king-machine-trailer.mp4',
                     'height': 720,
-                    'ext': 'mp4'
-                }]
+                    'ext': 'mp4',
+                }],
             })
 
     def test_parse_m3u8_formats(self):
@@ -862,7 +866,7 @@ def test_parse_m3u8_formats(self):
                     'height': 1080,
                     'vcodec': 'avc1.64002a',
                 }],
-                {}
+                {},
             ),
             (
                 'bipbop_16x9',
@@ -913,8 +917,6 @@ def test_parse_m3u8_formats(self):
                     'acodec': 'mp4a.40.2',
                     'video_ext': 'mp4',
                     'audio_ext': 'none',
-                    'vbr': 263.851,
-                    'abr': 0,
                 }, {
                     'format_id': '577',
                     'format_index': None,
@@ -932,8 +934,6 @@ def test_parse_m3u8_formats(self):
                     'acodec': 'mp4a.40.2',
                     'video_ext': 'mp4',
                     'audio_ext': 'none',
-                    'vbr': 577.61,
-                    'abr': 0,
                 }, {
                     'format_id': '915',
                     'format_index': None,
@@ -951,8 +951,6 @@ def test_parse_m3u8_formats(self):
                     'acodec': 'mp4a.40.2',
                     'video_ext': 'mp4',
                     'audio_ext': 'none',
-                    'vbr': 915.905,
-                    'abr': 0,
                 }, {
                     'format_id': '1030',
                     'format_index': None,
@@ -970,8 +968,6 @@ def test_parse_m3u8_formats(self):
                     'acodec': 'mp4a.40.2',
                     'video_ext': 'mp4',
                     'audio_ext': 'none',
-                    'vbr': 1030.138,
-                    'abr': 0,
                 }, {
                     'format_id': '1924',
                     'format_index': None,
@@ -989,52 +985,50 @@ def test_parse_m3u8_formats(self):
                     'acodec': 'mp4a.40.2',
                     'video_ext': 'mp4',
                     'audio_ext': 'none',
-                    'vbr': 1924.009,
-                    'abr': 0,
                 }],
                 {
                     'en': [{
                         'url': 'https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/subtitles/eng/prog_index.m3u8',
                         'ext': 'vtt',
-                        'protocol': 'm3u8_native'
+                        'protocol': 'm3u8_native',
                     }, {
                         'url': 'https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/subtitles/eng_forced/prog_index.m3u8',
                         'ext': 'vtt',
-                        'protocol': 'm3u8_native'
+                        'protocol': 'm3u8_native',
                     }],
                     'fr': [{
                         'url': 'https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/subtitles/fra/prog_index.m3u8',
                         'ext': 'vtt',
-                        'protocol': 'm3u8_native'
+                        'protocol': 'm3u8_native',
                     }, {
                         'url': 'https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/subtitles/fra_forced/prog_index.m3u8',
                         'ext': 'vtt',
-                        'protocol': 'm3u8_native'
+                        'protocol': 'm3u8_native',
                     }],
                     'es': [{
                         'url': 'https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/subtitles/spa/prog_index.m3u8',
                         'ext': 'vtt',
-                        'protocol': 'm3u8_native'
+                        'protocol': 'm3u8_native',
                     }, {
                         'url': 'https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/subtitles/spa_forced/prog_index.m3u8',
                         'ext': 'vtt',
-                        'protocol': 'm3u8_native'
+                        'protocol': 'm3u8_native',
                     }],
                     'ja': [{
                         'url': 'https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/subtitles/jpn/prog_index.m3u8',
                         'ext': 'vtt',
-                        'protocol': 'm3u8_native'
+                        'protocol': 'm3u8_native',
                     }, {
                         'url': 'https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/subtitles/jpn_forced/prog_index.m3u8',
                         'ext': 'vtt',
-                        'protocol': 'm3u8_native'
+                        'protocol': 'm3u8_native',
                     }],
-                }
+                },
             ),
         ]
 
         for m3u8_file, m3u8_url, expected_formats, expected_subs in _TEST_CASES:
-            with open('./test/testdata/m3u8/%s.m3u8' % m3u8_file, encoding='utf-8') as f:
+            with open(f'./test/testdata/m3u8/{m3u8_file}.m3u8', encoding='utf-8') as f:
                 formats, subs = self.ie._parse_m3u8_formats_and_subtitles(
                     f.read(), m3u8_url, ext='mp4')
                 self.ie._sort_formats(formats)
@@ -1372,14 +1366,14 @@ def test_parse_mpd_formats(self):
                             'url': 'https://sdn-global-streaming-cache-3qsdn.akamaized.net/stream/3144/files/17/07/672975/3144-kZT4LWMQw6Rh7Kpd.ism/manifest.mpd',
                             'fragment_base_url': 'https://sdn-global-streaming-cache-3qsdn.akamaized.net/stream/3144/files/17/07/672975/3144-kZT4LWMQw6Rh7Kpd.ism/dash/',
                             'protocol': 'http_dash_segments',
-                        }
-                    ]
+                        },
+                    ],
                 },
-            )
+            ),
         ]
 
         for mpd_file, mpd_url, mpd_base_url, expected_formats, expected_subtitles in _TEST_CASES:
-            with open('./test/testdata/mpd/%s.mpd' % mpd_file, encoding='utf-8') as f:
+            with open(f'./test/testdata/mpd/{mpd_file}.mpd', encoding='utf-8') as f:
                 formats, subtitles = self.ie._parse_mpd_formats_and_subtitles(
                     compat_etree_fromstring(f.read().encode()),
                     mpd_base_url=mpd_base_url, mpd_url=mpd_url)
@@ -1402,6 +1396,7 @@ def test_parse_ism_formats(self):
                     'vcodec': 'none',
                     'acodec': 'AACL',
                     'protocol': 'ism',
+                    'audio_channels': 2,
                     '_download_params': {
                         'stream_type': 'audio',
                         'duration': 8880746666,
@@ -1413,11 +1408,8 @@ def test_parse_ism_formats(self):
                         'sampling_rate': 48000,
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'audio_ext': 'isma',
-                    'video_ext': 'none',
-                    'abr': 128,
                 }, {
                     'format_id': 'video-100',
                     'url': 'https://sdn-global-streaming-cache-3qsdn.akamaized.net/stream/3144/files/17/07/672975/3144-kZT4LWMQw6Rh7Kpd.ism/Manifest',
@@ -1439,11 +1431,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D401FDA0544EFFC2D002CBC40000003004000000C03C60CA80000000168EF32C8',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 100,
                 }, {
                     'format_id': 'video-326',
                     'url': 'https://sdn-global-streaming-cache-3qsdn.akamaized.net/stream/3144/files/17/07/672975/3144-kZT4LWMQw6Rh7Kpd.ism/Manifest',
@@ -1465,11 +1454,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D401FDA0241FE23FFC3BC83BA44000003000400000300C03C60CA800000000168EF32C8',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 326,
                 }, {
                     'format_id': 'video-698',
                     'url': 'https://sdn-global-streaming-cache-3qsdn.akamaized.net/stream/3144/files/17/07/672975/3144-kZT4LWMQw6Rh7Kpd.ism/Manifest',
@@ -1491,11 +1477,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D401FDA0350BFB97FF06AF06AD1000003000100000300300F1832A00000000168EF32C8',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 698,
                 }, {
                     'format_id': 'video-1493',
                     'url': 'https://sdn-global-streaming-cache-3qsdn.akamaized.net/stream/3144/files/17/07/672975/3144-kZT4LWMQw6Rh7Kpd.ism/Manifest',
@@ -1517,11 +1500,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D401FDA011C3DE6FFF0D890D871000003000100000300300F1832A00000000168EF32C8',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 1493,
                 }, {
                     'format_id': 'video-4482',
                     'url': 'https://sdn-global-streaming-cache-3qsdn.akamaized.net/stream/3144/files/17/07/672975/3144-kZT4LWMQw6Rh7Kpd.ism/Manifest',
@@ -1543,11 +1523,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D401FDA01A816F97FFC1ABC1AB440000003004000000C03C60CA80000000168EF32C8',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 4482,
                 }],
                 {
                     'eng': [
@@ -1561,71 +1538,67 @@ def test_parse_ism_formats(self):
                                 'duration': 8880746666,
                                 'timescale': 10000000,
                                 'fourcc': 'TTML',
-                                'codec_private_data': ''
-                            }
-                        }
-                    ]
+                                'codec_private_data': '',
+                            },
+                        },
+                    ],
                 },
             ),
             (
                 'ec-3_test',
                 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
                 [{
-                    'format_id': 'audio_deu_1-224',
+                    'format_id': 'audio_deu-127',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
                     'manifest_url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
                     'ext': 'isma',
-                    'tbr': 224,
+                    'tbr': 127,
                     'asr': 48000,
                     'vcodec': 'none',
-                    'acodec': 'EC-3',
+                    'acodec': 'AACL',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'language': 'deu',
+                    'audio_channels': 2,
+                    '_download_params': {
                         'stream_type': 'audio',
                         'duration': 370000000,
                         'timescale': 10000000,
                         'width': 0,
                         'height': 0,
-                        'fourcc': 'EC-3',
+                        'fourcc': 'AACL',
                         'language': 'deu',
-                        'codec_private_data': '00063F000000AF87FBA7022DFB42A4D405CD93843BDD0700200F00',
+                        'codec_private_data': '1190',
                         'sampling_rate': 48000,
-                        'channels': 6,
+                        'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'audio_ext': 'isma',
-                    'video_ext': 'none',
-                    'abr': 224,
                 }, {
-                    'format_id': 'audio_deu-127',
+                    'format_id': 'audio_deu_1-224',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
                     'manifest_url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
                     'ext': 'isma',
-                    'tbr': 127,
+                    'tbr': 224,
                     'asr': 48000,
                     'vcodec': 'none',
-                    'acodec': 'AACL',
+                    'acodec': 'EC-3',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'language': 'deu',
+                    'audio_channels': 6,
+                    '_download_params': {
                         'stream_type': 'audio',
                         'duration': 370000000,
                         'timescale': 10000000,
                         'width': 0,
                         'height': 0,
-                        'fourcc': 'AACL',
+                        'fourcc': 'EC-3',
                         'language': 'deu',
-                        'codec_private_data': '1190',
+                        'codec_private_data': '00063F000000AF87FBA7022DFB42A4D405CD93843BDD0700200F00',
                         'sampling_rate': 48000,
-                        'channels': 2,
+                        'channels': 6,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'audio_ext': 'isma',
-                    'video_ext': 'none',
-                    'abr': 127,
                 }, {
                     'format_id': 'video_deu-23',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
@@ -1637,8 +1610,8 @@ def test_parse_ism_formats(self):
                     'vcodec': 'AVC1',
                     'acodec': 'none',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'language': 'deu',
+                    '_download_params': {
                         'stream_type': 'video',
                         'duration': 370000000,
                         'timescale': 10000000,
@@ -1649,11 +1622,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '000000016742C00CDB06077E5C05A808080A00000300020000030009C0C02EE0177CC6300F142AE00000000168CA8DC8',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 23,
                 }, {
                     'format_id': 'video_deu-403',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
@@ -1665,8 +1635,8 @@ def test_parse_ism_formats(self):
                     'vcodec': 'AVC1',
                     'acodec': 'none',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'language': 'deu',
+                    '_download_params': {
                         'stream_type': 'video',
                         'duration': 370000000,
                         'timescale': 10000000,
@@ -1677,11 +1647,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D4014E98323B602D4040405000003000100000300320F1429380000000168EAECF2',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 403,
                 }, {
                     'format_id': 'video_deu-680',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
@@ -1693,8 +1660,8 @@ def test_parse_ism_formats(self):
                     'vcodec': 'AVC1',
                     'acodec': 'none',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'language': 'deu',
+                    '_download_params': {
                         'stream_type': 'video',
                         'duration': 370000000,
                         'timescale': 10000000,
@@ -1705,11 +1672,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D401EE981405FF2E02D4040405000000300100000030320F162D3800000000168EAECF2',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 680,
                 }, {
                     'format_id': 'video_deu-1253',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
@@ -1721,8 +1685,9 @@ def test_parse_ism_formats(self):
                     'vcodec': 'AVC1',
                     'acodec': 'none',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'vbr': 1253,
+                    'language': 'deu',
+                    '_download_params': {
                         'stream_type': 'video',
                         'duration': 370000000,
                         'timescale': 10000000,
@@ -1733,11 +1698,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D401EE981405FF2E02D4040405000000300100000030320F162D3800000000168EAECF2',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 1253,
                 }, {
                     'format_id': 'video_deu-2121',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
@@ -1749,8 +1711,8 @@ def test_parse_ism_formats(self):
                     'vcodec': 'AVC1',
                     'acodec': 'none',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'language': 'deu',
+                    '_download_params': {
                         'stream_type': 'video',
                         'duration': 370000000,
                         'timescale': 10000000,
@@ -1761,11 +1723,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D401EECA0601BD80B50101014000003000400000300C83C58B6580000000168E93B3C80',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 2121,
                 }, {
                     'format_id': 'video_deu-3275',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
@@ -1777,8 +1736,8 @@ def test_parse_ism_formats(self):
                     'vcodec': 'AVC1',
                     'acodec': 'none',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'language': 'deu',
+                    '_download_params': {
                         'stream_type': 'video',
                         'duration': 370000000,
                         'timescale': 10000000,
@@ -1789,11 +1748,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D4020ECA02802DD80B501010140000003004000000C83C60C65800000000168E93B3C80',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 3275,
                 }, {
                     'format_id': 'video_deu-5300',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
@@ -1805,8 +1761,8 @@ def test_parse_ism_formats(self):
                     'vcodec': 'AVC1',
                     'acodec': 'none',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'language': 'deu',
+                    '_download_params': {
                         'stream_type': 'video',
                         'duration': 370000000,
                         'timescale': 10000000,
@@ -1817,11 +1773,8 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D4028ECA03C0113F2E02D4040405000000300100000030320F18319600000000168E93B3C80',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 5300,
                 }, {
                     'format_id': 'video_deu-8079',
                     'url': 'https://smstr01.dmm.t-online.de/smooth24/smoothstream_m1/streaming/sony/9221438342941275747/636887760842957027/25_km_h-Trailer-9221571562372022953_deu_20_1300k_HD_H_264_ISMV.ism/Manifest',
@@ -1833,8 +1786,8 @@ def test_parse_ism_formats(self):
                     'vcodec': 'AVC1',
                     'acodec': 'none',
                     'protocol': 'ism',
-                    '_download_params':
-                    {
+                    'language': 'deu',
+                    '_download_params': {
                         'stream_type': 'video',
                         'duration': 370000000,
                         'timescale': 10000000,
@@ -1845,18 +1798,15 @@ def test_parse_ism_formats(self):
                         'codec_private_data': '00000001674D4028ECA03C0113F2E02D4040405000000300100000030320F18319600000000168E93B3C80',
                         'channels': 2,
                         'bits_per_sample': 16,
-                        'nal_unit_length_field': 4
+                        'nal_unit_length_field': 4,
                     },
-                    'video_ext': 'ismv',
-                    'audio_ext': 'none',
-                    'vbr': 8079,
                 }],
                 {},
             ),
         ]
 
         for ism_file, ism_url, expected_formats, expected_subtitles in _TEST_CASES:
-            with open('./test/testdata/ism/%s.Manifest' % ism_file, encoding='utf-8') as f:
+            with open(f'./test/testdata/ism/{ism_file}.Manifest', encoding='utf-8') as f:
                 formats, subtitles = self.ie._parse_ism_formats_and_subtitles(
                     compat_etree_fromstring(f.read().encode()), ism_url=ism_url)
                 self.ie._sort_formats(formats)
@@ -1877,12 +1827,12 @@ def test_parse_f4m_formats(self):
                     'tbr': 2148,
                     'width': 1280,
                     'height': 720,
-                }]
+                }],
             ),
         ]
 
         for f4m_file, f4m_url, expected_formats in _TEST_CASES:
-            with open('./test/testdata/f4m/%s.f4m' % f4m_file, encoding='utf-8') as f:
+            with open(f'./test/testdata/f4m/{f4m_file}.f4m', encoding='utf-8') as f:
                 formats = self.ie._parse_f4m_formats(
                     compat_etree_fromstring(f.read().encode()),
                     f4m_url, None)
@@ -1923,13 +1873,13 @@ def test_parse_xspf(self):
                     }, {
                         'manifest_url': 'https://example.org/src/foo_xspf.xspf',
                         'url': 'https://example.com/track3.mp3',
-                    }]
-                }]
+                    }],
+                }],
             ),
         ]
 
         for xspf_file, xspf_url, expected_entries in _TEST_CASES:
-            with open('./test/testdata/xspf/%s.xspf' % xspf_file, encoding='utf-8') as f:
+            with open(f'./test/testdata/xspf/{xspf_file}.xspf', encoding='utf-8') as f:
                 entries = self.ie._parse_xspf(
                     compat_etree_fromstring(f.read().encode()),
                     xspf_file, xspf_url=xspf_url, xspf_base_url=xspf_url)
@@ -1952,10 +1902,19 @@ def test_response_with_expected_status_returns_content(self):
         server_thread.start()
 
         (content, urlh) = self.ie._download_webpage_handle(
-            'http://127.0.0.1:%d/teapot' % port, None,
+            f'http://127.0.0.1:{port}/teapot', None,
             expected_status=TEAPOT_RESPONSE_STATUS)
         self.assertEqual(content, TEAPOT_RESPONSE_BODY)
 
+    def test_search_nextjs_data(self):
+        data = '<script id="__NEXT_DATA__" type="application/json">{"props":{}}</script>'
+        self.assertEqual(self.ie._search_nextjs_data(data, None), {'props': {}})
+        self.assertEqual(self.ie._search_nextjs_data('', None, fatal=False), {})
+        self.assertEqual(self.ie._search_nextjs_data('', None, default=None), None)
+        self.assertEqual(self.ie._search_nextjs_data('', None, default={}), {})
+        with self.assertWarns(DeprecationWarning):
+            self.assertEqual(self.ie._search_nextjs_data('', None, default='{}'), {})
+
 
 if __name__ == '__main__':
     unittest.main()