]> git.rmz.io Git - dotfiles.git/blob - flexget/plugins/my_exists_movie.py
weechat: install screen_away
[dotfiles.git] / flexget / plugins / my_exists_movie.py
1 from __future__ import unicode_literals, division, absolute_import
2 import os
3 import re
4 import logging
5
6 from flexget import plugin
7 from flexget.event import event
8 from flexget.config_schema import one_or_more
9 from flexget.plugin import get_plugin_by_name
10 from flexget.utils.tools import TimedDict
11
12 log = logging.getLogger('my_exists_movie')
13
14
15 class FilterExistsMovie(object):
16 """
17 Reject existing movies.
18
19 Example::
20
21 exists_movie: /storage/movies/
22 """
23
24 schema = {
25 'anyOf': [
26 one_or_more({'type': 'string', 'format': 'path'}),
27 {
28 'type': 'object',
29 'properties': {
30 'path': one_or_more({'type': 'string', 'format': 'path'}),
31 'allow_different_qualities': {'enum': ['better', True, False], 'default': False},
32 'type': {'enum': ['files', 'dirs'], 'default': 'files'}
33 },
34 'required': ['path'],
35 'additionalProperties': False
36 }
37 ]
38 }
39
40 def __init__(self):
41 self.cache = TimedDict(cache_time='1 hour')
42
43 def prepare_config(self, config):
44 # if config is not a dict, assign value to 'path' key
45 if not isinstance(config, dict):
46 config = {'path': config}
47 # if only a single path is passed turn it into a 1 element list
48 if isinstance(config['path'], basestring):
49 config['path'] = [config['path']]
50 return config
51
52 @plugin.priority(-1)
53 def on_task_filter(self, task, config):
54 # if not task.accepted:
55 # log.debug('nothing accepted, aborting')
56 # return
57
58 config = self.prepare_config(config)
59 imdb_lookup = plugin.get_plugin_by_name('imdb_lookup').instance
60
61 incompatible_files = 0
62 incompatible_entries = 0
63 count_entries = 0
64 count_files = 0
65
66 # list of imdb ids gathered from paths / cache
67 qualities = {}
68
69 for folder in config['path']:
70 folder = os.path.expanduser(folder)
71 # see if this path has already been scanned
72 if folder in self.cache:
73 log.verbose('Using cached scan for %s ...' % folder)
74 qualities.update(self.cache[folder])
75 continue
76
77 path_ids = {}
78
79 if not os.path.isdir(folder):
80 log.critical('Path %s does not exist' % folder)
81 continue
82
83 log.verbose('Scanning path %s ...' % folder)
84
85 # Help debugging by removing a lot of noise
86 #logging.getLogger('movieparser').setLevel(logging.WARNING)
87 #logging.getLogger('imdb_lookup').setLevel(logging.WARNING)
88
89 # scan through
90 for root, dirs, files in os.walk(folder):
91 for item in eval(config['type']):
92 log.debug("item: %s" % item)
93 pattern = re.compile(".*\.(avi|mkv|mp4|mpg|webm)")
94 if not re.search(pattern, item):
95 continue
96 count_files += 1
97
98 movie = get_plugin_by_name('parsing').instance.parse_movie(item)
99
100 try:
101 imdb_id = imdb_lookup.imdb_id_lookup(movie_title=movie.name,
102 raw_title=item,
103 session=task.session)
104 if imdb_id in path_ids:
105 log.trace('duplicate %s' % item)
106 continue
107 if imdb_id is not None:
108 log.trace('adding: %s' % imdb_id)
109 path_ids[imdb_id] = movie.quality
110 except plugin.PluginError as e:
111 log.trace('%s lookup failed (%s)' % (item, e.value))
112 incompatible_files += 1
113
114 # store to cache and extend to found list
115 self.cache[folder] = path_ids
116 qualities.update(path_ids)
117
118 log.debug('qualities: %s' % qualities)
119
120 log.debug('-- Start filtering entries ----------------------------------')
121
122 # do actual filtering
123 for entry in task.accepted:
124 count_entries += 1
125 if not entry.get('imdb_id', eval_lazy=False):
126 try:
127 imdb_lookup.lookup(entry)
128 except plugin.PluginError as e:
129 log.trace('entry %s imdb failed (%s)' % (entry['title'], e.value))
130 incompatible_entries += 1
131 continue
132
133 entry.trace("msg")
134 # actual filtering
135 if entry['imdb_id'] in qualities:
136 if config.get('allow_different_qualities') == 'better':
137 if entry['quality'] > qualities[entry['imdb_id']]:
138 log.trace('better quality')
139 continue
140 elif config.get('allow_different_qualities'):
141 if entry['quality'] != qualities[entry['imdb_id']]:
142 log.trace('wrong quality')
143 continue
144
145 entry.reject('movie exists')
146
147 if incompatible_files or incompatible_entries:
148 log.verbose('There were some incompatible items. %s of %s entries '
149 'and %s of %s directories could not be verified.' %
150 (incompatible_entries, count_entries, incompatible_files, count_dirs))
151
152 log.debug('-- Finished filtering entries -------------------------------')
153
154 @event('plugin.register')
155 def register_plugin():
156 plugin.register(FilterExistsMovie, 'my_exists_movie', groups=['exists'], api_ver=2)