flexget.plugins.modify_set
Covered: 78 lines
Missed: 6 lines
Skipped 25 lines
Percent: 92 %
  1
from copy import copy
  2
import logging
  3
from flexget.plugin import register_plugin, priority
  4
from flexget.utils.tools import replace_from_entry
  6
log = logging.getLogger('set')
  7
jinja = False
 10
class ModifySet(object):
 12
    """
 13
        Allows adding information to a feed entry for use later.
 15
        Example:
 17
        set:
 18
          path: ~/download/path/
 19
    """
 21
    def __init__(self):
 22
        self.keys = {}
 23
        try:
 24
            from jinja2 import Environment
 25
        except ImportError:
 26
            self.jinja = False
 27
        else:
 28
            self.jinja = True
 30
    def validator(self):
 31
        from flexget import validator
 32
        v = validator.factory('dict')
 33
        v.accept_any_key('any')
 34
        return v
 36
    def register_key(self, key, type='text'):
 37
        """
 38
        plugins can call this method to register set keys as valid
 39
        """
 40
        if key:
 41
            if not key in self.keys:
 42
                self.keys[key] = type
 44
    def register_keys(self, keys):
 45
        """
 46
        for easy registration of multiple keys
 47
        """
 48
        for key, value in keys.iteritems():
 49
            self.register_key(key, value)
 51
    def on_feed_start(self, feed, config):
 52
        """Checks that jinja2 is available"""
 53
        if not self.jinja:
 54
            log.warning("jinja2 module is not available, set plugin will only work with python string replacement.")
 57
    @priority(-255)
 58
    def on_feed_filter(self, feed, config):
 59
        """
 60
        Adds the set dict to all accepted entries. This is not really a filter plugin,
 61
        but it needs to be run before feed_download, so it is run last in the filter chain.
 62
        """
 63
        for entry in feed.entries + feed.rejected:
 64
            self.modify(entry, config, False, entry in feed.accepted)
 66
    def modify(self, entry, config, validate=False, errors=True):
 67
        """
 68
        this can be called from a plugin to add set values to an entry
 69
        """
 71
        conf = copy(config)
 74
        if self.jinja:
 75
            from jinja2 import Environment, StrictUndefined, UndefinedError
 76
            env = Environment(undefined=StrictUndefined)
 77
            for field, template_string in conf.iteritems():
 78
                if isinstance(template_string, basestring):
 79
                    template = env.from_string(template_string)
 80
                    try:
 81
                        result = template.render(entry)
 82
                    except UndefinedError:
 83
                        result = ''
 84
                    conf[field] = result
 87
        for field, value in conf.iteritems():
 88
            if isinstance(value, basestring):
 89
                logger = log.error if errors else log.debug
 90
                conf[field] = replace_from_entry(value, entry, field, logger)
 92
        if validate:
 93
            from flexget import validator
 94
            v = validator.factory('dict')
 95
            for key in self.keys:
 96
                v.accept(self.keys[key], key=key)
 98
            if not v.validate(config):
 99
                log.info('set parameters are invalid, error follows')
100
                log.info(v.errors.messages)
101
                return
104
        if conf:
105
            log.debug('adding set: info to entry:\'%s\' %s' % (entry['title'], conf))
106
            entry.update(conf)
108
register_plugin(ModifySet, 'set', api_ver=2)