2
from flexget.feed import Entry
3
from flexget.manager import Base
4
from flexget.plugin import register_plugin, priority, PluginWarning
5
from datetime import datetime, timedelta
6
from sqlalchemy import Column, Integer, String, DateTime, PickleType
8
log = logging.getLogger('delay')
11
class DelayedEntry(Base):
13
__tablename__ = 'delay'
15
id = Column(Integer, primary_key=True)
17
title = Column(String)
18
expire = Column(DateTime)
19
entry = Column(PickleType(mutable=False))
22
return '<DelayedEntry(title=%s)>' % self.title
25
class FilterDelay(object):
27
Add delay to a feed. This is useful for de-prioritizing expensive / bad-quality feeds.
29
Format: [n] [minutes|hours|days|months]
37
from flexget import validator
38
root = validator.factory('regexp_match')
39
root.accept('\d+ (minutes|hours|days|weeks)')
42
def get_delay(self, feed):
43
amount, unit = feed.config.get('delay').split(' ')
44
log.debug('amount: %s unit: %s' % (repr(amount), repr(unit)))
45
params = {unit: int(amount)}
47
return timedelta(**params)
49
raise PluginWarning('Invalid time format', log)
51
def on_feed_input(self, feed):
52
entries = feed.session.query(DelayedEntry).filter(datetime.now() > DelayedEntry.expire).\
53
filter(DelayedEntry.feed == feed.name).all()
54
for delayed_entry in entries:
55
entry = delayed_entry.entry
56
log.debug('Releasing %s' % entry['title'])
58
entry['passed_delay'] = True
59
# if there is same entry already in the feed, remove it to reduce confusion
60
for fe in feed.entries[:]:
61
if fe['title'] == entry['title']:
62
feed.entries.remove(fe)
64
# HACK: we have made some changes to the Entry class, these changes are
65
# not reflected into the database. Construct new Entry class instance
66
fresh_entry = Entry(**dict(entry))
67
feed.entries.append(fresh_entry)
69
feed.session.delete(delayed_entry)
72
def on_feed_filter(self, feed):
73
expire_time = datetime.now() + self.get_delay(feed)
74
for entry in feed.entries:
75
if 'passed_delay' in entry:
77
# check if already in queue
78
if feed.session.query(DelayedEntry).filter(DelayedEntry.title == entry['title']).\
79
filter(DelayedEntry.feed == feed.name).first():
80
feed.reject(entry, 'in delay')
82
delay_entry = DelayedEntry()
83
delay_entry.title = entry['title']
84
delay_entry.entry = entry
85
delay_entry.feed = feed.name
86
delay_entry.expire = expire_time
87
feed.reject(entry, 'delaying')
88
feed.session.add(delay_entry)
90
register_plugin(FilterDelay, 'delay')