|
|
@ -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 |
|
|
|