flexget.plugins.filter.exists_movie
Covered: 25 lines
Missed: 67 lines
Skipped 46 lines
Percent: 27 %
  1
import os
  2
import logging
  3
from flexget.plugin import register_plugin, priority, PluginError, get_plugin_by_name
  4
from flexget.utils.imdb import extract_id
  5
from flexget.utils.titles.movie import MovieParser
  7
log = logging.getLogger('exists_movie')
 10
class FilterExistsMovie(object):
 12
    """
 13
        Reject existing movies.
 15
        Example:
 17
        exists_movie: /storage/movies/
 18
    """
 20
    skip = ['cd1', 'cd2', 'subs', 'sample']
 22
    def __init__(self):
 23
        self.cache = {}
 25
    def validator(self):
 26
        from flexget import validator
 27
        root = validator.factory()
 28
        root.accept('path')
 29
        bundle = root.accept('list')
 30
        bundle.accept('path')
 31
        return root
 33
    def build_config(self, config):
 35
        if isinstance(config, basestring):
 36
            config = [config]
 37
        return config
 39
    def on_process_start(self, feed, config):
 40
        self.cache = {}
 42
    @priority(-1)
 43
    def on_feed_filter(self, feed, config):
 44
        if not feed.accepted:
 45
            log.debug('nothing accepted, aborting')
 46
            return
 48
        config = self.build_config(config)
 49
        imdb_lookup = get_plugin_by_name('imdb_lookup').instance
 51
        incompatible_dirs = 0
 52
        incompatible_entries = 0
 53
        count_entries = 0
 54
        count_dirs = 0
 57
        imdb_ids = []
 59
        for path in config:
 61
            if path in self.cache:
 62
                log.verbose('Using cached scan for %s ...' % path)
 63
                imdb_ids.extend(self.cache[path])
 64
                continue
 66
            path_ids = []
 69
            path = str(os.path.expanduser(path))
 70
            if not os.path.exists(path):
 71
                log.critical('Path %s does not exist' % path)
 72
                continue
 74
            log.verbose('Scanning path %s ...' % path)
 81
            for root, dirs, files in os.walk(path):
 83
                dirs = [x.decode('utf-8', 'ignore') for x in dirs]
 87
                for item in dirs:
 88
                    if item.lower() in self.skip:
 89
                        continue
 90
                    count_dirs += 1
 92
                    movie = MovieParser()
 93
                    movie.parse(item)
 95
                    try:
 96
                        imdb_id = imdb_lookup.imdb_id_lookup(movie_title=movie.name,
 97
                                                             raw_title=item,
 98
                                                             session=feed.session)
 99
                        if imdb_id in path_ids:
100
                            log.trace('duplicate %s' % item)
101
                            continue
102
                        if imdb_id is not None:
103
                            log.trace('adding: %s' % imdb_id)
104
                            path_ids.append(imdb_id)
105
                    except PluginError, e:
106
                        log.trace('%s lookup failed (%s)' % (item, e.value))
107
                        incompatible_dirs += 1
110
            self.cache[path] = path_ids
111
            imdb_ids.extend(path_ids)
113
        log.debug('-- Start filtering entries ----------------------------------')
116
        for entry in feed.accepted:
117
            count_entries += 1
118
            if not entry.get('imdb_id', eval_lazy=False):
119
                try:
120
                    imdb_lookup.lookup(entry)
121
                except PluginError, e:
122
                    log.trace('entry %s imdb failed (%s)' % (entry['title'], e.value))
123
                    incompatible_entries += 1
124
                    continue
127
            if entry['imdb_id'] in imdb_ids:
128
                feed.reject(entry, 'movie exists')
130
        if incompatible_dirs or incompatible_entries:
131
            log.verbose('There were some incompatible items. %s of %s entries '
132
                        'and %s of %s directories could not be verified.' %
133
                (incompatible_entries, count_entries, incompatible_dirs, count_dirs))
135
        log.debug('-- Finished filtering entries -------------------------------')
137
register_plugin(FilterExistsMovie, 'exists_movie', groups=['exists'], api_ver=2)