diff --git a/__init__.py b/__init__.py index 2c195f8..1909616 100644 --- a/__init__.py +++ b/__init__.py @@ -13,48 +13,52 @@ async def model_downloaded(request): try: # 1. Warte kurz auf das Dateisystem (besonders wichtig unter Windows) - await asyncio.sleep(0.8) + await asyncio.sleep(0.5) - # 2. Alle Caches in folder_paths radikal leeren - # Wir löschen hier wirklich alles, was ComfyUI im RAM behält - if hasattr(folder_paths, "folder_names"): - folder_paths.folder_names.clear() + # 2. Caches in folder_paths löschen + # WICHTIG: Nicht folder_names löschen! Das sind die Konfigurationen der Pfade. + # Wir löschen nur die berechneten Dateilisten (Caches). - if hasattr(folder_paths, "base_path_layers"): - for layer in folder_paths.base_path_layers.values(): - if hasattr(layer, "folder_names"): - layer.folder_names.clear() + if hasattr(folder_paths, "filename_list_cache"): + folder_paths.filename_list_cache.clear() + print("[Model-Downloader] filename_list_cache geleert.") + + if hasattr(folder_paths, "cache_helper"): + if hasattr(folder_paths.cache_helper, "clear"): + folder_paths.cache_helper.clear() + print("[Model-Downloader] cache_helper geleert.") if hasattr(folder_paths, "cache"): - folder_paths.cache.clear() + if hasattr(folder_paths.cache, "clear"): + folder_paths.cache.clear() + else: + folder_paths.cache = {} + print("[Model-Downloader] interner folder_paths.cache geleert.") - # 3. Den Definitions-Cache von ComfyUI löschen - # Dies zwingt ComfyUI, die Node-Metadaten (inkl. Modell-Listen) neu zu generieren - server.PromptServer.instance.object_info = None + # 3. Aktiven Scan triggern + # Wir rufen get_filename_list für die wichtigsten Ordner auf + # Dies repopuliert den Cache mit den neuen Dateien von der Platte + folders = ["checkpoints", "loras", "vae", "controlnet", "diffusion_models", "upscale_models", + "clip", "unet", "gligen", "embeddings", "configs", "hypernetworks", "style_models"] - # 4. Aktiven Scan triggern - # Wir rufen get_filename_list für JEDEN bekannten Ordner auf - # Das zwingt das Backend, die Festplatte wirklich neu zu lesen - all_folders = list(folder_paths.folder_names.keys()) if hasattr(folder_paths, "folder_names") else [] - # Fallback auf Standardordner falls Liste leer - if not all_folders: - all_folders = ["checkpoints", "loras", "vae", "controlnet", "diffusion_models", "upscale_models", - "clip", "unet", "gligen", "embeddings", "configs", "hypernetworks", "style_models"] - - for folder in all_folders: + # Falls folder_names existiert, nehmen wir alle dort registrierten Kategorien + if hasattr(folder_paths, "folder_names"): + folders = list(folder_paths.folder_names.keys()) + + for folder in folders: try: folder_paths.get_filename_list(folder) except: pass - print(f"[Model-Downloader] Backend-Reset abgeschlossen. {len(all_folders)} Ordner neu indiziert.") + print(f"[Model-Downloader] Backend-Scan abgeschlossen. {len(folders)} Kategorien aktualisiert.") except Exception as e: - print(f"[Model-Downloader] Fehler beim Reset: {e}") + print(f"[Model-Downloader] Fehler beim Backend-Reset: {e}") - # 5. Signale an alle Browser - # Wir senden mehrere Signale um sicherzugehen, dass alle Extension-Typen reagieren - server.PromptServer.instance.send_sync("refresh_models", {}) + # 4. Signale an alle Browser senden + # Wir senden "refresh", was das Standard-Signal für den UI-Reload ist server.PromptServer.instance.send_sync("refresh", {}) + # Und unser spezielles Signal für die JS-Bridge server.PromptServer.instance.send_sync("kippster-refresh-ui", {"message": "ready"}) return web.json_response({"status": "success", "message": "Backend reset and rescan complete"}) diff --git a/src/main/resources/comfyui-bridge/__init__.py b/src/main/resources/comfyui-bridge/__init__.py index 2c195f8..1909616 100644 --- a/src/main/resources/comfyui-bridge/__init__.py +++ b/src/main/resources/comfyui-bridge/__init__.py @@ -13,48 +13,52 @@ async def model_downloaded(request): try: # 1. Warte kurz auf das Dateisystem (besonders wichtig unter Windows) - await asyncio.sleep(0.8) + await asyncio.sleep(0.5) - # 2. Alle Caches in folder_paths radikal leeren - # Wir löschen hier wirklich alles, was ComfyUI im RAM behält - if hasattr(folder_paths, "folder_names"): - folder_paths.folder_names.clear() + # 2. Caches in folder_paths löschen + # WICHTIG: Nicht folder_names löschen! Das sind die Konfigurationen der Pfade. + # Wir löschen nur die berechneten Dateilisten (Caches). - if hasattr(folder_paths, "base_path_layers"): - for layer in folder_paths.base_path_layers.values(): - if hasattr(layer, "folder_names"): - layer.folder_names.clear() + if hasattr(folder_paths, "filename_list_cache"): + folder_paths.filename_list_cache.clear() + print("[Model-Downloader] filename_list_cache geleert.") + + if hasattr(folder_paths, "cache_helper"): + if hasattr(folder_paths.cache_helper, "clear"): + folder_paths.cache_helper.clear() + print("[Model-Downloader] cache_helper geleert.") if hasattr(folder_paths, "cache"): - folder_paths.cache.clear() + if hasattr(folder_paths.cache, "clear"): + folder_paths.cache.clear() + else: + folder_paths.cache = {} + print("[Model-Downloader] interner folder_paths.cache geleert.") - # 3. Den Definitions-Cache von ComfyUI löschen - # Dies zwingt ComfyUI, die Node-Metadaten (inkl. Modell-Listen) neu zu generieren - server.PromptServer.instance.object_info = None + # 3. Aktiven Scan triggern + # Wir rufen get_filename_list für die wichtigsten Ordner auf + # Dies repopuliert den Cache mit den neuen Dateien von der Platte + folders = ["checkpoints", "loras", "vae", "controlnet", "diffusion_models", "upscale_models", + "clip", "unet", "gligen", "embeddings", "configs", "hypernetworks", "style_models"] - # 4. Aktiven Scan triggern - # Wir rufen get_filename_list für JEDEN bekannten Ordner auf - # Das zwingt das Backend, die Festplatte wirklich neu zu lesen - all_folders = list(folder_paths.folder_names.keys()) if hasattr(folder_paths, "folder_names") else [] - # Fallback auf Standardordner falls Liste leer - if not all_folders: - all_folders = ["checkpoints", "loras", "vae", "controlnet", "diffusion_models", "upscale_models", - "clip", "unet", "gligen", "embeddings", "configs", "hypernetworks", "style_models"] - - for folder in all_folders: + # Falls folder_names existiert, nehmen wir alle dort registrierten Kategorien + if hasattr(folder_paths, "folder_names"): + folders = list(folder_paths.folder_names.keys()) + + for folder in folders: try: folder_paths.get_filename_list(folder) except: pass - print(f"[Model-Downloader] Backend-Reset abgeschlossen. {len(all_folders)} Ordner neu indiziert.") + print(f"[Model-Downloader] Backend-Scan abgeschlossen. {len(folders)} Kategorien aktualisiert.") except Exception as e: - print(f"[Model-Downloader] Fehler beim Reset: {e}") + print(f"[Model-Downloader] Fehler beim Backend-Reset: {e}") - # 5. Signale an alle Browser - # Wir senden mehrere Signale um sicherzugehen, dass alle Extension-Typen reagieren - server.PromptServer.instance.send_sync("refresh_models", {}) + # 4. Signale an alle Browser senden + # Wir senden "refresh", was das Standard-Signal für den UI-Reload ist server.PromptServer.instance.send_sync("refresh", {}) + # Und unser spezielles Signal für die JS-Bridge server.PromptServer.instance.send_sync("kippster-refresh-ui", {"message": "ready"}) return web.json_response({"status": "success", "message": "Backend reset and rescan complete"})