diff options
Diffstat (limited to 'youtube_dl/postprocessor/ffmpeg.py')
| -rw-r--r-- | youtube_dl/postprocessor/ffmpeg.py | 31 | 
1 files changed, 28 insertions, 3 deletions
| diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py index 665109558..c91ec8588 100644 --- a/youtube_dl/postprocessor/ffmpeg.py +++ b/youtube_dl/postprocessor/ffmpeg.py @@ -4,6 +4,7 @@ import io  import os  import subprocess  import time +import re  from .common import AudioConversionError, PostProcessor @@ -22,6 +23,7 @@ from ..utils import (      subtitles_filename,      dfxp2srt,      ISO639Utils, +    replace_extension,  ) @@ -429,17 +431,40 @@ class FFmpegMetadataPP(FFmpegPostProcessor):          filename = info['filepath']          temp_filename = prepend_extension(filename, 'temp') +        in_filenames = [filename] +        options = []          if info['ext'] == 'm4a': -            options = ['-vn', '-acodec', 'copy'] +            options.extend(['-vn', '-acodec', 'copy'])          else: -            options = ['-c', 'copy'] +            options.extend(['-c', 'copy'])          for (name, value) in metadata.items():              options.extend(['-metadata', '%s=%s' % (name, value)]) +        chapters = info.get('chapters', []) +        if chapters: +            metadata_filename = encodeFilename(replace_extension(filename, 'meta')) +            with io.open(metadata_filename, 'wt', encoding='utf-8') as f: +                def ffmpeg_escape(text): +                    return re.sub(r'(=|;|#|\\|\n)', r'\\\1', text) + +                metadata_file_content = ';FFMETADATA1\n' +                for chapter in chapters: +                    metadata_file_content += '[CHAPTER]\nTIMEBASE=1/1000\n' +                    metadata_file_content += 'START=%d\n' % (chapter['start_time'] * 1000) +                    metadata_file_content += 'END=%d\n' % (chapter['end_time'] * 1000) +                    chapter_title = chapter.get('title') +                    if chapter_title: +                        metadata_file_content += 'title=%s\n' % ffmpeg_escape(chapter_title) +                f.write(metadata_file_content) +                in_filenames.append(metadata_filename) +                options.extend(['-map_metadata', '1']) +          self._downloader.to_screen('[ffmpeg] Adding metadata to \'%s\'' % filename) -        self.run_ffmpeg(filename, temp_filename, options) +        self.run_ffmpeg_multiple_files(in_filenames, temp_filename, options) +        if chapters: +            os.remove(metadata_filename)          os.remove(encodeFilename(filename))          os.rename(encodeFilename(temp_filename), encodeFilename(filename))          return [], info | 
