diff options
| -rwxr-xr-x | youtube_dl/YoutubeDL.py | 28 | ||||
| -rw-r--r-- | youtube_dl/extractor/youtube.py | 6 | ||||
| -rw-r--r-- | youtube_dl/postprocessor/__init__.py | 2 | ||||
| -rw-r--r-- | youtube_dl/postprocessor/ffmpeg.py | 20 | 
4 files changed, 47 insertions, 9 deletions
diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 8f34b17b4..521e4055e 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -73,6 +73,7 @@ from .extractor import get_info_extractor, gen_extractors  from .downloader import get_suitable_downloader  from .downloader.rtmp import rtmpdump_version  from .postprocessor import ( +    FFmpegFixupM4aPP,      FFmpegFixupStretchedPP,      FFmpegMergerPP,      FFmpegPostProcessor, @@ -213,7 +214,7 @@ class YoutubeDL(object):                         - "never": do nothing                         - "warn": only emit a warning                         - "detect_or_warn": check whether we can do anything -                                           about it, warn otherwise +                                           about it, warn otherwise (default)      source_address:    (Experimental) Client-side IP address to bind to.      call_home:         Boolean, true iff we are allowed to contact the                         youtube-dl servers for debugging. @@ -1219,11 +1220,12 @@ class YoutubeDL(object):              if success:                  # Fixup content +                fixup_policy = self.params.get('fixup') +                if fixup_policy is None: +                    fixup_policy = 'detect_or_warn' +                  stretched_ratio = info_dict.get('stretched_ratio')                  if stretched_ratio is not None and stretched_ratio != 1: -                    fixup_policy = self.params.get('fixup') -                    if fixup_policy is None: -                        fixup_policy = 'detect_or_warn'                      if fixup_policy == 'warn':                          self.report_warning('%s: Non-uniform pixel ratio (%s)' % (                              info_dict['id'], stretched_ratio)) @@ -1237,7 +1239,23 @@ class YoutubeDL(object):                                  '%s: Non-uniform pixel ratio (%s). Install ffmpeg or avconv to fix this automatically.' % (                                      info_dict['id'], stretched_ratio))                      else: -                        assert fixup_policy == 'ignore' +                        assert fixup_policy in ('ignore', 'never') + +                if info_dict.get('requested_formats') is None and info_dict.get('container') == 'm4a_dash': +                    if fixup_policy == 'warn': +                        self.report_warning('%s: writing DASH m4a. Only some players support this container.' % ( +                            info_dict['id'])) +                    elif fixup_policy == 'detect_or_warn': +                        fixup_pp = FFmpegFixupM4aPP(self) +                        if fixup_pp.available: +                            info_dict.setdefault('__postprocessors', []) +                            info_dict['__postprocessors'].append(fixup_pp) +                        else: +                            self.report_warning( +                                '%s: writing DASH m4a. Only some players support this container. 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) diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index 2a1f8be0a..eb55d24ce 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -264,9 +264,9 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):          '266': {'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40, 'vcodec': 'h264'},          # Dash mp4 audio -        '139': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'vcodec': 'none', 'abr': 48, 'preference': -50}, -        '140': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'vcodec': 'none', 'abr': 128, 'preference': -50}, -        '141': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'vcodec': 'none', 'abr': 256, 'preference': -50}, +        '139': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'vcodec': 'none', 'abr': 48, 'preference': -50, 'container': 'm4a_dash'}, +        '140': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'vcodec': 'none', 'abr': 128, 'preference': -50, 'container': 'm4a_dash'}, +        '141': {'ext': 'm4a', 'format_note': 'DASH audio', 'acodec': 'aac', 'vcodec': 'none', 'abr': 256, 'preference': -50, 'container': 'm4a_dash'},          # Dash webm          '167': {'ext': 'webm', 'height': 360, 'width': 640, 'format_note': 'DASH video', 'acodec': 'none', 'container': 'webm', 'vcodec': 'VP8', 'preference': -40}, diff --git a/youtube_dl/postprocessor/__init__.py b/youtube_dl/postprocessor/__init__.py index f8507951c..0ffbca258 100644 --- a/youtube_dl/postprocessor/__init__.py +++ b/youtube_dl/postprocessor/__init__.py @@ -7,6 +7,7 @@ from .ffmpeg import (      FFmpegEmbedSubtitlePP,      FFmpegExtractAudioPP,      FFmpegFixupStretchedPP, +    FFmpegFixupM4aPP,      FFmpegMergerPP,      FFmpegMetadataPP,      FFmpegVideoConvertorPP, @@ -25,6 +26,7 @@ __all__ = [      'FFmpegAudioFixPP',      'FFmpegEmbedSubtitlePP',      'FFmpegExtractAudioPP', +    'FFmpegFixupM4aPP',      'FFmpegFixupStretchedPP',      'FFmpegMergerPP',      'FFmpegMetadataPP', diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py index faccdc43d..855d1e6db 100644 --- a/youtube_dl/postprocessor/ffmpeg.py +++ b/youtube_dl/postprocessor/ffmpeg.py @@ -564,7 +564,7 @@ class FFmpegFixupStretchedPP(FFmpegPostProcessor):      def run(self, info):          stretched_ratio = info.get('stretched_ratio')          if stretched_ratio is None or stretched_ratio == 1: -            return +            return True, info          filename = info['filepath']          temp_filename = prepend_extension(filename, 'temp') @@ -577,3 +577,21 @@ class FFmpegFixupStretchedPP(FFmpegPostProcessor):          os.rename(encodeFilename(temp_filename), encodeFilename(filename))          return True, info + + +class FFmpegFixupM4aPP(FFmpegPostProcessor): +    def run(self, info): +        if info.get('container') != 'm4a_dash': +            return True, info + +        filename = info['filepath'] +        temp_filename = prepend_extension(filename, 'temp') + +        options = ['-c', 'copy', '-f', 'mp4'] +        self._downloader.to_screen('[ffmpeg] Correcting container in "%s"' % filename) +        self.run_ffmpeg(filename, temp_filename, options) + +        os.remove(encodeFilename(filename)) +        os.rename(encodeFilename(temp_filename), encodeFilename(filename)) + +        return True, info  | 
