Files
Medios-Macina/SYS/utils_constant.py

327 lines
8.0 KiB
Python
Raw Normal View History

2025-11-25 20:09:33 -08:00
mime_maps = {
2025-12-29 17:05:03 -08:00
"image": {
"jpg": {
"ext": ".jpg",
"mimes": ["image/jpeg",
"image/jpg"]
},
"png": {
"ext": ".png",
"mimes": ["image/png"]
},
"gif": {
"ext": ".gif",
"mimes": ["image/gif"]
},
"webp": {
"ext": ".webp",
"mimes": ["image/webp"]
},
"avif": {
"ext": ".avif",
"mimes": ["image/avif"]
},
"jxl": {
"ext": ".jxl",
"mimes": ["image/jxl"]
},
"bmp": {
"ext": ".bmp",
"mimes": ["image/bmp"]
},
"heic": {
"ext": ".heic",
"mimes": ["image/heic"]
},
"heif": {
"ext": ".heif",
"mimes": ["image/heif"]
},
"ico": {
"ext": ".ico",
"mimes": ["image/x-icon",
"image/vnd.microsoft.icon"]
},
"qoi": {
"ext": ".qoi",
"mimes": ["image/qoi"]
},
"tiff": {
"ext": ".tiff",
"mimes": ["image/tiff",
"image/x-tiff"]
},
"svg": {
"ext": ".svg",
"mimes": ["image/svg+xml"]
},
2025-12-29 17:05:03 -08:00
},
"image_sequence": {
"apng": {
"ext": ".apng",
"mimes": ["image/apng"],
"sequence": True
},
"avifs": {
"ext": ".avifs",
"mimes": ["image/avif-sequence"],
"sequence": True
},
"heics": {
"ext": ".heics",
"mimes": ["image/heic-sequence"],
"sequence": True
},
"heifs": {
"ext": ".heifs",
"mimes": ["image/heif-sequence"],
"sequence": True
},
2025-12-29 17:05:03 -08:00
},
"video": {
"mp4": {
"ext": ".mp4",
"mimes": ["video/mp4",
"audio/mp4"]
},
"webm": {
"ext": ".webm",
"mimes": ["video/webm",
"audio/webm"]
},
"mov": {
"ext": ".mov",
"mimes": ["video/quicktime"]
},
"ogv": {
"ext": ".ogv",
"mimes": ["video/ogg"]
},
"mpeg": {
"ext": ".mpeg",
"mimes": ["video/mpeg"]
},
"avi": {
"ext": ".avi",
"mimes": ["video/x-msvideo",
"video/avi"]
},
"flv": {
"ext": ".flv",
"mimes": ["video/x-flv"]
},
2025-12-29 17:05:03 -08:00
"mkv": {
"ext": ".mkv",
"mimes": ["video/x-matroska",
"application/x-matroska"],
2025-12-29 17:05:03 -08:00
"audio_only_ext": ".mka",
},
"wmv": {
"ext": ".wmv",
"mimes": ["video/x-ms-wmv"]
},
"rv": {
"ext": ".rv",
"mimes": ["video/vnd.rn-realvideo"]
},
2025-12-29 17:05:03 -08:00
},
"audio": {
"mp3": {
"ext": ".mp3",
"mimes": ["audio/mpeg",
"audio/mp3"]
},
"m4a": {
"ext": ".m4a",
"mimes": ["audio/mp4",
"audio/x-m4a"]
},
"ogg": {
"ext": ".ogg",
"mimes": ["audio/ogg"]
},
"opus": {
"ext": ".opus",
"mimes": ["audio/opus"]
},
"flac": {
"ext": ".flac",
"mimes": ["audio/flac"]
},
"wav": {
"ext": ".wav",
"mimes": ["audio/wav",
"audio/x-wav",
"audio/vnd.wave"]
},
"wma": {
"ext": ".wma",
"mimes": ["audio/x-ms-wma"]
},
"tta": {
"ext": ".tta",
"mimes": ["audio/x-tta"]
},
"wv": {
"ext": ".wv",
"mimes": ["audio/x-wavpack",
"audio/wavpack"]
},
"mka": {
"ext": ".mka",
"mimes": ["audio/x-matroska",
"video/x-matroska"]
},
2025-12-29 17:05:03 -08:00
},
"document": {
"pdf": {
"ext": ".pdf",
"mimes": ["application/pdf"]
},
"epub": {
"ext": ".epub",
"mimes": ["application/epub+zip"]
},
"djvu": {
"ext": ".djvu",
"mimes": ["application/vnd.djvu"]
},
"rtf": {
"ext": ".rtf",
"mimes": ["application/rtf"]
},
2025-12-29 17:05:03 -08:00
"docx": {
"ext":
".docx",
"mimes":
["application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
2025-12-29 17:05:03 -08:00
},
"xlsx": {
"ext": ".xlsx",
"mimes":
["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
2025-12-29 17:05:03 -08:00
},
"pptx": {
"ext":
".pptx",
"mimes": [
"application/vnd.openxmlformats-officedocument.presentationml.presentation"
],
},
"doc": {
"ext": ".doc",
"mimes": ["application/msword"]
},
"xls": {
"ext": ".xls",
"mimes": ["application/vnd.ms-excel"]
},
"ppt": {
"ext": ".ppt",
"mimes": ["application/vnd.ms-powerpoint"]
2025-12-29 17:05:03 -08:00
},
},
"archive": {
"zip": {
"ext": ".zip",
"mimes": ["application/zip"]
},
"7z": {
"ext": ".7z",
"mimes": ["application/x-7z-compressed"]
},
"rar": {
"ext": ".rar",
"mimes": ["application/x-rar-compressed",
"application/vnd.rar"]
},
"gz": {
"ext": ".gz",
"mimes": ["application/gzip",
"application/x-gzip"]
},
"tar": {
"ext": ".tar",
"mimes": ["application/x-tar"]
},
2025-12-29 17:05:03 -08:00
"cbz": {
"ext": ".cbz",
"mimes": ["application/zip"],
"note":
"zip archive of images; prefer extension-based detection for comics",
2025-12-29 17:05:03 -08:00
},
},
"project": {
"clip": {
"ext": ".clip",
"mimes": ["application/clip"]
},
"kra": {
"ext": ".kra",
"mimes": ["application/x-krita"]
},
"procreate": {
"ext": ".procreate",
"mimes": ["application/x-procreate"]
},
"psd": {
"ext": ".psd",
"mimes": ["image/vnd.adobe.photoshop"]
},
"swf": {
"ext": ".swf",
"mimes": ["application/x-shockwave-flash"]
},
2025-12-29 17:05:03 -08:00
},
"other": {
"octet-stream": {
"ext": "",
"mimes": ["application/octet-stream"]
},
"json": {
"ext": ".json",
"mimes": ["application/json"]
},
"xml": {
"ext": ".xml",
"mimes": ["application/xml",
"text/xml"]
},
"csv": {
"ext": ".csv",
"mimes": ["text/csv"]
},
2025-12-29 17:05:03 -08:00
},
2025-11-25 20:09:33 -08:00
}
2025-12-11 12:47:30 -08:00
def get_type_from_ext(ext: str) -> str:
"""Determine the type (e.g., 'image', 'video', 'audio') from file extension.
2025-12-11 19:04:02 -08:00
2025-12-11 12:47:30 -08:00
Args:
ext: File extension (with or without leading dot, e.g., 'jpg' or '.jpg')
2025-12-11 19:04:02 -08:00
2025-12-11 12:47:30 -08:00
Returns:
Type string (e.g., 'image', 'video', 'audio') or 'other' if unknown
"""
if not ext:
2025-12-29 17:05:03 -08:00
return "other"
2025-12-11 19:04:02 -08:00
2025-12-29 17:05:03 -08:00
ext_clean = ext.lstrip(".").lower()
2025-12-11 19:04:02 -08:00
2025-12-11 12:47:30 -08:00
for type_name, extensions_dict in mime_maps.items():
if ext_clean in extensions_dict:
return type_name
2025-12-11 19:04:02 -08:00
2025-12-29 17:05:03 -08:00
return "other"
2025-12-14 00:53:52 -08:00
# Canonical supported extension set for all stores/cmdlets.
# Derived from mime_maps so there is a single source of truth.
ALL_SUPPORTED_EXTENSIONS: set[str] = {
spec["ext"].lower()
for group in mime_maps.values()
for spec in group.values()
if isinstance(spec, dict) and isinstance(spec.get("ext"), str) and spec.get("ext")
}