flexget.plugins.filter_imdb
Covered: 66 lines
Missed: 84 lines
Skipped 44 lines
Percent: 44 %
  1
import logging
  2
from flexget.plugin import register_plugin, get_plugin_by_name, PluginError
  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
 84
    def on_feed_filter(self, feed):
 85
        config = feed.config['imdb']
 87
        lookup = get_plugin_by_name('imdb_lookup').instance.lookup
 89
        for entry in feed.entries:
 90
            force_accept = False
 92
            try:
 93
                lookup(feed, entry)
 94
            except PluginError, e:
 96
                msg = 'Skipping %s because of an error: %s' % (entry['title'], e.value)
 97
                if not log_once(msg, logger=log):
 98
                    feed.verbose_progress(msg, log)
 99
                continue
100
            if entry["imdb_mpaa_rating"] == '':
101
                entry["imdb_mpaa_rating"] = "NONE"
103
            reasons = []
104
            if 'min_score' in config:
105
                if entry['imdb_score'] < config['min_score']:
106
                    reasons.append('min_score (%s < %s)' % (entry['imdb_score'], config['min_score']))
107
            if 'min_votes' in config:
108
                if entry['imdb_votes'] < config['min_votes']:
109
                    reasons.append('min_votes (%s < %s)' % (entry['imdb_votes'], config['min_votes']))
110
            if 'min_year' in config:
111
                if entry['imdb_year'] < config['min_year']:
112
                    reasons.append('min_year (%s < %s)' % (entry['imdb_year'], config['min_year']))
113
            if 'max_year' in config:
114
                if entry['imdb_year'] == 0 or entry['imdb_year'] > config['max_year']:
115
                    reasons.append('max_year (%s > %s)' % (entry['imdb_year'], config['max_year']))
116
            if 'reject_genres' in config:
117
                rejected = config['reject_genres']
118
                for genre in entry['imdb_genres']:
119
                    if genre in rejected:
120
                        reasons.append('reject_genres')
121
                        break
123
            if 'reject_languages' in config:
124
                rejected = config['reject_languages']
125
                for language in entry['imdb_languages']:
126
                    if language in rejected:
127
                        reasons.append('reject_languages')
128
                        break
130
            if 'accept_languages' in config:
131
                accepted = config['accept_languages']
132
                for language in entry['imdb_languages']:
133
                    if language not in accepted:
134
                        reasons.append('accept_languages')
135
                        break
137
            if 'reject_actors' in config:
138
                rejected = config['reject_actors']
139
                for actor_id, actor_name in entry['imdb_actors'].iteritems():
140
                    if actor_id in rejected or actor_name in rejected:
141
                        reasons.append('reject_actors %s' % actor_name or actor_id)
142
                        break
145
            if 'accept_actors' in config:
146
                accepted = config['accept_actors']
147
                for actor_id, actor_name in entry['imdb_actors'].iteritems():
148
                    if actor_id in accepted or actor_name in accepted:
149
                        log.debug("Accepting because of accept_actors %s" % actor_name or actor_id)
150
                        force_accept = True
151
                        break
153
            if 'reject_directors' in config:
154
                rejected = config['reject_directors']
155
                for director_id, director_name in entry['imdb_directors'].iteritems():
156
                    if director_id in rejected or director_name in rejected:
157
                        reasons.append('reject_directors %s' % director_name or director_id)
158
                        break
161
            if 'accept_directors' in config:
162
                accepted = config['accept_directors']
163
                for director_id, director_name in entry['imdb_directors'].iteritems():
164
                    if director_id in accepted or director_name in accepted:
165
                        log.debug("Accepting because of accept_directors %s" % director_name or director_id)
166
                        force_accept = True
167
                        break
169
            if 'reject_mpaa_ratings' in config:
170
                rejected = config['reject_mpaa_ratings']
171
                if entry["imdb_mpaa_rating"] in rejected:
172
                    reasons.append('reject_mpaa_ratings %s' % entry["imdb_mpaa_rating"])
174
            if 'accept_mpaa_ratings' in config:
175
                accepted = config['accept_mpaa_ratings']
176
                if entry["imdb_mpaa_rating"] not in accepted:
177
                    reasons.append("accept_mpaa_ratings %s" % entry["imdb_mpaa_rating"])
179
            if reasons and not force_accept:
180
                msg = 'Skipping %s because of rule(s) %s' % \
181
                    (entry.get('imdb_name', None) or entry['title'], ', '.join(reasons))
182
                if feed.manager.options.debug:
183
                    log.debug(msg)
184
                else:
185
                    if feed.manager.options.quiet:
186
                        log_once(msg, log)
187
                    else:
188
                        log.info(msg)
189
            else:
190
                log.debug('Accepting %s' % (entry['title']))
191
                feed.accept(entry)
193
register_plugin(FilterImdb, 'imdb')