]> git.rmz.io Git - dotfiles.git/commitdiff
flexget: initial my_exists_movie plugin
authorSamir Benmendil <samir.benmendil@gmail.com>
Mon, 5 Jan 2015 07:46:40 +0000 (07:46 +0000)
committerSamir Benmendil <samir.benmendil@gmail.com>
Mon, 5 Jan 2015 07:47:11 +0000 (07:47 +0000)
flexget/plugins/my_exists_movie.py [new file with mode: 0644]

diff --git a/flexget/plugins/my_exists_movie.py b/flexget/plugins/my_exists_movie.py
new file mode 100644 (file)
index 0000000..30d3eb8
--- /dev/null
@@ -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)