1 from __future__
import unicode_literals
, division
, absolute_import
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
12 log
= logging
.getLogger('my_exists_movie')
15 class FilterExistsMovie(object):
17 Reject existing movies.
21 exists_movie: /storage/movies/
26 one_or_more({'type': 'string', 'format': 'path'}
),
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'}
35 'additionalProperties': False
41 self
.cache
= TimedDict(cache_time
='1 hour')
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']]
53 def on_task_filter(self
, task
, config
):
54 # if not task.accepted:
55 # log.debug('nothing accepted, aborting')
58 config
= self
.prepare_config(config
)
59 imdb_lookup
= plugin
.get_plugin_by_name('imdb_lookup').instance
61 incompatible_files
= 0
62 incompatible_entries
= 0
66 # list of imdb ids gathered from paths / cache
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
])
79 if not os
.path
.isdir(folder
):
80 log
.critical('Path %s does not exist' % folder
)
83 log
.verbose('Scanning path %s ...' % folder
)
85 # Help debugging by removing a lot of noise
86 #logging.getLogger('movieparser').setLevel(logging.WARNING)
87 #logging.getLogger('imdb_lookup').setLevel(logging.WARNING)
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
):
98 movie
= get_plugin_by_name('parsing').instance
.parse_movie(item
)
101 imdb_id
= imdb_lookup
.imdb_id_lookup(movie_title
=movie
.name
,
103 session
=task
.session
)
104 if imdb_id
in path_ids
:
105 log
.trace('duplicate %s' % item
)
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
114 # store to cache and extend to found list
115 self
.cache
[folder
] = path_ids
116 qualities
.update(path_ids
)
118 log
.debug('qualities: %s' % qualities
)
120 log
.debug('-- Start filtering entries ----------------------------------')
122 # do actual filtering
123 for entry
in task
.accepted
:
125 if not entry
.get('imdb_id', eval_lazy
=False):
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
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')
140 elif config
.get('allow_different_qualities'):
141 if entry
['quality'] != qualities
[entry
['imdb_id']]:
142 log
.trace('wrong quality')
145 entry
.reject('movie exists')
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
))
152 log
.debug('-- Finished filtering entries -------------------------------')
154 @event('plugin.register')
155 def register_plugin():
156 plugin
.register(FilterExistsMovie
, 'my_exists_movie', groups
=['exists'], api_ver
=2)