Source code for flexget.plugins.modify.regex_extract

import re

from loguru import logger

from flexget import plugin
from flexget.config_schema import one_or_more
from flexget.event import event
from flexget.utils.tools import ReList

logger = logger.bind(name='regex_extract')


[docs] class RegexExtract: r"""Updates an entry with the values of regex matched named groups. Usage:: regex_extract: field: <string> regex: - <regex> [prefix]: <string> Example:: regex_extract: prefix: f1_ field: title regex: - Formula\.?1.(?P<location>*?) """ schema = { 'type': 'object', 'properties': { 'prefix': {'type': 'string'}, 'field': {'type': 'string'}, 'regex': one_or_more({'type': 'string', 'format': 'regex'}), }, }
[docs] def on_task_start(self, task, config): regex = config.get('regex') if isinstance(regex, str): regex = [regex] self.regex_list = ReList(regex) # Check the regex try: for _ in self.regex_list: pass except re.error as e: raise plugin.PluginError(f'Error compiling regex: {e!s}')
[docs] def on_task_modify(self, task, config): prefix = config.get('prefix') modified = 0 for entry in task.entries: for rx in self.regex_list: entry_field = entry.get('title') logger.debug('Matching {} with regex: {}', entry_field, rx) try: match = rx.match(entry_field) except re.error as e: raise plugin.PluginError(f'Error encountered processing regex: {e!s}') if match: logger.debug('Successfully matched {}', entry_field) data = match.groupdict() if prefix: for key in list(data.keys()): data[prefix + key] = data[key] del data[key] logger.debug('Values added to entry: {}', data) entry.update(data) modified += 1 logger.info('{} entries matched and modified', modified)
[docs] @event('plugin.register') def register_plugin(): plugin.register(RegexExtract, 'regex_extract', api_ver=2)