mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-11-04 08:35:12 +00:00 
			
		
		
		
	Add fixup for media files produced by HlsNative downloader(fixes #4776)
This commit is contained in:
		@@ -87,6 +87,7 @@ from .extractor import get_info_extractor, gen_extractors
 | 
				
			|||||||
from .downloader import get_suitable_downloader
 | 
					from .downloader import get_suitable_downloader
 | 
				
			||||||
from .downloader.rtmp import rtmpdump_version
 | 
					from .downloader.rtmp import rtmpdump_version
 | 
				
			||||||
from .postprocessor import (
 | 
					from .postprocessor import (
 | 
				
			||||||
 | 
					    FFmpegFixupM3u8PP,
 | 
				
			||||||
    FFmpegFixupM4aPP,
 | 
					    FFmpegFixupM4aPP,
 | 
				
			||||||
    FFmpegFixupStretchedPP,
 | 
					    FFmpegFixupStretchedPP,
 | 
				
			||||||
    FFmpegMergerPP,
 | 
					    FFmpegMergerPP,
 | 
				
			||||||
@@ -1670,6 +1671,22 @@ class YoutubeDL(object):
 | 
				
			|||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        assert fixup_policy in ('ignore', 'never')
 | 
					                        assert fixup_policy in ('ignore', 'never')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if info_dict.get('protocol') == 'm3u8_native' or info_dict.get('protocol') == 'm3u8' and self._downloader.params.get('hls_prefer_native', False):
 | 
				
			||||||
 | 
					                    if fixup_policy == 'warn':
 | 
				
			||||||
 | 
					                        self.report_warning('%s: malformated aac bitstream.' % (
 | 
				
			||||||
 | 
					                            info_dict['id']))
 | 
				
			||||||
 | 
					                    elif fixup_policy == 'detect_or_warn':
 | 
				
			||||||
 | 
					                        fixup_pp = FFmpegFixupM3u8PP(self)
 | 
				
			||||||
 | 
					                        if fixup_pp.available:
 | 
				
			||||||
 | 
					                            info_dict.setdefault('__postprocessors', [])
 | 
				
			||||||
 | 
					                            info_dict['__postprocessors'].append(fixup_pp)
 | 
				
			||||||
 | 
					                        else:
 | 
				
			||||||
 | 
					                            self.report_warning(
 | 
				
			||||||
 | 
					                                '%s: malformated aac bitstream. Install ffmpeg or avconv to fix this automatically.' % (
 | 
				
			||||||
 | 
					                                    info_dict['id']))
 | 
				
			||||||
 | 
					                    else:
 | 
				
			||||||
 | 
					                        assert fixup_policy in ('ignore', 'never')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                try:
 | 
					                try:
 | 
				
			||||||
                    self.post_process(filename, info_dict)
 | 
					                    self.post_process(filename, info_dict)
 | 
				
			||||||
                except (PostProcessingError) as err:
 | 
					                except (PostProcessingError) as err:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@ from .ffmpeg import (
 | 
				
			|||||||
    FFmpegEmbedSubtitlePP,
 | 
					    FFmpegEmbedSubtitlePP,
 | 
				
			||||||
    FFmpegExtractAudioPP,
 | 
					    FFmpegExtractAudioPP,
 | 
				
			||||||
    FFmpegFixupStretchedPP,
 | 
					    FFmpegFixupStretchedPP,
 | 
				
			||||||
 | 
					    FFmpegFixupM3u8PP,
 | 
				
			||||||
    FFmpegFixupM4aPP,
 | 
					    FFmpegFixupM4aPP,
 | 
				
			||||||
    FFmpegMergerPP,
 | 
					    FFmpegMergerPP,
 | 
				
			||||||
    FFmpegMetadataPP,
 | 
					    FFmpegMetadataPP,
 | 
				
			||||||
@@ -26,6 +27,7 @@ __all__ = [
 | 
				
			|||||||
    'ExecAfterDownloadPP',
 | 
					    'ExecAfterDownloadPP',
 | 
				
			||||||
    'FFmpegEmbedSubtitlePP',
 | 
					    'FFmpegEmbedSubtitlePP',
 | 
				
			||||||
    'FFmpegExtractAudioPP',
 | 
					    'FFmpegExtractAudioPP',
 | 
				
			||||||
 | 
					    'FFmpegFixupM3u8PP',
 | 
				
			||||||
    'FFmpegFixupM4aPP',
 | 
					    'FFmpegFixupM4aPP',
 | 
				
			||||||
    'FFmpegFixupStretchedPP',
 | 
					    'FFmpegFixupStretchedPP',
 | 
				
			||||||
    'FFmpegMergerPP',
 | 
					    'FFmpegMergerPP',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -391,10 +391,6 @@ class FFmpegMetadataPP(FFmpegPostProcessor):
 | 
				
			|||||||
        for (name, value) in metadata.items():
 | 
					        for (name, value) in metadata.items():
 | 
				
			||||||
            options.extend(['-metadata', '%s=%s' % (name, value)])
 | 
					            options.extend(['-metadata', '%s=%s' % (name, value)])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # https://github.com/rg3/youtube-dl/issues/8350
 | 
					 | 
				
			||||||
        if info.get('protocol') == 'm3u8_native' or info.get('protocol') == 'm3u8' and self._downloader.params.get('hls_prefer_native', False):
 | 
					 | 
				
			||||||
            options.extend(['-bsf:a', 'aac_adtstoasc'])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self._downloader.to_screen('[ffmpeg] Adding metadata to \'%s\'' % filename)
 | 
					        self._downloader.to_screen('[ffmpeg] Adding metadata to \'%s\'' % filename)
 | 
				
			||||||
        self.run_ffmpeg(filename, temp_filename, options)
 | 
					        self.run_ffmpeg(filename, temp_filename, options)
 | 
				
			||||||
        os.remove(encodeFilename(filename))
 | 
					        os.remove(encodeFilename(filename))
 | 
				
			||||||
@@ -467,6 +463,21 @@ class FFmpegFixupM4aPP(FFmpegPostProcessor):
 | 
				
			|||||||
        return [], info
 | 
					        return [], info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FFmpegFixupM3u8PP(FFmpegPostProcessor):
 | 
				
			||||||
 | 
					    def run(self, info):
 | 
				
			||||||
 | 
					        filename = info['filepath']
 | 
				
			||||||
 | 
					        temp_filename = prepend_extension(filename, 'temp')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        options = ['-c', 'copy', '-f', 'mp4', '-bsf:a', 'aac_adtstoasc']
 | 
				
			||||||
 | 
					        self._downloader.to_screen('[ffmpeg] Fixing malformated aac bitstream in "%s"' % filename)
 | 
				
			||||||
 | 
					        self.run_ffmpeg(filename, temp_filename, options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        os.remove(encodeFilename(filename))
 | 
				
			||||||
 | 
					        os.rename(encodeFilename(temp_filename), encodeFilename(filename))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return [], info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FFmpegSubtitlesConvertorPP(FFmpegPostProcessor):
 | 
					class FFmpegSubtitlesConvertorPP(FFmpegPostProcessor):
 | 
				
			||||||
    def __init__(self, downloader=None, format=None):
 | 
					    def __init__(self, downloader=None, format=None):
 | 
				
			||||||
        super(FFmpegSubtitlesConvertorPP, self).__init__(downloader)
 | 
					        super(FFmpegSubtitlesConvertorPP, self).__init__(downloader)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user