2
from filter_seen import FilterSeen
3
from flexget.plugin import register_plugin, priority, register_parser_option
5
log = logging.getLogger('seenmovies')
8
class RepairSeenMovies(object):
10
def on_process_start(self, feed):
11
if not feed.manager.options.repair_seen_movies:
14
feed.manager.disable_feeds()
16
from progressbar import ProgressBar, Percentage, Bar, ETA
17
from flexget.manager import Session
18
from filter_seen import SeenField
19
from flexget.utils.imdb import extract_id
25
total = session.query(SeenField).filter(SeenField.field == u'imdb_url').count()
27
widgets = ['Repairing: ', ETA(), ' ', Percentage(), ' ', Bar(left='[', right=']')]
28
bar = ProgressBar(widgets=widgets, maxval=total).start()
30
for seen in session.query(SeenField).filter(SeenField.field == u'imdb_url').all():
34
value = u'http://www.imdb.com/title/%s/' % extract_id(seen.value)
35
if value != seen.value:
38
seen.field = unicode('imdb_url')
43
print 'Fixed %s/%s URLs' % (count, total)
46
class FilterSeenMovies(FilterSeen):
48
Prevents movies being downloaded twice.
49
Works only on entries which have imdb url available.
51
How duplicate movie detection works:
52
1) Remember all imdb urls from downloaded entries.
53
2) If stored imdb url appears again, entry is rejected.
57
# remember and filter by these fields
58
self.fields = ['imdb_url']
59
self.keyword = 'seen_movies'
62
from flexget import validator
63
root = validator.factory('choice', message="must be one of the following: strict, loose")
64
root.accept_choices(['strict', 'loose'])
67
# We run last (-255) to make sure we don't reject duplicates before all the other plugins get a chance to reject.
69
def on_feed_filter(self, feed):
71
if feed.config['seen_movies'] == 'strict':
72
for entry in feed.entries:
73
if not 'imdb_url' in entry:
74
log.info('Rejecting %s because of missing imdb url' % entry['title'])
75
feed.reject(entry, 'missing imdb url, strict')
77
super(FilterSeenMovies, self).on_feed_filter(feed)
78
# check that two copies of a movie have not been accepted this run
80
for entry in feed.accepted:
81
if entry.get('imdb_url'):
82
if not entry['imdb_url'] in movies:
83
movies.append(entry['imdb_url'])
85
feed.reject(entry, 'already accepted once in feed')
87
register_plugin(FilterSeenMovies, 'seen_movies')
88
register_plugin(RepairSeenMovies, '--repair-seen-movies', builtin=True)
90
register_parser_option('--repair-seen-movies', action='store_true', dest='repair_seen_movies', default=False,
91
help='Repair seen movies database (required only when upgrading from old problematic version)')