flexget.plugins.urlrewrite_search
Covered: 30 lines
Missed: 49 lines
Skipped 26 lines
Percent: 37 %
  1
import logging
  2
from flexget.utils.search import StringComparator
  3
from flexget.plugin import get_plugins_by_group, PluginWarning, PluginError, \
  4
    register_parser_option, register_plugin
  6
log = logging.getLogger('urlrewrite_search')
  9
class SearchPlugins(object):
 11
    """
 12
        Implements --search-plugins
 13
    """
 15
    def on_process_start(self, feed):
 16
        if feed.manager.options.search_plugins:
 17
            feed.manager.disable_feeds()
 18
            header = '-- Supported search plugins: '
 19
            header = header + '-' * (79 - len(header))
 20
            print header
 21
            for plugin in get_plugins_by_group('search'):
 22
                print ' %s' % plugin.name
 23
            print '-' * 79
 26
class PluginSearch(object):
 27
    """
 28
    Search entry from sites. Accepts list of known search plugins, list is in priority order.
 29
    Once hit has been found no more searches are performed. Should be used only when
 30
    there is no other way to get working download url, ie. when input plugin does not provide
 31
    any downloadable urls.
 33
    Example:
 35
      urlrewrite_search:
 36
        - newtorrents
 37
        - piratebay
 39
    .. note:: Some url rewriters will use search plugins automatically if enry url
 40
              points into a search page.
 41
    """
 43
    def validator(self):
 44
        from flexget import validator
 45
        search = validator.factory('list')
 46
        names = []
 47
        for plugin in get_plugins_by_group('search'):
 50
            if not hasattr(plugin.instance, 'validator'):
 52
                names.append(plugin.name)
 53
            else:
 54
                plugin_validator = plugin.instance.validator()
 55
                if isinstance(plugin_validator, validator.Validator):
 56
                    search.accept('dict').accept(plugin_validator, key=plugin.name)
 57
                else:
 58
                    log.error("plugin %s has a validator method, but does not "
 59
                              "return a validator instance when called with "
 60
                              "search plugin." % plugin.name)
 61
        search.accept('choice').accept_choices(names)
 62
        return search
 64
    def on_feed_urlrewrite(self, feed, config):
 66
        if feed.manager.unit_test:
 67
            return
 69
        plugins = {}
 70
        for plugin in get_plugins_by_group('search'):
 71
            plugins[plugin.name] = plugin.instance
 74
        for entry in feed.accepted:
 75
            found = False
 77
            for name in config:
 78
                search_config = None
 79
                if isinstance(name, dict):
 81
                    name, search_config = name.items()[0]
 82
                log.verbose('Searching `%s` from %s' % (entry['title'], name))
 83
                try:
 84
                    results = plugins[name].search(entry['title'], StringComparator(cutoff=0.9), search_config)
 85
                    if results:
 86
                        url = results[0]['url']
 87
                        log.debug('Found url: %s' % url)
 88
                        entry['url'] = url
 89
                        found = True
 90
                        break
 91
                except (PluginError, PluginWarning), pw:
 92
                    log.verbose('Failed: %s' % pw.value)
 93
                    continue
 96
            if not found:
 98
                entry['immortal'] = False
 99
                feed.reject(entry, 'search failed')
101
register_plugin(PluginSearch, 'urlrewrite_search', api_ver=2)
102
register_plugin(SearchPlugins, '--search-plugins', builtin=True)
103
register_parser_option('--search-plugins', action='store_true', dest='search_plugins', default=False,
104
                       help='List supported search plugins.')