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):
10
This plugin allows filtering based on IMDB score, votes and genres etc.
14
Note: All parameters are optional. Some are mutually exclusive.
21
# reject if genre contains any of these
26
# reject if language contain any of these
30
# accept only these primary languages
34
# accept movies with any of these actors
39
# reject movie if it has any of these actors
44
# accept all movies by these directors
48
# reject movies by these directors
52
# reject movies/TV shows with any of these ratings
58
# accept movies/TV shows with only these ratings
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')
84
# Run later to avoid unnecessary lookups
86
def on_feed_filter(self, feed, config):
88
lookup = get_plugin_by_name('imdb_lookup').instance.lookup
90
# since the plugin does not reject anything, no sense going trough accepted
91
for entry in feed.undecided:
97
except PluginError, e:
98
# logs skip message once trough log_once (info) and then only when ran from cmd line (w/o --cron)
99
msg = 'Skipping %s because of an error: %s' % (entry['title'], e.value)
100
if not log_once(msg, logger=log):
104
#for key, value in entry.iteritems():
105
# log.debug('%s = %s (type: %s)' % (key, value, type(value)))
107
# Check defined conditions, TODO: rewrite into functions?
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')
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')
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:
138
# Reject if the first (primary) language is not among acceptable languages
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)
148
# Accept if actors contains an accepted actor, but don't reject otherwise
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)
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)
164
# Accept if the director is in the accept list, but do not reject if the director is unknown
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)
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:
189
if feed.manager.options.quiet:
194
log.debug('Accepting %s' % (entry['title']))
197
register_plugin(FilterImdb, 'imdb', api_ver=2)