Source code for flexget.components.sites.urlrewrite
import re
from loguru import logger
from flexget import plugin
from flexget.components.sites.urlrewriting import UrlRewritingError
from flexget.event import event
logger = logger.bind(name='urlrewrite')
[docs]
class UrlRewrite:
r"""Generic configurable urlrewriter.
Example::
urlrewrite:
demonoid:
regexp: http://www\.demonoid\.com/files/details/
format: http://www.demonoid.com/files/download/HTTP/
"""
resolves = {}
schema = {
'type': 'object',
'additionalProperties': {
'type': 'object',
'properties': {
'regexp': {'type': 'string', 'format': 'regex'},
'format': {'type': 'string'},
},
'required': ['regexp', 'format'],
'additionalProperties': False,
},
}
[docs]
def on_task_start(self, task, config):
resolves = self.resolves[task.name] = {}
for name, rewrite_config in config.items():
match = re.compile(rewrite_config['regexp'])
format = rewrite_config['format']
resolves[name] = {
'regexp_compiled': match,
'format': format,
'regexp': rewrite_config['regexp'],
}
logger.debug('Added rewrite {}', name)
[docs]
def url_rewritable(self, task, entry):
logger.trace('running url_rewritable')
logger.trace(self.resolves)
for config in self.resolves.get(task.name, {}).values():
regexp = config['regexp_compiled']
logger.trace('testing {}', config['regexp'])
if regexp.search(entry['url']):
return True
return False
[docs]
def url_rewrite(self, task, entry):
for name, config in self.resolves.get(task.name, {}).items():
regexp = config['regexp_compiled']
format = config['format']
if regexp.search(entry['url']):
logger.debug('Regexp resolving {} with {}', entry['url'], name)
# run the regexp
entry['url'] = regexp.sub(format, entry['url'])
if regexp.match(entry['url']):
entry.fail('urlrewriting')
raise UrlRewritingError(f'Regexp {name} result should NOT continue to match!')
return
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(UrlRewrite, 'urlrewrite', interfaces=['task', 'urlrewriter'], api_ver=2)