From 788a98f29473585f9e681fbd3871e211c5ff87cd Mon Sep 17 00:00:00 2001 From: Luke Mino-Altherr Date: Wed, 4 Mar 2026 15:31:08 -0800 Subject: [PATCH] Centralize MIME type initialization into utils/mime_types.py Move mimetypes.init() and all custom type registrations from server.py and metadata_extract.py into a single init_mime_types() function called once at startup in main.py. Amp-Thread-ID: https://ampcode.com/threads/T-019cbb2a-513a-7458-9962-b4100e4f124d Co-authored-by: Amp --- app/assets/services/metadata_extract.py | 27 ------------------ main.py | 2 ++ server.py | 4 --- utils/mime_types.py | 37 +++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 31 deletions(-) create mode 100644 utils/mime_types.py diff --git a/app/assets/services/metadata_extract.py b/app/assets/services/metadata_extract.py index ef3dd72b1..1cdd26a40 100644 --- a/app/assets/services/metadata_extract.py +++ b/app/assets/services/metadata_extract.py @@ -20,31 +20,6 @@ SAFETENSORS_EXTENSIONS = frozenset({".safetensors", ".sft"}) # Maximum safetensors header size to read (8MB) MAX_SAFETENSORS_HEADER_SIZE = 8 * 1024 * 1024 -def _register_custom_mime_types(): - """Register custom MIME types for model and config files. - - Called before each use because mimetypes.init() in server.py resets the database. - Uses a quick check to avoid redundant registrations. - """ - # Quick check if already registered (avoids redundant add_type calls) - test_result, _ = mimetypes.guess_type("test.safetensors") - if test_result == "application/safetensors": - return - - mimetypes.add_type("application/safetensors", ".safetensors") - mimetypes.add_type("application/safetensors", ".sft") - mimetypes.add_type("application/pytorch", ".pt") - mimetypes.add_type("application/pytorch", ".pth") - mimetypes.add_type("application/pickle", ".ckpt") - mimetypes.add_type("application/pickle", ".pkl") - mimetypes.add_type("application/gguf", ".gguf") - mimetypes.add_type("application/yaml", ".yaml") - mimetypes.add_type("application/yaml", ".yml") - - -# Register custom types at module load -_register_custom_mime_types() - @dataclass class ExtractedMetadata: @@ -325,8 +300,6 @@ def extract_file_metadata( _, ext = os.path.splitext(abs_path) meta.format = ext.lstrip(".").lower() if ext else "" - # MIME type guess (re-register in case mimetypes.init() was called elsewhere) - _register_custom_mime_types() mime_type, _ = mimetypes.guess_type(abs_path) meta.content_type = mime_type diff --git a/main.py b/main.py index 36e195986..2ce1f0662 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,7 @@ from app.logger import setup_logger from app.assets.seeder import asset_seeder import itertools import utils.extra_config +from utils.mime_types import init_mime_types import logging import sys from comfy_execution.progress import get_progress_state @@ -162,6 +163,7 @@ def execute_prestartup_script(): logging.info("") apply_custom_paths() +init_mime_types() if args.enable_manager: comfyui_manager.prestartup() diff --git a/server.py b/server.py index aaae89a06..76904ebc9 100644 --- a/server.py +++ b/server.py @@ -197,10 +197,6 @@ class PromptServer(): def __init__(self, loop): PromptServer.instance = self - mimetypes.init() - mimetypes.add_type('application/javascript; charset=utf-8', '.js') - mimetypes.add_type('image/webp', '.webp') - self.user_manager = UserManager() self.model_file_manager = ModelFileManager() self.custom_node_manager = CustomNodeManager() diff --git a/utils/mime_types.py b/utils/mime_types.py new file mode 100644 index 000000000..916e963c5 --- /dev/null +++ b/utils/mime_types.py @@ -0,0 +1,37 @@ +"""Centralized MIME type initialization. + +Call init_mime_types() once at startup to initialize the MIME type database +and register all custom types used across ComfyUI. +""" + +import mimetypes + +_initialized = False + + +def init_mime_types(): + """Initialize the MIME type database and register all custom types. + + Safe to call multiple times; only runs once. + """ + global _initialized + if _initialized: + return + _initialized = True + + mimetypes.init() + + # Web types (used by server.py for static file serving) + mimetypes.add_type('application/javascript; charset=utf-8', '.js') + mimetypes.add_type('image/webp', '.webp') + + # Model and data file types (used by asset scanning / metadata extraction) + mimetypes.add_type("application/safetensors", ".safetensors") + mimetypes.add_type("application/safetensors", ".sft") + mimetypes.add_type("application/pytorch", ".pt") + mimetypes.add_type("application/pytorch", ".pth") + mimetypes.add_type("application/pickle", ".ckpt") + mimetypes.add_type("application/pickle", ".pkl") + mimetypes.add_type("application/gguf", ".gguf") + mimetypes.add_type("application/yaml", ".yaml") + mimetypes.add_type("application/yaml", ".yml")