Source code for flexget.components.sites.urlrewriting

from loguru import logger

from flexget import plugin
from flexget.event import event

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


[docs] class UrlRewritingError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value)
[docs] class PluginUrlRewriting: """Provide URL rewriting framework.""" def __init__(self): self.disabled_rewriters = []
[docs] def on_task_urlrewrite(self, task, config): logger.debug('Checking {} entries', len(task.accepted)) # try to urlrewrite all accepted for entry in task.accepted: try: self.url_rewrite(task, entry) except UrlRewritingError as e: logger.warning(e.value) entry.fail()
# API method
[docs] def url_rewritable(self, task, entry): """Return True if entry is urlrewritable by registered rewriter.""" for urlrewriter in plugin.get_plugins(interface='urlrewriter'): if urlrewriter.name in self.disabled_rewriters: logger.trace("Skipping rewriter {} since it's disabled", urlrewriter.name) continue logger.trace('checking urlrewriter {}', urlrewriter.name) if urlrewriter.instance.url_rewritable(task, entry): return True return False
# API method - why priority though?
[docs] @plugin.priority(plugin.PRIORITY_FIRST) def url_rewrite(self, task, entry): """Rewrites given entry url. Raises UrlRewritingError if failed.""" tries = 0 while self.url_rewritable(task, entry) and entry.accepted: tries += 1 if tries > 20: raise UrlRewritingError( f'URL rewriting was left in infinite loop while rewriting url for {entry}, ' 'some rewriter is returning always True' ) for urlrewriter in plugin.get_plugins(interface='urlrewriter'): name = urlrewriter.name if name in self.disabled_rewriters: logger.trace("Skipping rewriter {} since it's disabled", name) continue try: if urlrewriter.instance.url_rewritable(task, entry): old_url = entry['url'] logger.debug('Url rewriting {}', entry['url']) urlrewriter.instance.url_rewrite(task, entry) if entry['url'] != old_url: if entry.get('urls') and old_url in entry.get('urls'): entry['urls'][entry['urls'].index(old_url)] = entry['url'] logger.info( "Entry '{}' URL rewritten to {} (with {})", entry['title'], entry['url'], name, ) except (UrlRewritingError, plugin.PluginError) as e: raise UrlRewritingError(f'URL rewriting {name} failed: {e.value}') except Exception: logger.exception('Found an error') raise UrlRewritingError( '{}: Internal error with url {}'.format(name, entry['url']) )
[docs] class DisableUrlRewriter: """Disable certain urlrewriters.""" schema = {'type': 'array', 'items': {'type': 'string'}}
[docs] def on_task_start(self, task, config): urlrewriting = plugin.get('urlrewriting', self) for disable in config: try: plugin.get(disable, self) except plugin.DependencyError: logger.critical('Unknown url-rewriter {}', disable) continue logger.debug('Disabling url rewriter {}', disable) urlrewriting.disabled_rewriters.append(disable)
[docs] def on_task_exit(self, task, config): urlrewriting = plugin.get('urlrewriting', self) for disable in config: logger.debug('Enabling url rewriter {}', disable) try: urlrewriting.disabled_rewriters.remove(disable) except ValueError: logger.debug('{} does not exists', disable)
on_task_abort = on_task_exit
[docs] @event('plugin.register') def register_plugin(): plugin.register(PluginUrlRewriting, 'urlrewriting', builtin=True, api_ver=2) plugin.register(DisableUrlRewriter, 'disable_urlrewriters', api_ver=2) plugin.register_task_phase('urlrewrite', before='download')