From e04b003e6469db220131812b4894ac2a1d5ee083 Mon Sep 17 00:00:00 2001 From: pukkandan Date: Sat, 27 Nov 2021 19:20:39 +0530 Subject: [PATCH] [FixupM3u8] Fixup MPEG-TS in MP4 container Closes #1701, https://github.com/ytdl-org/youtube-dl/issues/26410 --- yt_dlp/YoutubeDL.py | 7 ++++--- yt_dlp/postprocessor/ffmpeg.py | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index b983b1775..3a409b652 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2934,9 +2934,10 @@ class YoutubeDL(object): downloader = get_suitable_downloader(info_dict, self.params) if 'protocol' in info_dict else None downloader = downloader.__name__ if downloader else None ffmpeg_fixup(info_dict.get('requested_formats') is None and downloader == 'HlsFD', - 'malformed AAC bitstream detected', FFmpegFixupM3u8PP) - ffmpeg_fixup(downloader == 'WebSocketFragmentFD', 'malformed timestamps detected', FFmpegFixupTimestampPP) - ffmpeg_fixup(downloader == 'WebSocketFragmentFD', 'malformed duration detected', FFmpegFixupDurationPP) + 'Possible MPEG-TS in MP4 container or malformed AAC timestamps', + FFmpegFixupM3u8PP) + ffmpeg_fixup(downloader == 'WebSocketFragmentFD', 'Malformed timestamps detected', FFmpegFixupTimestampPP) + ffmpeg_fixup(downloader == 'WebSocketFragmentFD', 'Malformed duration detected', FFmpegFixupDurationPP) fixup() try: diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py index 1bde170ce..e8b569d72 100644 --- a/yt_dlp/postprocessor/ffmpeg.py +++ b/yt_dlp/postprocessor/ffmpeg.py @@ -855,10 +855,21 @@ class FFmpegFixupM4aPP(FFmpegFixupPostProcessor): class FFmpegFixupM3u8PP(FFmpegFixupPostProcessor): + def _needs_fixup(self, info): + yield info['ext'] in ('mp4', 'm4a') + yield info['protocol'].startswith('m3u8') + try: + metadata = self.get_metadata_object(info['filepath']) + except PostProcessingError as e: + self.report_warning(f'Unable to extract metadata: {e.msg}') + yield True + else: + yield traverse_obj(metadata, ('format', 'format_name'), casesense=False) == 'mpegts' + @PostProcessor._restrict_to(images=False) def run(self, info): - if self.get_audio_codec(info['filepath']) == 'aac': - self._fixup('Fixing malformed AAC bitstream', info['filepath'], [ + if all(self._needs_fixup(info)): + self._fixup('Fixing MPEG-TS in MP4 container', info['filepath'], [ '-c', 'copy', '-map', '0', '-dn', '-f', 'mp4', '-bsf:a', 'aac_adtstoasc']) return [], info