Source code for flexget.components.seen.seen_movies

from collections import defaultdict

from loguru import logger

from flexget import plugin
from flexget.event import event

from . import seen as plugin_seen

logger = logger.bind(name='seen_movies')


[docs] class FilterSeenMovies(plugin_seen.FilterSeen): """Prevent movies being downloaded twice. Work only on entries which have imdb url available. How duplicate movie detection works: 1) Remember all imdb urls from downloaded entries. 2) If stored imdb url appears again, entry is rejected. """ schema = { 'oneOf': [ {'type': 'string', 'enum': ['strict', 'loose']}, { 'type': 'object', 'properties': { 'scope': {'type': 'string', 'enum': ['global', 'local']}, 'matching': {'type': 'string', 'enum': ['strict', 'loose']}, }, 'additionalProperties': False, }, ] } def __init__(self): # remember and filter by these fields self.fields = ['imdb_id', 'tmdb_id', 'trakt_movie_id'] self.keyword = 'seen_movies' # We run last to make sure we don't reject duplicates before all the other plugins get a chance to reject.
[docs] @plugin.priority(plugin.PRIORITY_LAST) def on_task_filter(self, task, config): if not isinstance(config, dict): config = {'matching': config} # Reject all entries without if config.get('matching') == 'strict': for entry in task.entries: if not any(field in entry for field in self.fields): logger.info( 'Rejecting {} because of missing movie (imdb, tmdb or trakt) id', entry['title'], ) entry.reject('missing movie (imdb, tmdb or trakt) id, strict') # call super super().on_task_filter(task, config.get('scope', True)) # check that two copies of a movie have not been accepted this run accepted_ids = defaultdict(set) for entry in task.accepted: for field in self.fields: if field in entry: if entry[field] in accepted_ids[field]: entry.reject(f'already accepted {field} {entry[field]} once in task') break accepted_ids[field].add(entry[field])
[docs] def on_task_learn(self, task, config): if not isinstance(config, dict): config = {'matching': config} # call super super().on_task_learn(task, config.get('scope', True))
[docs] @event('plugin.register') def register_plugin(): plugin.register(FilterSeenMovies, 'seen_movies', api_ver=2)