Attemps to handle this: yt-dlp/yt-dlp#4381
How to use:
yt-dlp --fix-fake-header m3u8_url
Attemps to handle this: yt-dlp/yt-dlp#4381
How to use:
yt-dlp --fix-fake-header m3u8_url
| diff --git a/README.md b/README.md | |
| index 2df72b749..e3ebd1232 100644 | |
| --- a/README.md | |
| +++ b/README.md | |
| @@ -526,6 +526,7 @@ ## Download Options: | |
| downloading is finished | |
| --no-keep-fragments Delete downloaded fragments after | |
| downloading is finished (default) | |
| + --fix-fake-header Fix fake header | |
| --buffer-size SIZE Size of download buffer, e.g. 1024 or 16K | |
| (default is 1024) | |
| --resize-buffer The buffer size is automatically resized | |
| diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py | |
| index a7665159b..9d5f883da 100644 | |
| --- a/yt_dlp/__init__.py | |
| +++ b/yt_dlp/__init__.py | |
| @@ -846,6 +846,7 @@ def parse_options(argv=None): | |
| 'retry_sleep_functions': opts.retry_sleep, | |
| 'skip_unavailable_fragments': opts.skip_unavailable_fragments, | |
| 'keep_fragments': opts.keep_fragments, | |
| + 'fix_fake_header': opts.fix_fake_header, | |
| 'concurrent_fragment_downloads': opts.concurrent_fragment_downloads, | |
| 'buffersize': opts.buffersize, | |
| 'noresizebuffer': opts.noresizebuffer, | |
| diff --git a/yt_dlp/downloader/external.py b/yt_dlp/downloader/external.py | |
| index 6c1ec403c..8e467aedc 100644 | |
| --- a/yt_dlp/downloader/external.py | |
| +++ b/yt_dlp/downloader/external.py | |
| @@ -181,7 +181,11 @@ def _call_downloader(self, tmpfilename, info_dict): | |
| continue | |
| self.report_error(f'Unable to open fragment {frag_index}; {err}') | |
| return -1 | |
| - dest.write(decrypt_fragment(fragment, src.read())) | |
| + frag_content = src.read() | |
| + if self.params.get('fix_fake_header'): | |
| + ts_start_pos = frag_content.find(b'\x47\x40') | |
| + frag_content = frag_content[ts_start_pos:] | |
| + dest.write(decrypt_fragment(fragment, frag_content)) | |
| src.close() | |
| if not self.params.get('keep_fragments', False): | |
| self.try_remove(encodeFilename(fragment_filename)) | |
| diff --git a/yt_dlp/downloader/fragment.py b/yt_dlp/downloader/fragment.py | |
| index 0d00196e2..f79839c1f 100644 | |
| --- a/yt_dlp/downloader/fragment.py | |
| +++ b/yt_dlp/downloader/fragment.py | |
| @@ -141,6 +141,9 @@ def _read_fragment(self, ctx): | |
| raise | |
| ctx['fragment_filename_sanitized'] = frag_sanitized | |
| frag_content = down.read() | |
| + if self.params.get('fix_fake_header'): | |
| + ts_start_pos = frag_content.find(b'\x47\x40') | |
| + frag_content = frag_content[ts_start_pos:] | |
| down.close() | |
| return frag_content | |
| diff --git a/yt_dlp/options.py b/yt_dlp/options.py | |
| index 6c6a0b3f9..d36761be6 100644 | |
| --- a/yt_dlp/options.py | |
| +++ b/yt_dlp/options.py | |
| @@ -973,6 +973,10 @@ def _alias_callback(option, opt_str, value, parser, opts, nargs): | |
| '--no-keep-fragments', | |
| action='store_false', dest='keep_fragments', | |
| help='Delete downloaded fragments after downloading is finished (default)') | |
| + downloader.add_option( | |
| + '--fix-fake-header', | |
| + action='store_true', dest='fix_fake_header', default=False, | |
| + help='Fix fake header') | |
| downloader.add_option( | |
| '--buffer-size', | |
| dest='buffersize', metavar='SIZE', default='1024', |