import hashlib import mimetypes import subprocess import sys MEDIA_EXTS_CACHE = [] # MEDIA_EXTS_CACHE = ['.mp3', '.wma', '.flac', '.mp4'] def media_exts(): """ List of media file extensions from local system mimetypes """ if not MEDIA_EXTS_CACHE: mimetypes.init() for ext in mimetypes.types_map: if mimetypes.types_map[ext].split('/')[0] in ('audio', 'video'): MEDIA_EXTS_CACHE.append(ext) return MEDIA_EXTS_CACHE def is_media_file_ext(ext): """ Is the given extension a media file extension according to the local system mimetypes """ return ext.lower().lstrip('.') in [e.lower().lstrip('.') for e in media_exts()] def hash_file(filename): """ return a SHA256 hash for the given file """ h = hashlib.sha256() b = bytearray(128 * 1024) mv = memoryview(b) with open(filename, 'rb', buffering=0) as f: for n in iter(lambda: f.readinto(mv), 0): h.update(mv[:n]) return h.hexdigest() def is_subdir_of(subject, other): """ is subject a subdirectory of other """ if not subject.parent: return False if subject.parent == other: return True return is_subdir_of(subject.parent, other) def open_file(path_): if sys.platform == 'darwin': subprocess.check_call(['open', path_.abspath()]) elif sys.platform == 'linux': subprocess.check_call(['xdg-open', path_.abspath()]) elif sys.platform == 'win32': subprocess.check_call(['explorer', path_.abspath()]) else: raise RuntimeError(f"Unsupported platform {sys.platform}")