flexget.plugins.filter_delay
Covered: 30 lines
Missed: 37 lines
Skipped 24 lines
Percent: 44 %
 1
import logging
 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)
16
    feed = Column(String)
17
    title = Column(String)
18
    expire = Column(DateTime)
19
    entry = Column(PickleType(mutable=False))
21
    def __repr__(self):
22
        return '<DelayedEntry(title=%s)>' % self.title
25
class FilterDelay(object):
26
    """
27
        Add delay to a feed. This is useful for de-prioritizing expensive / bad-quality feeds.
29
        Format: [n] [minutes|hours|days|months]
31
        Example:
33
        delay: 2 hours
34
    """
36
    def validator(self):
37
        from flexget import validator
38
        root = validator.factory('regexp_match')
39
        root.accept('\d+ (minutes|hours|days|weeks)')
40
        return root
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)}
46
        try:
47
            return timedelta(**params)
48
        except TypeError:
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
60
            for fe in feed.entries[:]:
61
                if fe['title'] == entry['title']:
62
                    feed.entries.remove(fe)
66
            fresh_entry = Entry(**dict(entry))
67
            feed.entries.append(fresh_entry)
69
            feed.session.delete(delayed_entry)
71
    @priority(250)
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:
76
                continue
78
            if feed.session.query(DelayedEntry).filter(DelayedEntry.title == entry['title']).\
79
                                  filter(DelayedEntry.feed == feed.name).first():
80
                feed.reject(entry, 'in delay')
81
            else:
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')