flexget.plugins.plugin_urlrewriting
Covered: 20 lines
Missed: 33 lines
Skipped 18 lines
Percent: 37 %
 1
import logging
 2
from flexget.plugin import get_plugins_by_group, priority, PluginError, register_plugin, register_feed_phase
 4
log = logging.getLogger('urlrewriter')
 7
class UrlRewritingError(Exception):
 9
    def __init__(self, value):
10
        self.value = value
12
    def __str__(self):
13
        return repr(self.value)
16
class PluginUrlRewriting(object):
18
    """
19
    Provides URL rewriting framework
20
    """
22
    def on_feed_urlrewrite(self, feed):
24
        if feed.manager.unit_test:
25
            return
26
        log.debug('Checking %s entries' % len(feed.accepted))
28
        for entry in feed.accepted:
29
            try:
30
                self.url_rewrite(feed, entry)
31
            except UrlRewritingError, e:
32
                log.warn(e.value)
33
                feed.fail(entry)
35
    def url_rewritable(self, feed, entry):
36
        """Return True if entry is urlrewritable by registered rewriter."""
37
        for urlrewriter in get_plugins_by_group('urlrewriter'):
38
            log.trace('checking urlrewriter %s' % urlrewriter.name)
39
            if urlrewriter.instance.url_rewritable(self, entry):
40
                return True
41
        return False
43
    @priority(255)
44
    def url_rewrite(self, feed, entry):
45
        """Rewrites given entry url. Raises UrlRewritingError if failed."""
46
        tries = 0
47
        while self.url_rewritable(feed, entry):
48
            tries += 1
49
            if tries > 300:
50
                raise UrlRewritingError('URL rewriting was left in infinite loop while rewriting url for %s, some rewriter is returning always True' % entry)
51
            for urlrewriter in get_plugins_by_group('urlrewriter'):
52
                name = urlrewriter.name
53
                try:
54
                    if urlrewriter.instance.url_rewritable(feed, entry):
55
                        log.debug('Url rewriting %s' % entry['url'])
56
                        urlrewriter.instance.url_rewrite(feed, entry)
57
                        log.info('Entry \'%s\' URL rewritten to %s (with %s)' % (entry['title'], entry['url'], name))
58
                except UrlRewritingError, r:
62
                    raise UrlRewritingError('URL rewriting %s failed: %s' % (name, str(r.value)))
63
                except PluginError, e:
64
                    raise UrlRewritingError('URL rewriting %s failed: %s' % (name, str(e.value)))
65
                except Exception, e:
66
                    log.exception(e)
67
                    raise UrlRewritingError('%s: Internal error with url %s' % (name, entry['url']))
69
register_plugin(PluginUrlRewriting, 'urlrewriting', builtin=True)
70
register_feed_phase('urlrewrite', before='download')