3
from flexget.plugin import priority, register_plugin
5
log = logging.getLogger('manipulate')
8
class Manipulate(object):
13
- <destination field>:
15
[from]: <source field>
25
extract: \[\d\d\d\d\](.*)
29
from flexget import validator
30
root = validator.factory()
31
bundle = root.accept('list').accept('dict')
32
# prevent invalid indentation level
33
bundle.reject_keys(['from', 'extract', 'replace', 'event'],
34
'Option \'$key\' has invalid indentation level. It needs 2 more spaces.')
35
edit = bundle.accept_any_key('dict')
36
edit.accept('choice', key='event').accept_choices(['metainfo', 'filter'], ignore_case=True)
37
edit.accept('text', key='from')
38
edit.accept('regexp', key='extract')
39
replace = edit.accept('dict', key='replace')
40
replace.accept('regexp', key='regexp', required=True)
41
replace.accept('text', key='format', required=True)
44
def on_feed_start(self, feed):
45
"""Separates the config into a dict with a list of jobs per event."""
46
config = feed.config['manipulate']
47
self.event_jobs = {'filter': [], 'metainfo': []}
49
for item_config in item.itervalues():
50
# Get the event specified for this item, or use default of metainfo
51
event = item_config.get('event', 'metainfo')
52
self.event_jobs[event].append(item)
55
def on_feed_metainfo(self, feed):
56
if not self.event_jobs['metainfo']:
57
# return if no jobs for this event
59
for entry in feed.entries:
60
self.process(feed, entry, self.event_jobs['metainfo'])
63
def on_feed_filter(self, feed):
64
if not self.event_jobs['filter']:
65
# return if no jobs for this event
67
for entry in feed.entries + feed.rejected:
68
self.process(feed, entry, self.event_jobs['filter'])
70
def process(self, feed, entry, jobs):
73
for field, config in item.iteritems():
76
from_field = config['from']
77
field_value = entry.get(from_field)
78
log.debug('field: %s from_field: %s field_value: %s' % (field, from_field, field_value))
80
if 'extract' in config:
82
log.warning('Cannot extract, field %s is not present' % from_field)
84
match = re.search(config['extract'], field_value)
86
groups = [x for x in match.groups() if x is not None]
87
log.debug('groups: %s' % groups)
88
field_value = ''.join(groups)
89
log.debug('field %s after extract: %s' % (field, field_value))
91
if 'replace' in config:
93
log.warning('Cannot replace, field %s is not present' % from_field)
95
replace_config = config['replace']
96
field_value = re.sub(replace_config['regexp'], replace_config['format'], field_value)
97
log.debug('field %s after replace: %s' % (field, field_value))
99
entry[field] = field_value
100
feed.verbose_progress('Field %s is now %s' % (field, entry[field]), log)
102
register_plugin(Manipulate, 'manipulate')