flexget.plugins.filter.queue_base
Covered: 34 lines
Missed: 21 lines
Skipped 20 lines
Percent: 61 %
 1
from datetime import datetime
 2
import logging
 3
from sqlalchemy import Column, Integer, Boolean, String, Unicode, DateTime
 4
from flexget.schema import versioned_base
 5
from flexget.plugin import priority
 7
log = logging.getLogger('queue')
 8
Base = versioned_base('queue', 0)
11
class QueuedItem(Base):
12
    __tablename__ = 'queue'
13
    id = Column(Integer, primary_key=True)
14
    title = Column(Unicode)
15
    added = Column(DateTime)
16
    immortal = Column(Boolean)
18
    downloaded = Column(DateTime)
19
    entry_title = Column(Unicode)
20
    entry_url = Column(Unicode)
21
    entry_original_url = Column(Unicode)
23
    discriminator = Column('type', String)
24
    __mapper_args__ = {'polymorphic_on': discriminator}
26
    def __init__(self, **kwargs):
27
        super(QueuedItem, self).__init__(**kwargs)
28
        self.added = datetime.now()
31
class FilterQueueBase(object):
32
    """Base class to handle general tasks of keeping a queue of wanted items."""
34
    def on_feed_start(self, feed, config):
36
        self.accepted_entries = {}
38
    def validator(self):
39
        """Default validator just accepts a boolean, can be overridden by subclasses"""
40
        from flexget import validator
41
        return validator.factory('boolean')
43
    def matches(self, feed, config, entry):
44
        """This should return the QueueItem object for the match, if this entry is in the queue."""
45
        raise NotImplementedError
47
    @priority(129)
48
    def on_feed_filter(self, feed, config):
49
        if config is False:
50
            return
52
        for entry in feed.entries:
53
            item = self.matches(feed, config, entry)
54
            if item and item.id not in self.accepted_entries:
56
                if item.immortal:
57
                    entry['immortal'] = True
58
                feed.accept(entry, reason='Matches %s queue item: %s' % (item.discriminator, item.title))
60
                self.accepted_entries[item.id] = entry
62
    def on_feed_exit(self, feed, config):
63
        if config is False:
64
            return
66
        for id, entry in self.accepted_entries.iteritems():
67
            if entry in feed.accepted and entry not in feed.failed:
69
                update_values = {'downloaded': datetime.now(),
70
                                 'entry_title': entry['title'],
71
                                 'entry_url': entry['url'],
72
                                 'entry_original_url': entry['original_url']}
73
                feed.session.query(QueuedItem).filter(QueuedItem.id == id).update(update_values)
74
                log.debug('%s was successful, removing from imdb-queue' % entry['title'])