]> git.rmz.io Git - dotfiles.git/blobdiff - flexget/plugins/my_exists_movie.py
weechat: install screen_away
[dotfiles.git] / flexget / plugins / my_exists_movie.py
index 30d3eb84c3d2c4ef42ce445c086580fd83ebb86b..92d6e126a1f584420d2290d4e07b4173aff6525b 100644 (file)
@@ -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 -------------------------------')