flexget.plugins.module_search
Covered: 28 lines
Missed: 36 lines
Skipped 21 lines
Percent: 43 %
 1
import logging
 2
from flexget.plugin import *
 4
log = logging.getLogger('search')
 7
class SearchPlugins(object):
 9
    """
10
        Implements --search-plugins
11
    """
13
    def on_process_start(self, feed):
14
        if feed.manager.options.search_plugins:
15
            feed.manager.disable_feeds()
16
            header = '-- Supported search plugins: '
17
            header = header + '-' * (79 - len(header))
18
            print header
19
            for plugin in get_plugins_by_group('search'):
20
                print ' %s' % plugin.name
21
            print '-' * 79
24
class PluginSearch(object):
25
    """
26
        Search entry from sites. Accepts list of known search plugins, list is in priority order.
27
        Once hit has been found no more searches are performed. Should be used only when
28
        there is no other way to get working download url, ie. when input plugin does not provide
29
        any downloadable urls.
31
        Example:
33
        search:
34
          - newtorrents
35
          - piratebay
37
        Notes:
38
        - Some url rewriters will use search plugins automaticly if enry url points into a search page.
39
    """
41
    def validator(self):
43
        from flexget import validator
44
        search = validator.factory('list')
45
        search.accept('text')
46
        return search
48
    def on_feed_urlrewrite(self, feed):
50
        if feed.manager.unit_test:
51
            return
53
        plugins = {}
54
        for plugin in get_plugins_by_group('search'):
55
            plugins[plugin.name] = plugin.instance
57
        for entry in feed.accepted:
58
            found = False
60
            for name in feed.config.get('search', []):
61
                if not name in plugins:
62
                    log.error('Search plugins %s not found' % name)
63
                    log.debug('Registered: %s' % ', '.join(plugins.keys()))
64
                    continue
65
                log.debug('Issuing search from %s' % name)
66
                try:
67
                    url = plugins[name].search(feed, entry)
68
                except PluginWarning, pw:
69
                    log.debug('Search failed: %s' % pw.value)
70
                    continue
71
                if url:
72
                    log.debug('Found url: %s' % url)
73
                    entry['url'] = url
74
                    found = True
75
                    break
78
            if not found:
79
                feed.reject(entry, 'search failed')
81
register_plugin(PluginSearch, 'search')
82
register_plugin(SearchPlugins, '--search-plugins', builtin=True)
83
register_parser_option('--search-plugins', action='store_true', dest='search_plugins', default=False,
84
                       help='List supported search plugins.')