Source code for flexget.components.parsing.plugin_parsing

from loguru import logger

from flexget import plugin
from flexget.event import event

logger = logger.bind(name='parsing')
PARSER_TYPES = ['movie', 'series']

# Mapping of parser type to (mapping of parser name to plugin instance)
parsers = {}
# Mapping from parser type to the name of the default/selected parser for that type
default_parsers = {}
selected_parsers = []


# We need to wait until manager startup to access other plugin instances, to make sure they have all been loaded
[docs] @event('manager.startup') def init_parsers(manager): """Prepare our list of parsing plugins and default parsers.""" for parser_type in PARSER_TYPES: parsers[parser_type] = {} for p in plugin.get_plugins(interface=parser_type + '_parser'): parsers[parser_type][p.name.replace('parser_', '')] = p.instance # Select default parsers based on priority func_name = 'parse_' + parser_type default_parsers[parser_type] = max( iter(parsers[parser_type].items()), key=lambda p: getattr(getattr(p[1], func_name), 'priority', 0), )[0] logger.debug( 'setting default {} parser to {}. (options: {})', parser_type, default_parsers[parser_type], parsers[parser_type], )
[docs] class PluginParsing: """Provide parsing framework.""" @property def schema(self): # Create a schema allowing only our registered parsers to be used under the key of each parser type properties = {} for parser_type in PARSER_TYPES: parser_names = [ p.name.replace('parser_', '') for p in plugin.get_plugins(interface=parser_type + '_parser') ] properties[parser_type] = {'type': 'string', 'enum': parser_names} return {'type': 'object', 'properties': properties, 'additionalProperties': False}
[docs] def on_task_start(self, task, config): # Set up user selected parsers from config for this task run if config: selected_parsers.append(config) else: selected_parsers.append({})
[docs] def on_task_exit(self, task, config): # Restore default parsers for next task run if selected_parsers: selected_parsers.pop()
on_task_abort = on_task_exit @property def selected(self) -> dict: if selected_parsers: return selected_parsers[-1] return {}
[docs] def parse_series(self, data, name=None, **kwargs): """Use the selected series parser to parse series information from `data`. :param data: The raw string to parse information from. :param name: The series name to parse data for. If not supplied, parser will attempt to guess series name automatically from `data`. :returns: An object containing the parsed information. The `valid` attribute will be set depending on success. """ parser = parsers['series'][self.selected.get('series', default_parsers.get('series'))] return parser.parse_series(data, name=name, **kwargs)
[docs] def parse_movie(self, data, **kwargs): """Use the selected movie parser to parse movie information from `data`. :param data: The raw string to parse information from :returns: An object containing the parsed information. The `valid` attribute will be set depending on success. """ parser = parsers['movie'][self.selected.get('movie') or default_parsers['movie']] return parser.parse_movie(data, **kwargs)
[docs] @event('plugin.register') def register_plugin(): plugin.register(PluginParsing, 'parsing', api_ver=2)