From a3c7779ad3409f1f705ee8e62e041f29b55d977e Mon Sep 17 00:00:00 2001 From: Samir Benmendil Date: Tue, 6 Jan 2015 16:28:48 +0000 Subject: [PATCH] flexget: finish my_exists_movie plugin walk both files and folders allow different qualities --- flexget/plugins/my_exists_movie.py | 62 ++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/flexget/plugins/my_exists_movie.py b/flexget/plugins/my_exists_movie.py index 30d3eb8..92d6e12 100644 --- a/flexget/plugins/my_exists_movie.py +++ b/flexget/plugins/my_exists_movie.py @@ -21,15 +21,32 @@ class FilterExistsMovie(object): exists_movie: /storage/movies/ """ - schema = one_or_more({'type': 'string', 'format': 'path'}) + schema = { + 'anyOf': [ + one_or_more({'type': 'string', 'format': 'path'}), + { + 'type': 'object', + 'properties': { + 'path': one_or_more({'type': 'string', 'format': 'path'}), + 'allow_different_qualities': {'enum': ['better', True, False], 'default': False}, + 'type': {'enum': ['files', 'dirs'], 'default': 'files'} + }, + 'required': ['path'], + 'additionalProperties': False + } + ] + } def __init__(self): self.cache = TimedDict(cache_time='1 hour') - def build_config(self, config): + def prepare_config(self, config): + # if config is not a dict, assign value to 'path' key + if not isinstance(config, dict): + config = {'path': config} # if only a single path is passed turn it into a 1 element list - if isinstance(config, basestring): - config = [config] + if isinstance(config['path'], basestring): + config['path'] = [config['path']] return config @plugin.priority(-1) @@ -38,7 +55,7 @@ class FilterExistsMovie(object): # log.debug('nothing accepted, aborting') # return - config = self.build_config(config) + config = self.prepare_config(config) imdb_lookup = plugin.get_plugin_by_name('imdb_lookup').instance incompatible_files = 0 @@ -47,17 +64,17 @@ class FilterExistsMovie(object): count_files = 0 # list of imdb ids gathered from paths / cache - imdb_ids = [] + qualities = {} - for folder in config: + for folder in config['path']: 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]) + qualities.update(self.cache[folder]) continue - path_ids = [] + path_ids = {} if not os.path.isdir(folder): log.critical('Path %s does not exist' % folder) @@ -70,10 +87,9 @@ class FilterExistsMovie(object): #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: + for item in eval(config['type']): + log.debug("item: %s" % item) pattern = re.compile(".*\.(avi|mkv|mp4|mpg|webm)") if not re.search(pattern, item): continue @@ -90,14 +106,16 @@ class FilterExistsMovie(object): continue if imdb_id is not None: log.trace('adding: %s' % imdb_id) - path_ids.append(imdb_id) + path_ids[imdb_id] = movie.quality 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) + qualities.update(path_ids) + + log.debug('qualities: %s' % qualities) log.debug('-- Start filtering entries ----------------------------------') @@ -112,14 +130,24 @@ class FilterExistsMovie(object): incompatible_entries += 1 continue + entry.trace("msg") # actual filtering - if entry['imdb_id'] in imdb_ids: + if entry['imdb_id'] in qualities: + if config.get('allow_different_qualities') == 'better': + if entry['quality'] > qualities[entry['imdb_id']]: + log.trace('better quality') + continue + elif config.get('allow_different_qualities'): + if entry['quality'] != qualities[entry['imdb_id']]: + log.trace('wrong quality') + continue + entry.reject('movie exists') - if incompatible_dirs or incompatible_entries: + if incompatible_files 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)) + (incompatible_entries, count_entries, incompatible_files, count_dirs)) log.debug('-- Finished filtering entries -------------------------------') -- 2.48.1