From 84601bb72b1ade8867e4a79635823b89ac6754eb Mon Sep 17 00:00:00 2001 From: pukkandan Date: Sat, 3 Apr 2021 13:59:55 +0530 Subject: [PATCH] Ability to set a specific field in the file's metadata Eg: `--parse-metadata "description:(?s)(?P.+)"` sets the "comment" field using `description` --- test/test_postprocessors.py | 4 ++-- yt_dlp/postprocessor/ffmpeg.py | 12 +++++++++--- yt_dlp/postprocessor/metadatafromfield.py | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/test/test_postprocessors.py b/test/test_postprocessors.py index 2e9a1bf943..12fc427fbc 100644 --- a/test/test_postprocessors.py +++ b/test/test_postprocessors.py @@ -14,10 +14,10 @@ from yt_dlp.postprocessor import MetadataFromFieldPP, MetadataFromTitlePP class TestMetadataFromField(unittest.TestCase): def test_format_to_regex(self): pp = MetadataFromFieldPP(None, ['title:%(title)s - %(artist)s']) - self.assertEqual(pp._data[0]['regex'], r'(?P[^\r\n]+)\ \-\ (?P<artist>[^\r\n]+)') + self.assertEqual(pp._data[0]['regex'], r'(?P<title>.+)\ \-\ (?P<artist>.+)') class TestMetadataFromTitle(unittest.TestCase): def test_format_to_regex(self): pp = MetadataFromTitlePP(None, '%(title)s - %(artist)s') - self.assertEqual(pp._titleregex, r'(?P<title>[^\r\n]+)\ \-\ (?P<artist>[^\r\n]+)') + self.assertEqual(pp._titleregex, r'(?P<title>.+)\ \-\ (?P<artist>.+)') diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py index ffce98cd50..accd715bed 100644 --- a/yt_dlp/postprocessor/ffmpeg.py +++ b/yt_dlp/postprocessor/ffmpeg.py @@ -10,7 +10,7 @@ import json from .common import AudioConversionError, PostProcessor -from ..compat import compat_str +from ..compat import compat_str, compat_numeric_types from ..utils import ( encodeArgument, encodeFilename, @@ -530,6 +530,8 @@ class FFmpegMetadataPP(FFmpegPostProcessor): metadata = {} def add(meta_list, info_list=None): + if not meta_list: + return if not info_list: info_list = meta_list if not isinstance(meta_list, (list, tuple)): @@ -537,7 +539,7 @@ class FFmpegMetadataPP(FFmpegPostProcessor): if not isinstance(info_list, (list, tuple)): info_list = (info_list,) for info_f in info_list: - if info.get(info_f) is not None: + if isinstance(info.get(info_f), (compat_str, compat_numeric_types)): for meta_f in meta_list: metadata[meta_f] = info[info_f] break @@ -563,6 +565,10 @@ class FFmpegMetadataPP(FFmpegPostProcessor): add('episode_id', ('episode', 'episode_id')) add('episode_sort', 'episode_number') + prefix = 'meta_' + for key in filter(lambda k: k.startswith(prefix), info.keys()): + add(key[len(prefix):], key) + if not metadata: self.to_screen('There isn\'t any metadata to add') return [], info @@ -577,7 +583,7 @@ class FFmpegMetadataPP(FFmpegPostProcessor): else: options.extend(['-c', 'copy']) - for (name, value) in metadata.items(): + for name, value in metadata.items(): options.extend(['-metadata', '%s=%s' % (name, value)]) chapters = info.get('chapters', []) diff --git a/yt_dlp/postprocessor/metadatafromfield.py b/yt_dlp/postprocessor/metadatafromfield.py index 636199214a..195c63f926 100644 --- a/yt_dlp/postprocessor/metadatafromfield.py +++ b/yt_dlp/postprocessor/metadatafromfield.py @@ -45,7 +45,7 @@ class MetadataFromFieldPP(PostProcessor): # replace %(..)s with regex group and escape other string parts for match in re.finditer(r'%\((\w+)\)s', fmt): regex += re.escape(fmt[lastpos:match.start()]) - regex += r'(?P<%s>[^\r\n]+)' % match.group(1) + regex += r'(?P<%s>.+)' % match.group(1) lastpos = match.end() if lastpos < len(fmt): regex += re.escape(fmt[lastpos:])