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)
# 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
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)
#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
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 ----------------------------------')
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 -------------------------------')