1
from flexget.feed import Entry
2
from flexget.plugin import register_plugin, internet
3
from flexget.utils.cached_input import cached
6
from flexget.utils.tools import urlopener
8
log = logging.getLogger('text')
11
class InputText(object):
14
Parse any text for entries using regular expression.
18
<field>: <regexp to match value>
20
<field>: <python string formatting>
22
Note: each entry must have atleast two fields, title and url
27
url: http://www.nbc.com/Heroes/js/novels.js
29
title: novelTitle = "(.*)"
30
url: novelPrint = "(.*)"
32
url: http://www.nbc.com%(url)s
36
from flexget import validator
37
root = validator.factory('dict')
38
root.accept('url', key='url')
39
root.accept('file', key='url')
40
root.require_key('url')
41
entry = root.accept('dict', key='entry', required=True)
42
entry.accept('regexp', key='url', required=True)
43
entry.accept('regexp', key='title', required=True)
44
entry.accept_any_key('regexp')
45
format = root.accept('dict', key='format')
46
format.accept_any_key('text')
49
def format_entry(self, entry, d):
50
for k, v in d.iteritems():
53
@cached('text', 'url')
55
def on_feed_input(self, feed):
56
url = feed.config['text']['url']
57
content = urlopener(url, log)
59
entry_config = feed.config['text'].get('entry')
60
format_config = feed.config['text'].get('format', {})
62
# keep track what fields have been found
68
for field, regexp in entry_config.iteritems():
69
#log.debug('search field: %s regexp: %s' % (field, regexp))
70
match = re.search(regexp, line)
72
# check if used field detected, in such case start with new entry
73
if used.has_key(field):
75
log.info('Found field %s again before entry was completed. \
76
Adding current incomplete, but valid entry and moving to next.' % field)
77
self.format_entry(entry, format_config)
78
feed.entries.append(entry)
80
log.info('Invalid data, entry field %s is already found once. Ignoring entry.' % field)
86
entry[field] = match.group(1)
88
log.debug('found field: %s value: %s' % (field, entry[field]))
90
# if all fields have been found
91
if len(used) == len(entry_config):
92
# check that entry has atleast title and url
93
if not entry.isvalid():
94
log.info('Invalid data, constructed entry is missing mandatory fields (title or url)')
96
self.format_entry(entry, format_config)
97
feed.entries.append(entry)
98
log.debug('Added entry %s' % entry)
103
register_plugin(InputText, 'text')