summaryrefslogtreecommitdiff
path: root/modui/mime.py
diff options
context:
space:
mode:
authorMia Herkt <mia@0x0.st>2022-12-20 15:45:55 +0100
committerMia Herkt <mia@0x0.st>2022-12-20 16:19:49 +0100
commiteebd5d8c6d8a756384b6cf1b2cc76b8a83cdf929 (patch)
tree764a7c28cbdc165d0cf843f8cc0f6bc53ab224b6 /modui/mime.py
parentdcea8bffe19b8ba308f9361d6c8ef08281ddff1b (diff)
Add moderation TUI
This ended up way fancier than I imagined.
Diffstat (limited to 'modui/mime.py')
-rw-r--r--modui/mime.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/modui/mime.py b/modui/mime.py
new file mode 100644
index 0000000..c94e800
--- /dev/null
+++ b/modui/mime.py
@@ -0,0 +1,122 @@
+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}")