flexget.plugins.module_preset
Covered: 75 lines
Missed: 25 lines
Skipped 33 lines
Percent: 75 %
  1
import logging
  2
from flexget.plugin import *
  4
log = logging.getLogger('preset')
  7
class PluginPreset(object):
  8
    """
  9
        Use presets.
 11
        Example:
 13
        preset: movies
 15
        Example, list of presets:
 17
        preset:
 18
          - movies
 19
          - imdb
 20
    """
 22
    def __init__(self):
 23
        self.warned = False
 25
    def validator(self):
 26
        from flexget import validator
 27
        root = validator.factory()
 28
        root.accept('text')
 29
        root.accept('boolean')
 30
        presets = root.accept('list')
 31
        presets.accept('text')
 32
        return root
 34
    @priority(255)
 35
    def on_process_start(self, feed):
 36
        config = feed.config.get('preset', 'global')
 37
        if isinstance(config, basestring):
 38
            config = [config]
 39
        elif isinstance(config, bool): # handles 'preset: no' form to turn off preset on this feed
 40
            if not config:
 41
                return
 44
        if feed.manager.options.preset:
 45
            if feed.manager.options.preset not in config:
 46
                feed.enabled = False
 47
                return
 50
        if 'no_global' in config:
 51
            config.remove('no_global')
 52
            if 'global' in config:
 53
                config.remove('global')
 54
        elif not 'global' in config:
 55
            config.append('global')
 57
        log.log(5, 'presets: %s' % config)
 59
        toplevel_presets = feed.manager.config.get('presets', {})
 62
        if (feed.manager.options.test or feed.manager.options.validate) and not self.warned:
 63
            plugins = get_plugin_keywords()
 64
            for name in toplevel_presets.iterkeys():
 65
                if name in plugins:
 66
                    log.warning('Plugin \'%s\' seems to be in the wrong place? You probably wanted to put it in a preset. Please fix the indentation level!' % name)
 67
            self.warned = True
 70
        for preset in config:
 71
            if preset != 'global':
 72
                log.debug('Merging preset %s into feed %s' % (preset, feed.name))
 73
            if not preset in toplevel_presets:
 74
                if preset == 'global':
 75
                    continue
 76
                raise PluginError('Unable to find preset %s for feed %s' % (preset, feed.name), log)
 78
            from flexget.utils.tools import MergeException, merge_dict_from_to
 79
            try:
 80
                merge_dict_from_to(toplevel_presets[preset], feed.config)
 81
            except MergeException:
 82
                raise PluginError('Failed to merge preset %s to feed %s, incompatible datatypes' % (preset, feed.name))
 85
class DisablePlugin(object):
 86
    """
 87
    Allows disabling plugins when using presets.
 89
    Example:
 91
        presets:
 92
          movies:
 93
            download: ~/torrents/movies/
 94
            .
 95
            .
 97
        feeds:
 98
          nzbs:
 99
            preset: movies
100
            disable_plugin:
101
              - download
102
            sabnzbd:
103
              .
104
              .
106
        Feed nzbs uses all other configuration from preset movies but removes the download plugin
107
    """
109
    def validator(self):
110
        from flexget import validator
111
        root = validator.factory()
112
        root.accept('text')
113
        presets = root.accept('list')
114
        presets.accept('text')
115
        return root
117
    @priority(250)
118
    def on_feed_start(self, feed):
119
        config = feed.config['disable_plugin']
120
        if isinstance(config, basestring):
121
            config = [config]
123
        for disable in config:
124
            if disable in feed.config:
125
                log.debug('disabling %s' % disable)
126
                del(feed.config[disable])
128
register_plugin(PluginPreset, 'preset', builtin=True)
129
register_plugin(DisablePlugin, 'disable_plugin')
131
register_parser_option('--preset', action='store', dest='preset', default=False,
132
                       metavar='NAME', help='Execute feeds with given preset.')