from enum import Enum from textual import log mimemoji = { "audio" : "🔈", "video" : "🎞", "text" : "📄", "image" : "🖼", "application/zip" : "🗜️", "application/x-zip-compressed" : "🗜️", "application/x-tar" : "🗄", "application/x-cpio" : "🗄", "application/x-xz" : "🗜️", "application/x-7z-compressed" : "🗜️", "application/gzip" : "🗜️", "application/zstd" : "🗜️", "application/x-rar" : "🗜️", "application/x-rar-compressed" : "🗜️", "application/vnd.ms-cab-compressed" : "🗜️", "application/x-bzip2" : "🗜️", "application/x-lzip" : "🗜️", "application/x-iso9660-image" : "💿", "application/pdf" : "📕", "application/epub+zip" : "📕", "application/mxf" : "🎞", "application/vnd.android.package-archive" : "📦", "application/vnd.debian.binary-package" : "📦", "application/x-rpm" : "📦", "application/x-dosexec" : "⚙", "application/x-execuftable" : "⚙", "application/x-sharedlib" : "⚙", "application/java-archive" : "☕", "application/x-qemu-disk" : "🖴", "application/pgp-encrypted" : "🔏", } MIMECategory = Enum("MIMECategory", ["Archive", "Text", "AV", "Document", "Fallback"] ) class MIMEHandler: def __init__(self): self.handlers = { MIMECategory.Archive : [[ "application/zip", "application/x-zip-compressed", "application/x-tar", "application/x-cpio", "application/x-xz", "application/x-7z-compressed", "application/gzip", "application/zstd", "application/x-rar", "application/x-rar-compressed", "application/vnd.ms-cab-compressed", "application/x-bzip2", "application/x-lzip", "application/x-iso9660-image", "application/vnd.android.package-archive", "application/vnd.debian.binary-package", "application/x-rpm", "application/java-archive", "application/vnd.openxmlformats" ], []], MIMECategory.Text : [["text"], []], MIMECategory.AV : [[ "audio", "video", "image", "application/mxf" ], []], MIMECategory.Document : [[ "application/pdf", "application/epub", "application/x-mobipocket-ebook", ], []], MIMECategory.Fallback : [[], []] } self.exceptions = { MIMECategory.Archive : { ".cbz" : MIMECategory.Document, ".xps" : MIMECategory.Document, ".epub" : MIMECategory.Document, }, MIMECategory.Text : { ".fb2" : MIMECategory.Document, } } def register(self, category, handler): self.handlers[category][1].append(handler) def handle(self, mime, ext): def getcat(s): cat = MIMECategory.Fallback for k, v in self.handlers.items(): s = s.split(";")[0] if s in v[0] or s.split("/")[0] in v[0]: cat = k break for x in v[0]: if s.startswith(x): cat = k break if cat in self.exceptions: cat = self.exceptions[cat].get(ext) or cat return cat cat = getcat(mime) for handler in self.handlers[cat][1]: try: if handler(cat): return except: pass for handler in self.handlers[MIMECategory.Fallback][1]: try: if handler(None): return except: pass raise RuntimeError(f"Unhandled MIME type category: {cat}")