"""Microsoft Teams 媒体辅助工具。 提供 MIME 类型推断、文件名提取和消息 ID 提取。 """ from __future__ import annotations import mimetypes import re from pathlib import Path _MIME_TYPE_MAP = { ".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".png": "image/png", ".gif": "image/gif", ".bmp": "image/bmp", ".webp": "image/webp", ".svg": "image/svg+xml", ".pdf": "application/pdf", ".doc": "application/msword", ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".xls": "application/vnd.ms-excel", ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".ppt": "application/vnd.ms-powerpoint", ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", ".txt": "text/plain", ".csv": "text/csv", ".json": "application/json", ".xml": "application/xml", ".zip": "application/zip", ".mp4": "video/mp4", ".mov": "video/quicktime", ".avi": "video/x-msvideo", ".wmv": "video/x-ms-wmv", ".mp3": "audio/mpeg", ".wav": "audio/wav", ".ogg": "audio/ogg", ".flac": "audio/flac", ".aac": "audio/aac", } _MESSAGE_ID_PATTERN = re.compile(r"^(\d+)@thread\.(skype|tacv2)$") def get_mime_type(filename: str) -> str: ext = Path(filename).suffix.lower() if ext in _MIME_TYPE_MAP: return _MIME_TYPE_MAP[ext] mime_type, _ = mimetypes.guess_type(filename) if mime_type: return mime_type return "application/octet-stream" def extract_filename(url_or_path: str) -> str: if not url_or_path: return "unknown" cleaned = url_or_path.split("?")[0].split("#")[0] name = Path(cleaned).name return name or "unknown" def extract_message_id(raw_id: str) -> str: """提取标准化消息 ID,去除 thread/tacv2 前缀格式。""" if not raw_id: return "" m = _MESSAGE_ID_PATTERN.match(raw_id) if m: return m.group(1) return raw_id