aboutsummaryrefslogtreecommitdiffstats
path: root/yt_dlp/postprocessor/ffmpeg.py
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2022-01-02 03:31:49 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2022-01-02 03:33:15 +0530
commit8896899216e90b0ea7ddb1697faf1dc8411b78be (patch)
treebd6d088b73d5458ac6fc74600549ed3622798e05 /yt_dlp/postprocessor/ffmpeg.py
parent1797b073ed9989d57a84a3e05106285c54085686 (diff)
downloadhypervideo-pre-8896899216e90b0ea7ddb1697faf1dc8411b78be.tar.lz
hypervideo-pre-8896899216e90b0ea7ddb1697faf1dc8411b78be.tar.xz
hypervideo-pre-8896899216e90b0ea7ddb1697faf1dc8411b78be.zip
[FfmpegMetadata] Allow setting metadata of individual streams
Closes #877
Diffstat (limited to 'yt_dlp/postprocessor/ffmpeg.py')
-rw-r--r--yt_dlp/postprocessor/ffmpeg.py29
1 files changed, 17 insertions, 12 deletions
diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py
index 96b48ded5..97f04d116 100644
--- a/yt_dlp/postprocessor/ffmpeg.py
+++ b/yt_dlp/postprocessor/ffmpeg.py
@@ -1,5 +1,6 @@
from __future__ import unicode_literals
+import collections
import io
import itertools
import os
@@ -728,15 +729,15 @@ class FFmpegMetadataPP(FFmpegPostProcessor):
yield ('-map_metadata', '1')
def _get_metadata_opts(self, info):
- metadata = {}
- meta_prefix = 'meta_'
+ meta_prefix = 'meta'
+ metadata = collections.defaultdict(dict)
def add(meta_list, info_list=None):
value = next((
- str(info[key]) for key in [meta_prefix] + list(variadic(info_list or meta_list))
+ str(info[key]) for key in [f'{meta_prefix}_'] + list(variadic(info_list or meta_list))
if info.get(key) is not None), None)
if value not in ('', None):
- metadata.update({meta_f: value for meta_f in variadic(meta_list)})
+ metadata['common'].update({meta_f: value for meta_f in variadic(meta_list)})
# See [1-4] for some info on media metadata/metadata supported
# by ffmpeg.
@@ -760,22 +761,26 @@ class FFmpegMetadataPP(FFmpegPostProcessor):
add('episode_sort', 'episode_number')
if 'embed-metadata' in self.get_param('compat_opts', []):
add('comment', 'description')
- metadata.pop('synopsis', None)
+ metadata['common'].pop('synopsis', None)
+ meta_regex = rf'{re.escape(meta_prefix)}(?P<i>\d+)?_(?P<key>.+)'
for key, value in info.items():
- if value is not None and key != meta_prefix and key.startswith(meta_prefix):
- metadata[key[len(meta_prefix):]] = value
+ mobj = re.fullmatch(meta_regex, key)
+ if value is not None and mobj:
+ metadata[mobj.group('i') or 'common'][mobj.group('key')] = value
- for name, value in metadata.items():
+ for name, value in metadata['common'].items():
yield ('-metadata', f'{name}={value}')
stream_idx = 0
for fmt in info.get('requested_formats') or []:
stream_count = 2 if 'none' not in (fmt.get('vcodec'), fmt.get('acodec')) else 1
- if fmt.get('language'):
- lang = ISO639Utils.short2long(fmt['language']) or fmt['language']
- for i in range(stream_count):
- yield ('-metadata:s:%d' % (stream_idx + i), 'language=%s' % lang)
+ lang = ISO639Utils.short2long(fmt['language']) or fmt.get('language')
+ for i in range(stream_idx, stream_idx + stream_count):
+ if lang:
+ metadata[str(i)].setdefault('language', lang)
+ for name, value in metadata[str(i)].items():
+ yield (f'-metadata:s:{i}', f'{name}={value}')
stream_idx += stream_count
def _get_infojson_opts(self, info, infofn):