flexget.plugins.filter_seen_movies
Covered: 43 lines
Missed: 23 lines
Skipped 26 lines
Percent: 65 %
 1
import logging
 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:
12
            return
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
21
        session = Session()
23
        index = 0
24
        count = 0
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():
31
            index += 1
32
            if (index % 5 == 0):
33
                bar.update(index)
34
            value = u'http://www.imdb.com/title/%s/' % extract_id(seen.value)
35
            if value != seen.value:
36
                count += 1
37
                seen.value = value
38
                seen.field = unicode('imdb_url')
40
        bar.finish()
41
        session.commit()
43
        print 'Fixed %s/%s URLs' % (count, total)
46
class FilterSeenMovies(FilterSeen):
47
    """
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.
54
    """
56
    def __init__(self):
58
        self.fields = ['imdb_url']
59
        self.keyword = 'seen_movies'
61
    def validator(self):
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'])
65
        return root
68
    @priority(-255)
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)
79
        movies = []
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'])
84
                else:
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)')