From: Samir Benmendil Date: Mon, 5 Jan 2015 07:46:40 +0000 (+0000) Subject: flexget: initial my_exists_movie plugin X-Git-Url: https://git.rmz.io/dotfiles.git/commitdiff_plain/8cd742d4aa187e46cd6f1b8f1bf834e57f5f243e flexget: initial my_exists_movie plugin --- diff --git a/flexget/plugins/my_exists_movie.py b/flexget/plugins/my_exists_movie.py new file mode 100644 index 0000000..30d3eb8 --- /dev/null +++ b/flexget/plugins/my_exists_movie.py @@ -0,0 +1,128 @@ +from __future__ import unicode_literals, division, absolute_import +import os +import re +import logging + +from flexget import plugin +from flexget.event import event +from flexget.config_schema import one_or_more +from flexget.plugin import get_plugin_by_name +from flexget.utils.tools import TimedDict + +log = logging.getLogger('my_exists_movie') + + +class FilterExistsMovie(object): + """ + Reject existing movies. + + Example:: + + exists_movie: /storage/movies/ + """ + + schema = one_or_more({'type': 'string', 'format': 'path'}) + + def __init__(self): + self.cache = TimedDict(cache_time='1 hour') + + def build_config(self, config): + # if only a single path is passed turn it into a 1 element list + if isinstance(config, basestring): + config = [config] + return config + + @plugin.priority(-1) + def on_task_filter(self, task, config): + # if not task.accepted: + # log.debug('nothing accepted, aborting') + # return + + config = self.build_config(config) + imdb_lookup = plugin.get_plugin_by_name('imdb_lookup').instance + + incompatible_files = 0 + incompatible_entries = 0 + count_entries = 0 + count_files = 0 + + # list of imdb ids gathered from paths / cache + imdb_ids = [] + + for folder in config: + folder = os.path.expanduser(folder) + # see if this path has already been scanned + if folder in self.cache: + log.verbose('Using cached scan for %s ...' % folder) + imdb_ids.extend(self.cache[folder]) + continue + + path_ids = [] + + if not os.path.isdir(folder): + log.critical('Path %s does not exist' % folder) + continue + + log.verbose('Scanning path %s ...' % folder) + + # Help debugging by removing a lot of noise + #logging.getLogger('movieparser').setLevel(logging.WARNING) + #logging.getLogger('imdb_lookup').setLevel(logging.WARNING) + + # scan through + + # TODO: add also video files? + for root, dirs, files in os.walk(folder): + for item in files: + pattern = re.compile(".*\.(avi|mkv|mp4|mpg|webm)") + if not re.search(pattern, item): + continue + count_files += 1 + + movie = get_plugin_by_name('parsing').instance.parse_movie(item) + + try: + imdb_id = imdb_lookup.imdb_id_lookup(movie_title=movie.name, + raw_title=item, + session=task.session) + if imdb_id in path_ids: + log.trace('duplicate %s' % item) + continue + if imdb_id is not None: + log.trace('adding: %s' % imdb_id) + path_ids.append(imdb_id) + except plugin.PluginError as e: + log.trace('%s lookup failed (%s)' % (item, e.value)) + incompatible_files += 1 + + # store to cache and extend to found list + self.cache[folder] = path_ids + imdb_ids.extend(path_ids) + + log.debug('-- Start filtering entries ----------------------------------') + + # do actual filtering + for entry in task.accepted: + count_entries += 1 + if not entry.get('imdb_id', eval_lazy=False): + try: + imdb_lookup.lookup(entry) + except plugin.PluginError as e: + log.trace('entry %s imdb failed (%s)' % (entry['title'], e.value)) + incompatible_entries += 1 + continue + + # actual filtering + if entry['imdb_id'] in imdb_ids: + entry.reject('movie exists') + + if incompatible_dirs or incompatible_entries: + log.verbose('There were some incompatible items. %s of %s entries ' + 'and %s of %s directories could not be verified.' % + (incompatible_entries, count_entries, incompatible_dirs, count_dirs)) + + log.debug('-- Finished filtering entries -------------------------------') + +@event('plugin.register') +def register_plugin(): + plugin.register(FilterExistsMovie, 'my_exists_movie', groups=['exists'], api_ver=2)