From 2dd823792c2b2c724f38fdbf1c23b85e0f75b4db Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 11 May 2026 15:42:51 +0200 Subject: [PATCH] feat: remove automatic UI refresh logic as requested --- .../service/impl/DefaultDownloadManager.java | 1 - src/main/resources/comfyui-bridge/__init__.py | 36 --------- .../comfyui-bridge/web/downloader.js | 78 ------------------- web/downloader.js | 77 ------------------ 4 files changed, 192 deletions(-) diff --git a/src/main/java/de/tki/comfymodels/service/impl/DefaultDownloadManager.java b/src/main/java/de/tki/comfymodels/service/impl/DefaultDownloadManager.java index 097c720..397189a 100644 --- a/src/main/java/de/tki/comfymodels/service/impl/DefaultDownloadManager.java +++ b/src/main/java/de/tki/comfymodels/service/impl/DefaultDownloadManager.java @@ -113,7 +113,6 @@ public class DefaultDownloadManager implements IDownloadManager { } finally { if (finishedCalled.compareAndSet(false, true)) { - notifyComfyUI(); // NEU: Ping abfeuern onFinished.run(); } } diff --git a/src/main/resources/comfyui-bridge/__init__.py b/src/main/resources/comfyui-bridge/__init__.py index 53bbd37..f7d81dd 100644 --- a/src/main/resources/comfyui-bridge/__init__.py +++ b/src/main/resources/comfyui-bridge/__init__.py @@ -2,46 +2,10 @@ import server import folder_paths import os -import asyncio from aiohttp import web print("\033[95m[Model-Downloader] UI Extension Bridge active\033[0m") -USER_MODEL_PATH = r"C:\AI\comfyuidata\models" -if os.path.exists(USER_MODEL_PATH): - try: - pass - except: pass - -@server.PromptServer.instance.routes.post("/kippster/model-downloaded") -async def model_downloaded(request): - print("\033[92m🔥 [Model-Downloader] PING ERHALTEN! Bereite UI-Refresh vor...\033[0m") - - # 1. Dem Dateisystem Zeit geben, BEVOR wir den Cache leeren! - await asyncio.sleep(2) - - try: - # 2. Erst jetzt die Caches leeren, wenn die Datei sicher im OS registriert ist - if hasattr(folder_paths, "filename_list_cache"): - folder_paths.filename_list_cache.clear() - - if hasattr(folder_paths, "cache_helper") and hasattr(folder_paths.cache_helper, "clear"): - folder_paths.cache_helper.clear() - - if hasattr(folder_paths, "cache") and hasattr(folder_paths.cache, "clear"): - folder_paths.cache.clear() - - # Object Info zurücksetzen (zwingt ComfyUI beim nächsten UI-Klick zum Neuladen) - server.PromptServer.instance.object_info = None - - except Exception as e: - print(f"[Model-Downloader] Fehler beim Cache-Reset: {e}") - - # 3. Signal an das Frontend senden (jetzt ist der Cache wirklich leer und das OS bereit!) - server.PromptServer.instance.send_sync("kippster-refresh-ui", {"message": "ready"}) - - return web.json_response({"status": "success"}) - WEB_DIRECTORY = "web" NODE_CLASS_MAPPINGS = {} __all__ = ["WEB_DIRECTORY", "NODE_CLASS_MAPPINGS"] diff --git a/src/main/resources/comfyui-bridge/web/downloader.js b/src/main/resources/comfyui-bridge/web/downloader.js index dffc2eb..be1c68a 100644 --- a/src/main/resources/comfyui-bridge/web/downloader.js +++ b/src/main/resources/comfyui-bridge/web/downloader.js @@ -10,84 +10,6 @@ const initializeExtension = async () => { if (!app || !api) { setTimeout(initializeExtension, 2000); return; } - api.addEventListener("kippster-refresh-ui", async (event) => { - console.log("%c🔥 [Model-Downloader] SIGNAL ERHALTEN! Starte Refresh-Sequenz...", "background: #ff0000; color: #fff; font-size: 14px;"); - - try { - const showToast = (text) => { - const toast = document.createElement("div"); - toast.style = "position:fixed; top:20px; left:50%; transform:translateX(-50%); background:rgba(255,204,0,0.9); color:black; padding:10px 20px; border-radius:5px; z-index:10001; font-weight:bold; font-family:sans-serif; pointer-events:none; transition: opacity 0.5s;"; - toast.textContent = text; - document.body.appendChild(toast); - setTimeout(() => { toast.style.opacity = "0"; setTimeout(() => document.body.removeChild(toast), 500); }, 3000); - }; - - showToast("🔄 Führe 'Refresh Node Definitions' aus..."); - - // 1. Frontend-Cache explizit leeren - api.nodeDefs = null; - - // 2. Den exakten Refresh-Befehl ausführen, den auch der "Refresh"-Button im Sidebar-Menü nutzt - // Dieser Befehl triggert sowohl den Backend-Scan als auch das Re-Registering der Nodes im Frontend. - if (app.refreshNodeDefinitions) { - await app.refreshNodeDefinitions(); - } else if (app.refresh) { - await app.refresh(); - } - - // 3. Zusätzlicher Force: Sicherstellen dass wir die neuesten Daten haben - const nodeDefs = await api.getNodeDefs(); - - showToast("✨ Heilung der Nodes läuft..."); - - // 4. Bereits gerenderte Dropdowns zwingen, die neuen Werte zu fressen - let healedCount = 0; - if (app.graph && app.graph._nodes) { - for (const node of app.graph._nodes) { - const def = nodeDefs[node.type]; - if (def?.input?.required) { - for (const widgetName in def.input.required) { - const inputDef = def.input.required[widgetName]; - if (Array.isArray(inputDef[0])) { - const newValues = inputDef[0]; - const widget = node.widgets?.find(w => w.name === widgetName); - - if (widget && widget.type === "combo") { - const oldValue = widget.value; - widget.options.values = newValues; - - if (newValues.includes(oldValue)) { - if (node.color === "#322" || node.color === "#a22") { - node.color = ""; - node.bgcolor = ""; - healedCount++; - } - } else if (oldValue && oldValue !== "None" && !newValues.includes(oldValue)) { - node.color = "#322"; - node.bgcolor = "#a22"; - } - } - } - } - } - if (node.onRefresh) node.onRefresh(); - } - } - - app.graph.setDirtyCanvas(true, true); - console.log(`[Model-Downloader] Sync fertig. Healed: ${healedCount}`); - - if (app.ui?.dialog?.show) { - app.ui.dialog.show("✅ Node-Definitionen aktualisiert!\nDateisystem wurde erfolgreich neu eingelesen."); - } else { - alert("✅ Node-Definitionen aktualisiert!"); - } - - } catch (e) { - console.error("[Model-Downloader] Fehler beim erzwungenen Refresh:", e); - } - }); - let apiToken = null; const loadConfig = async () => { try { diff --git a/web/downloader.js b/web/downloader.js index ac998d1..be1c68a 100644 --- a/web/downloader.js +++ b/web/downloader.js @@ -10,83 +10,6 @@ const initializeExtension = async () => { if (!app || !api) { setTimeout(initializeExtension, 2000); return; } - api.addEventListener("kippster-refresh-ui", async (event) => { - console.log("%c🔥 [Model-Downloader] SIGNAL ERHALTEN! Starte Refresh-Sequenz...", "background: #ff0000; color: #fff; font-size: 14px;"); - - try { - const showToast = (text) => { - const toast = document.createElement("div"); - toast.style = "position:fixed; top:20px; left:50%; transform:translateX(-50%); background:rgba(255,204,0,0.9); color:black; padding:10px 20px; border-radius:5px; z-index:10001; font-weight:bold; font-family:sans-serif; pointer-events:none; transition: opacity 0.5s;"; - toast.textContent = text; - document.body.appendChild(toast); - setTimeout(() => { toast.style.opacity = "0"; setTimeout(() => document.body.removeChild(toast), 500); }, 3000); - }; - - showToast("🔄 Sync: Warte auf Windows-Dateisystem..."); - - // WICHTIG: 2 Sekunden warten! - // Windows braucht einen Moment, um die Ordner-Indizes nach dem Verschieben/Entpacken zu aktualisieren. - await new Promise(r => setTimeout(r, 2000)); - - showToast("🔄 Führe 'Refresh Node Definitions' aus..."); - - // ComfyUI Frontend-Cache leeren - api.nodeDefs = null; - - // Den originalen Refresh-Befehl von ComfyUI ausführen (exakt wie der manuelle Klick) - if (app.refresh) { - await app.refresh(); - } - - // Fallback: Bereits gerenderte Dropdowns zwingen, die neuen Werte zu fressen und rote Nodes zu heilen - let healedCount = 0; - if (app.graph && app.graph._nodes) { - const nodeDefs = await api.getNodeDefs(); - for (const node of app.graph._nodes) { - const def = nodeDefs[node.type]; - if (def?.input?.required) { - for (const widgetName in def.input.required) { - const inputDef = def.input.required[widgetName]; - if (Array.isArray(inputDef[0])) { - const newValues = inputDef[0]; - const widget = node.widgets?.find(w => w.name === widgetName); - - if (widget && widget.type === "combo") { - const oldValue = widget.value; - widget.options.values = newValues; - - if (newValues.includes(oldValue)) { - if (node.color === "#322" || node.color === "#a22") { - node.color = ""; - node.bgcolor = ""; - healedCount++; - } - } else if (oldValue && oldValue !== "None" && !newValues.includes(oldValue)) { - node.color = "#322"; - node.bgcolor = "#a22"; - } - } - } - } - } - if (node.onRefresh) node.onRefresh(); - } - } - - app.graph.setDirtyCanvas(true, true); - console.log(`[Model-Downloader] Sync fertig. Healed: ${healedCount}`); - - if (app.ui?.dialog?.show) { - app.ui.dialog.show("✅ Node-Definitionen aktualisiert!\nDateisystem wurde erfolgreich neu eingelesen."); - } else { - alert("✅ Node-Definitionen aktualisiert!"); - } - - } catch (e) { - console.error("[Model-Downloader] Fehler beim erzwungenen Refresh:", e); - } - }); - let apiToken = null; const loadConfig = async () => { try {