mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	[ffmpeg] add support for chapters field postprocessing
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user