mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +00:00 
			
		
		
		
	[ie] Fix m3u8 playlist data corruption (#13588)
Revert 7b81634fb1
Closes #13581
Authored by: bashonly
			
			
This commit is contained in:
		| @@ -36,18 +36,6 @@ class InfoExtractorTestRequestHandler(http.server.BaseHTTPRequestHandler): | |||||||
|             self.send_header('Content-Type', 'text/html; charset=utf-8') |             self.send_header('Content-Type', 'text/html; charset=utf-8') | ||||||
|             self.end_headers() |             self.end_headers() | ||||||
|             self.wfile.write(TEAPOT_RESPONSE_BODY.encode()) |             self.wfile.write(TEAPOT_RESPONSE_BODY.encode()) | ||||||
|         elif self.path == '/fake.m3u8': |  | ||||||
|             self.send_response(200) |  | ||||||
|             self.send_header('Content-Length', '1024') |  | ||||||
|             self.end_headers() |  | ||||||
|             self.wfile.write(1024 * b'\x00') |  | ||||||
|         elif self.path == '/bipbop.m3u8': |  | ||||||
|             with open('test/testdata/m3u8/bipbop_16x9.m3u8', 'rb') as f: |  | ||||||
|                 data = f.read() |  | ||||||
|             self.send_response(200) |  | ||||||
|             self.send_header('Content-Length', str(len(data))) |  | ||||||
|             self.end_headers() |  | ||||||
|             self.wfile.write(data) |  | ||||||
|         else: |         else: | ||||||
|             assert False |             assert False | ||||||
| 
 | 
 | ||||||
| @@ -2091,45 +2079,5 @@ jwplayer("mediaplayer").setup({"abouttext":"Visit Indie DB","aboutlink":"http:\/ | |||||||
|                 self.ie._search_nuxt_json(HTML_TMPL.format(data), None, default=DEFAULT), DEFAULT) |                 self.ie._search_nuxt_json(HTML_TMPL.format(data), None, default=DEFAULT), DEFAULT) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class TestInfoExtractorNetwork(unittest.TestCase): |  | ||||||
|     def setUp(self, /): |  | ||||||
|         self.httpd = http.server.HTTPServer( |  | ||||||
|             ('127.0.0.1', 0), InfoExtractorTestRequestHandler) |  | ||||||
|         self.port = http_server_port(self.httpd) |  | ||||||
| 
 |  | ||||||
|         self.server_thread = threading.Thread(target=self.httpd.serve_forever) |  | ||||||
|         self.server_thread.daemon = True |  | ||||||
|         self.server_thread.start() |  | ||||||
| 
 |  | ||||||
|         self.called = False |  | ||||||
| 
 |  | ||||||
|         def require_warning(*args, **kwargs): |  | ||||||
|             self.called = True |  | ||||||
| 
 |  | ||||||
|         self.ydl = FakeYDL() |  | ||||||
|         self.ydl.report_warning = require_warning |  | ||||||
|         self.ie = DummyIE(self.ydl) |  | ||||||
| 
 |  | ||||||
|     def tearDown(self, /): |  | ||||||
|         self.ydl.close() |  | ||||||
|         self.httpd.shutdown() |  | ||||||
|         self.httpd.server_close() |  | ||||||
|         self.server_thread.join(1) |  | ||||||
| 
 |  | ||||||
|     def test_extract_m3u8_formats(self): |  | ||||||
|         formats, subtitles = self.ie._extract_m3u8_formats_and_subtitles( |  | ||||||
|             f'http://127.0.0.1:{self.port}/bipbop.m3u8', None, fatal=False) |  | ||||||
|         self.assertFalse(self.called) |  | ||||||
|         self.assertTrue(formats) |  | ||||||
|         self.assertTrue(subtitles) |  | ||||||
| 
 |  | ||||||
|     def test_extract_m3u8_formats_warning(self): |  | ||||||
|         formats, subtitles = self.ie._extract_m3u8_formats_and_subtitles( |  | ||||||
|             f'http://127.0.0.1:{self.port}/fake.m3u8', None, fatal=False) |  | ||||||
|         self.assertTrue(self.called, 'Warning was not issued for binary m3u8 file') |  | ||||||
|         self.assertFalse(formats) |  | ||||||
|         self.assertFalse(subtitles) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     unittest.main() |     unittest.main() | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| import base64 | import base64 | ||||||
| import collections | import collections | ||||||
| import contextlib |  | ||||||
| import functools | import functools | ||||||
| import getpass | import getpass | ||||||
| import http.client | import http.client | ||||||
| @@ -2130,33 +2129,21 @@ class InfoExtractor: | |||||||
|                     raise ExtractorError(errnote, video_id=video_id) |                     raise ExtractorError(errnote, video_id=video_id) | ||||||
|                 self.report_warning(f'{errnote}{bug_reports_message()}') |                 self.report_warning(f'{errnote}{bug_reports_message()}') | ||||||
|             return [], {} |             return [], {} | ||||||
|         if note is None: | 
 | ||||||
|             note = 'Downloading m3u8 information' |         res = self._download_webpage_handle( | ||||||
|         if errnote is None: |             m3u8_url, video_id, | ||||||
|             errnote = 'Failed to download m3u8 information' |             note='Downloading m3u8 information' if note is None else note, | ||||||
|         response = self._request_webpage( |             errnote='Failed to download m3u8 information' if errnote is None else errnote, | ||||||
|             m3u8_url, video_id, note=note, errnote=errnote, |  | ||||||
|             fatal=fatal, data=data, headers=headers, query=query) |             fatal=fatal, data=data, headers=headers, query=query) | ||||||
|         if response is False: | 
 | ||||||
|  |         if res is False: | ||||||
|             return [], {} |             return [], {} | ||||||
| 
 | 
 | ||||||
|         with contextlib.closing(response): |         m3u8_doc, urlh = res | ||||||
|             prefix = response.read(512) |         m3u8_url = urlh.url | ||||||
|             if not prefix.startswith(b'#EXTM3U'): |  | ||||||
|                 msg = 'Response data has no m3u header' |  | ||||||
|                 if fatal: |  | ||||||
|                     raise ExtractorError(msg, video_id=video_id) |  | ||||||
|                 self.report_warning(f'{msg}{bug_reports_message()}', video_id=video_id) |  | ||||||
|                 return [], {} |  | ||||||
| 
 |  | ||||||
|             content = self._webpage_read_content( |  | ||||||
|                 response, m3u8_url, video_id, note=note, errnote=errnote, |  | ||||||
|                 fatal=fatal, prefix=prefix, data=data) |  | ||||||
|         if content is False: |  | ||||||
|             return [], {} |  | ||||||
| 
 | 
 | ||||||
|         return self._parse_m3u8_formats_and_subtitles( |         return self._parse_m3u8_formats_and_subtitles( | ||||||
|             content, response.url, ext=ext, entry_protocol=entry_protocol, |             m3u8_doc, m3u8_url, ext=ext, entry_protocol=entry_protocol, | ||||||
|             preference=preference, quality=quality, m3u8_id=m3u8_id, |             preference=preference, quality=quality, m3u8_id=m3u8_id, | ||||||
|             note=note, errnote=errnote, fatal=fatal, live=live, data=data, |             note=note, errnote=errnote, fatal=fatal, live=live, data=data, | ||||||
|             headers=headers, query=query, video_id=video_id) |             headers=headers, query=query, video_id=video_id) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bashonly
					bashonly