]> jfr.im git - yt-dlp.git/blobdiff - yt_dlp/postprocessor/metadatafromfield.py
[viki] Print error message from API request
[yt-dlp.git] / yt_dlp / postprocessor / metadatafromfield.py
index e67e591e162f032a30e4d610e761d93acfed8077..0027947650f3d026412db9451bfcf6ab8c58df90 100644 (file)
@@ -4,11 +4,10 @@
 
 from .common import PostProcessor
 from ..compat import compat_str
-from ..utils import str_or_none
 
 
 class MetadataFromFieldPP(PostProcessor):
-    regex = r'(?P<in>.+):(?P<out>.+)$'
+    regex = r'(?P<in>.*?)(?<!\\):(?P<out>.+)$'
 
     def __init__(self, downloader, formats):
         PostProcessor.__init__(self, downloader)
@@ -18,16 +17,17 @@ def __init__(self, downloader, formats):
             assert isinstance(f, compat_str)
             match = re.match(self.regex, f)
             assert match is not None
+            inp = match.group('in').replace('\\:', ':')
             self._data.append({
-                'in': match.group('in'),
+                'in': inp,
                 'out': match.group('out'),
-                'tmpl': self.field_to_template(match.group('in')),
+                'tmpl': self.field_to_template(inp),
                 'regex': self.format_to_regex(match.group('out')),
             })
 
     @staticmethod
     def field_to_template(tmpl):
-        if re.match(r'\w+$', tmpl):
+        if re.match(r'[a-zA-Z_]+$', tmpl):
             return '%%(%s)s' % tmpl
         return tmpl
 
@@ -46,7 +46,7 @@ def format_to_regex(fmt):
         # 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:])
@@ -54,21 +54,21 @@ def format_to_regex(fmt):
 
     def run(self, info):
         for dictn in self._data:
-            tmpl, info_copy = self._downloader.prepare_outtmpl(dictn['tmpl'], info)
-            data_to_parse = tmpl % info_copy
-            self.write_debug('Searching for r"%s" in %s' % (dictn['regex'], tmpl))
+            tmpl, tmpl_dict = self._downloader.prepare_outtmpl(dictn['tmpl'], info)
+            data_to_parse = self._downloader.escape_outtmpl(tmpl) % tmpl_dict
+            self.write_debug('Searching for r"%s" in %s' % (dictn['regex'], dictn['tmpl']))
             match = re.search(dictn['regex'], data_to_parse)
             if match is None:
                 self.report_warning('Could not interpret video %s as "%s"' % (dictn['in'], dictn['out']))
                 continue
             for attribute, value in match.groupdict().items():
                 info[attribute] = value
-                self.to_screen('parsed %s from "%s": %s' % (attribute, dictn['in'], value if value is not None else 'NA'))
+                self.to_screen('parsed %s from "%s": %s' % (attribute, dictn['tmpl'], value if value is not None else 'NA'))
         return [], info
 
 
 class MetadataFromTitlePP(MetadataFromFieldPP):  # for backward compatibility
     def __init__(self, downloader, titleformat):
-        super(MetadataFromTitlePP, self).__init__(downloader, ['title:%s' % titleformat])
+        super(MetadataFromTitlePP, self).__init__(downloader, ['%%(title)s:%s' % titleformat])
         self._titleformat = titleformat
         self._titleregex = self._data[0]['regex']