You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.5 KiB
47 lines
1.5 KiB
from __future__ import unicode_literals |
|
|
|
import re |
|
|
|
from .common import PostProcessor |
|
from ..utils import PostProcessingError |
|
|
|
|
|
class MetadataFromTitlePPError(PostProcessingError): |
|
pass |
|
|
|
|
|
class MetadataFromTitlePP(PostProcessor): |
|
def __init__(self, downloader, titleformat): |
|
super(MetadataFromTitlePP, self).__init__(downloader) |
|
self._titleformat = titleformat |
|
self._titleregex = self.format_to_regex(titleformat) |
|
|
|
def format_to_regex(self, fmt): |
|
""" |
|
Converts a string like |
|
'%(title)s - %(artist)s' |
|
to a regex like |
|
'(?P<title>.+)\ \-\ (?P<artist>.+)' |
|
""" |
|
lastpos = 0 |
|
regex = "" |
|
# 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<' + match.group(1) + '>.+)' |
|
lastpos = match.end() |
|
if lastpos < len(fmt): |
|
regex += re.escape(fmt[lastpos:len(fmt)]) |
|
return regex |
|
|
|
def run(self, info): |
|
title = info['title'] |
|
match = re.match(self._titleregex, title) |
|
if match is None: |
|
raise MetadataFromTitlePPError('Could not interpret title of video as "%s"' % self._titleformat) |
|
for attribute, value in match.groupdict().items(): |
|
value = match.group(attribute) |
|
info[attribute] = value |
|
self._downloader.to_screen('[fromtitle] parsed ' + attribute + ': ' + value) |
|
|
|
return [], info
|
|
|