1
from datetime import datetime
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)
17
# These fields are populated when the queue item has been downloaded
18
downloaded = Column(DateTime)
19
entry_title = Column(Unicode)
20
entry_url = Column(Unicode)
21
entry_original_url = Column(Unicode)
22
# Configuration for joined table inheritance
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):
35
# Dict of entries accepted by this plugin {imdb_id: entry} format
36
self.accepted_entries = {}
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
48
def on_feed_filter(self, feed, config):
52
for entry in feed.entries:
53
item = self.matches(feed, config, entry)
54
if item and item.id not in self.accepted_entries:
55
# Accept this entry if it matches a queue item that has not been accepted this run yet
57
entry['immortal'] = True
58
feed.accept(entry, reason='Matches %s queue item: %s' % (item.discriminator, item.title))
59
# Keep track of entries we accepted, so they can be marked as downloaded on feed_exit if successful
60
self.accepted_entries[item.id] = entry
62
def on_feed_exit(self, feed, config):
66
for id, entry in self.accepted_entries.iteritems():
67
if entry in feed.accepted and entry not in feed.failed:
68
# If entry was not rejected or failed, mark it as downloaded
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'])