mirror of
https://github.com/ytdl-org/youtube-dl
synced 2024-11-27 13:06:49 +01:00
[ffmpeg] add support for chapters field postprocessing
This commit is contained in:
parent
55949fede6
commit
fa2a36d9bc
@ -4,6 +4,7 @@ import io
|
|||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
from .common import AudioConversionError, PostProcessor
|
from .common import AudioConversionError, PostProcessor
|
||||||
@ -22,6 +23,7 @@ from ..utils import (
|
|||||||
subtitles_filename,
|
subtitles_filename,
|
||||||
dfxp2srt,
|
dfxp2srt,
|
||||||
ISO639Utils,
|
ISO639Utils,
|
||||||
|
replace_extension,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -429,17 +431,40 @@ class FFmpegMetadataPP(FFmpegPostProcessor):
|
|||||||
|
|
||||||
filename = info['filepath']
|
filename = info['filepath']
|
||||||
temp_filename = prepend_extension(filename, 'temp')
|
temp_filename = prepend_extension(filename, 'temp')
|
||||||
|
in_filenames = [filename]
|
||||||
|
options = []
|
||||||
|
|
||||||
if info['ext'] == 'm4a':
|
if info['ext'] == 'm4a':
|
||||||
options = ['-vn', '-acodec', 'copy']
|
options.extend(['-vn', '-acodec', 'copy'])
|
||||||
else:
|
else:
|
||||||
options = ['-c', 'copy']
|
options.extend(['-c', 'copy'])
|
||||||
|
|
||||||
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)])
|
||||||
|
|
||||||
|
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._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.remove(encodeFilename(filename))
|
||||||
os.rename(encodeFilename(temp_filename), encodeFilename(filename))
|
os.rename(encodeFilename(temp_filename), encodeFilename(filename))
|
||||||
return [], info
|
return [], info
|
||||||
|
Loading…
Reference in New Issue
Block a user