Source code for flexget.utils.pathscrub

import ntpath
import re
import sys

os_mode = None  # Can be 'windows', 'mac', 'linux' or None. None will auto-detect os.
# Replacement order is important, don't use dicts to store
platform_replaces = {
    'windows': [
        ['[:*?"<>| ]+', ' '],  # Turn illegal characters into a space
        [r'[\.\s]+([/\\]|$)', r'\1'],  # Dots cannot end file or directory names
    ],
    'mac': [['[: ]+', ' ']],  # Only colon is illegal here
    'linux': [],  # No illegal chars
}


[docs] def pathscrub(dirty_path: str, os: str | None = None, filename: bool = False) -> str: """Strip illegal characters for a given os from a path. :param dirty_path: Path to be scrubbed. :param os: Defines which os mode should be used, can be 'windows', 'mac', 'linux', or None to auto-detect :param filename: If this is True, path separators will be replaced with '-' :return: A valid path. """ # See if global os_mode has been defined by pathscrub plugin if os_mode and not os: os = os_mode if not os: # If os is not defined, try to detect appropriate drive, path = ntpath.splitdrive(dirty_path) if sys.platform.startswith('win') or drive: os = 'windows' elif sys.platform.startswith('darwin'): os = 'mac' else: os = 'linux' replaces = platform_replaces[os] # Make sure not to mess with windows drive specifications drive, path = ntpath.splitdrive(dirty_path) if filename: path = path.replace('/', ' ').replace('\\', ' ') for search, replace in replaces: path = re.sub(search, replace, path) # Remove spaces surrounding path components path = '/'.join(comp.strip() for comp in path.split('/')) if os == 'windows': path = '\\'.join(comp.strip() for comp in path.split('\\')) path = path.strip() # If we stripped everything from a filename, complain if filename and dirty_path and not path: raise ValueError( f'Nothing was left after stripping invalid characters from path `{dirty_path}`!' ) return drive + path