3
from flexget.plugin import register_plugin, priority
4
from flexget.utils.tools import replace_from_entry
6
log = logging.getLogger('set')
10
class ModifySet(object):
13
Allows adding information to a feed entry for use later.
18
path: ~/download/path/
24
from jinja2 import Environment
31
from flexget import validator
32
v = validator.factory('dict')
33
v.accept_any_key('any')
36
def register_key(self, key, type='text'):
38
plugins can call this method to register set keys as valid
41
if not key in self.keys:
44
def register_keys(self, keys):
46
for easy registration of multiple keys
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"""
54
log.warning("jinja2 module is not available, set plugin will only work with python string replacement.")
56
# Filter priority is -255 so we run after all filters are finished
58
def on_feed_filter(self, feed, config):
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.
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):
68
this can be called from a plugin to add set values to an entry
70
# Create a new dict so we don't overwrite the set config with string replaced values.
73
# If jinja2 is available do template replacement
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)
81
result = template.render(entry)
82
except UndefinedError:
86
# Do string replacement
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)
93
from flexget import validator
94
v = validator.factory('dict')
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)
103
# If there are valid items in the config, apply to entry.
105
log.debug('adding set: info to entry:\'%s\' %s' % (entry['title'], conf))
108
register_plugin(ModifySet, 'set', api_ver=2)