diff options
| -rwxr-xr-x | youtube_dl/YoutubeDL.py | 17 | ||||
| -rw-r--r-- | youtube_dl/postprocessor/__init__.py | 2 | ||||
| -rw-r--r-- | youtube_dl/postprocessor/ffmpeg.py | 19 | 
3 files changed, 34 insertions, 4 deletions
diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index f91851df9..94e4ea432 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -85,6 +85,7 @@ from .extractor import get_info_extractor, gen_extractors  from .downloader import get_suitable_downloader  from .downloader.rtmp import rtmpdump_version  from .postprocessor import ( +    FFmpegFixupM3u8PP,      FFmpegFixupM4aPP,      FFmpegFixupStretchedPP,      FFmpegMergerPP, @@ -1671,6 +1672,22 @@ class YoutubeDL(object):                      else:                          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:                      self.post_process(filename, info_dict)                  except (PostProcessingError) as err: diff --git a/youtube_dl/postprocessor/__init__.py b/youtube_dl/postprocessor/__init__.py index 0d8ef6ca2..3ea518399 100644 --- a/youtube_dl/postprocessor/__init__.py +++ b/youtube_dl/postprocessor/__init__.py @@ -6,6 +6,7 @@ from .ffmpeg import (      FFmpegEmbedSubtitlePP,      FFmpegExtractAudioPP,      FFmpegFixupStretchedPP, +    FFmpegFixupM3u8PP,      FFmpegFixupM4aPP,      FFmpegMergerPP,      FFmpegMetadataPP, @@ -26,6 +27,7 @@ __all__ = [      'ExecAfterDownloadPP',      'FFmpegEmbedSubtitlePP',      'FFmpegExtractAudioPP', +    'FFmpegFixupM3u8PP',      'FFmpegFixupM4aPP',      'FFmpegFixupStretchedPP',      'FFmpegMergerPP', diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py index 380bc6f29..81102f9bb 100644 --- a/youtube_dl/postprocessor/ffmpeg.py +++ b/youtube_dl/postprocessor/ffmpeg.py @@ -391,10 +391,6 @@ class FFmpegMetadataPP(FFmpegPostProcessor):          for (name, value) in metadata.items():              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.run_ffmpeg(filename, temp_filename, options)          os.remove(encodeFilename(filename)) @@ -467,6 +463,21 @@ class FFmpegFixupM4aPP(FFmpegPostProcessor):          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):      def __init__(self, downloader=None, format=None):          super(FFmpegSubtitlesConvertorPP, self).__init__(downloader)  | 
