From cec1f1df792fe521fff2d5ca54b5c70094b3d96a Mon Sep 17 00:00:00 2001 From: clayote Date: Mon, 5 Jan 2026 16:19:30 +1300 Subject: [PATCH] Fix `--parse-metadata` when `TO` is a single field name (#14577) Closes #14576 Authored by: clayote, bashonly Co-authored-by: bashonly <88596187+bashonly@users.noreply.github.com> --- README.md | 3 +++ test/test_postprocessors.py | 5 +++++ yt_dlp/postprocessor/metadataparser.py | 3 +++ 3 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 6e3e23fcbf..ef2e2493f2 100644 --- a/README.md +++ b/README.md @@ -1821,6 +1821,9 @@ $ yt-dlp --parse-metadata "title:%(artist)s - %(title)s" # Regex example $ yt-dlp --parse-metadata "description:Artist - (?P.+)" +# Copy the episode field to the title field (with FROM and TO as single fields) +$ yt-dlp --parse-metadata "episode:title" + # Set title as "Series name S01E05" $ yt-dlp --parse-metadata "%(series)s S%(season_number)02dE%(episode_number)02d:%(title)s" diff --git a/test/test_postprocessors.py b/test/test_postprocessors.py index 3911567066..d58a97fc6e 100644 --- a/test/test_postprocessors.py +++ b/test/test_postprocessors.py @@ -29,6 +29,11 @@ class TestMetadataFromField(unittest.TestCase): MetadataParserPP.format_to_regex('%(title)s - %(artist)s'), r'(?P.+)\ \-\ (?P<artist>.+)') self.assertEqual(MetadataParserPP.format_to_regex(r'(?P<x>.+)'), r'(?P<x>.+)') + self.assertEqual(MetadataParserPP.format_to_regex(r'text (?P<x>.+)'), r'text (?P<x>.+)') + self.assertEqual(MetadataParserPP.format_to_regex('x'), r'(?s)(?P<x>.+)') + self.assertEqual(MetadataParserPP.format_to_regex('Field_Name1'), r'(?s)(?P<Field_Name1>.+)') + self.assertEqual(MetadataParserPP.format_to_regex('é'), r'(?s)(?P<é>.+)') + self.assertEqual(MetadataParserPP.format_to_regex('invalid '), 'invalid ') def test_field_to_template(self): self.assertEqual(MetadataParserPP.field_to_template('title'), '%(title)s') diff --git a/yt_dlp/postprocessor/metadataparser.py b/yt_dlp/postprocessor/metadataparser.py index 1d6054294e..e9e0267177 100644 --- a/yt_dlp/postprocessor/metadataparser.py +++ b/yt_dlp/postprocessor/metadataparser.py @@ -42,6 +42,9 @@ class MetadataParserPP(PostProcessor): to a regex like '(?P<title>.+)\ \-\ (?P<artist>.+)' """ + if re.fullmatch(r'\w+', fmt): + # convert a single field name into regex pattern that matches the entire input + return rf'(?s)(?P<{fmt}>.+)' if not re.search(r'%\(\w+\)s', fmt): return fmt lastpos = 0