Source code for flexget.plugins.filter.exists
import platform
from pathlib import Path
from loguru import logger
from flexget import plugin
from flexget.config_schema import one_or_more
from flexget.event import event
logger = logger.bind(name='exists')
[docs]
class FilterExists:
"""Reject entries that already exist in given path.
Example::
exists: /storage/movies/
"""
schema = one_or_more({'type': 'string', 'format': 'path'})
[docs]
def prepare_config(self, config):
# If only a single path is passed turn it into a 1 element list
if isinstance(config, str):
config = [config]
return config
[docs]
@plugin.priority(-1)
def on_task_filter(self, task, config):
if not task.accepted:
logger.debug('No accepted entries, not scanning for existing.')
return
logger.verbose('Scanning path(s) for existing files.')
config = self.prepare_config(config)
filenames = {}
for folder in config:
folder = Path(folder).expanduser()
if not folder.exists():
raise plugin.PluginWarning(f'Path {folder} does not exist', logger)
for p in folder.rglob('*'):
if p.is_file():
key = p.name
# windows file system is not case sensitive
if platform.system() == 'Windows':
key = key.lower()
filenames[key] = p
for entry in task.accepted:
# priority is: filename, location (filename only), title
name = Path(entry.get('filename', entry.get('location', entry['title']))).name
if platform.system() == 'Windows':
name = name.lower()
if name in filenames:
logger.debug('Found {} in {}', name, filenames[name])
entry.reject(f'exists in {filenames[name]}')
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(FilterExists, 'exists', api_ver=2)