flexget.plugins.filter.imdb
Covered: 65 lines
Missed: 81 lines
Skipped 52 lines
Percent: 44 %
  1
import logging
  2
from flexget.plugin import register_plugin, get_plugin_by_name, PluginError, priority
  3
from flexget.utils.log import log_once
  5
log = logging.getLogger('imdb')
  8
class FilterImdb(object):
  9
    """
 10
        This plugin allows filtering based on IMDB score, votes and genres etc.
 12
        Configuration:
 14
        Note: All parameters are optional. Some are mutually exclusive.
 16
        min_score: <num>
 17
        min_votes: <num>
 18
        min_year: <num>
 19
        max_year: <num>
 22
        reject_genres:
 23
            - genre1
 24
            - genre2
 27
        reject_languages:
 28
            - language1
 31
        accept_languages:
 32
            - language1
 35
        accept_actors:
 36
            - nm0004695
 37
            - nm0004754
 40
        reject_actors:
 41
            - nm0001191
 42
            - nm0002071
 45
        accept_directors:
 46
            - nm0000318
 49
        reject_directors:
 50
            - nm0093051
 53
        reject_mpaa_ratings:
 54
            - PG_13
 55
            - R
 56
            - X
 59
        accept_mpaa_ratings:
 60
            - PG
 61
            - G
 62
            - TV_Y
 63
    """
 65
    def validator(self):
 66
        """Validate given configuration"""
 67
        from flexget import validator
 68
        imdb = validator.factory('dict')
 69
        imdb.accept('integer', key='min_year')
 70
        imdb.accept('integer', key='max_year')
 71
        imdb.accept('integer', key='min_votes')
 72
        imdb.accept('number', key='min_score')
 73
        imdb.accept('list', key='reject_genres').accept('text')
 74
        imdb.accept('list', key='reject_languages').accept('text')
 75
        imdb.accept('list', key='accept_languages').accept('text')
 76
        imdb.accept('list', key='reject_actors').accept('text')
 77
        imdb.accept('list', key='accept_actors').accept('text')
 78
        imdb.accept('list', key='reject_directors').accept('text')
 79
        imdb.accept('list', key='accept_directors').accept('text')
 80
        imdb.accept('list', key='reject_mpaa_ratings').accept('text')
 81
        imdb.accept('list', key='accept_mpaa_ratings').accept('text')
 82
        return imdb
 85
    @priority(120)
 86
    def on_feed_filter(self, feed, config):
 88
        lookup = get_plugin_by_name('imdb_lookup').instance.lookup
 91
        for entry in feed.undecided:
 93
            force_accept = False
 95
            try:
 96
                lookup(entry)
 97
            except PluginError, e:
 99
                msg = 'Skipping %s because of an error: %s' % (entry['title'], e.value)
100
                if not log_once(msg, logger=log):
101
                    log.verbose(msg)
102
                continue
108
            reasons = []
109
            if 'min_score' in config:
110
                if entry.get('imdb_score', 0) < config['min_score']:
111
                    reasons.append('min_score (%s < %s)' % (entry.get('imdb_score'), config['min_score']))
112
            if 'min_votes' in config:
113
                if entry.get('imdb_votes', 0) < config['min_votes']:
114
                    reasons.append('min_votes (%s < %s)' % (entry.get('imdb_votes'), config['min_votes']))
115
            if 'min_year' in config:
116
                if entry.get('imdb_year', 0) < config['min_year']:
117
                    reasons.append('min_year (%s < %s)' % (entry.get('imdb_year'), config['min_year']))
118
            if 'max_year' in config:
119
                if entry.get('imdb_year', 0) > config['max_year']:
120
                    reasons.append('max_year (%s > %s)' % (entry.get('imdb_year'), config['max_year']))
121
            if 'reject_genres' in config:
122
                rejected = config['reject_genres']
123
                for genre in entry.get('imdb_genres', []):
124
                    if genre in rejected:
125
                        reasons.append('reject_genres')
126
                        break
128
            if 'reject_languages' in config:
129
                rejected = config['reject_languages']
130
                for language in entry.get('imdb_languages', []):
131
                    if language in rejected:
132
                        reasons.append('reject_languages')
133
                        break
135
            if 'accept_languages' in config:
136
                accepted = config['accept_languages']
137
                if entry.get('imdb_languages') and entry['imdb_languages'][0] not in accepted:
139
                    reasons.append('accept_languages')
141
            if 'reject_actors' in config:
142
                rejected = config['reject_actors']
143
                for actor_id, actor_name in entry.get('imdb_actors', {}).iteritems():
144
                    if actor_id in rejected or actor_name in rejected:
145
                        reasons.append('reject_actors %s' % actor_name or actor_id)
146
                        break
149
            if 'accept_actors' in config:
150
                accepted = config['accept_actors']
151
                for actor_id, actor_name in entry.get('imdb_actors', {}).iteritems():
152
                    if actor_id in accepted or actor_name in accepted:
153
                        log.debug('Accepting because of accept_actors %s' % actor_name or actor_id)
154
                        force_accept = True
155
                        break
157
            if 'reject_directors' in config:
158
                rejected = config['reject_directors']
159
                for director_id, director_name in entry.get('imdb_directors', {}).iteritems():
160
                    if director_id in rejected or director_name in rejected:
161
                        reasons.append('reject_directors %s' % director_name or director_id)
162
                        break
165
            if 'accept_directors' in config:
166
                accepted = config['accept_directors']
167
                for director_id, director_name in entry.get('imdb_directors', {}).iteritems():
168
                    if director_id in accepted or director_name in accepted:
169
                        log.debug('Accepting because of accept_directors %s' % director_name or director_id)
170
                        force_accept = True
171
                        break
173
            if 'reject_mpaa_ratings' in config:
174
                rejected = config['reject_mpaa_ratings']
175
                if entry.get('imdb_mpaa_rating') in rejected:
176
                    reasons.append('reject_mpaa_ratings %s' % entry['imdb_mpaa_rating'])
178
            if 'accept_mpaa_ratings' in config:
179
                accepted = config['accept_mpaa_ratings']
180
                if entry.get('imdb_mpaa_rating') not in accepted:
181
                    reasons.append('accept_mpaa_ratings %s' % entry.get('imdb_mpaa_rating'))
183
            if reasons and not force_accept:
184
                msg = 'Didn\'t accept `%s` because of rule(s) %s' % \
185
                    (entry.get('imdb_name', None) or entry['title'], ', '.join(reasons))
186
                if feed.manager.options.debug:
187
                    log.debug(msg)
188
                else:
189
                    if feed.manager.options.quiet:
190
                        log_once(msg, log)
191
                    else:
192
                        log.info(msg)
193
            else:
194
                log.debug('Accepting %s' % (entry['title']))
195
                feed.accept(entry)
197
register_plugin(FilterImdb, 'imdb', api_ver=2)