From a7b553ca54f41a71cf416118afeca202be5fa164 Mon Sep 17 00:00:00 2001 From: digital-garbage <133010426+digital-garbage@users.noreply.github.com> Date: Sun, 7 Jun 2026 14:41:06 +0300 Subject: [PATCH] Movie Editor: inject scene image without a target; closable boot-error overlay MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - _prepare_media no longer requires a per-scene 'target' (removed earlier) — it now injects the scene image as a LoadImage from just the asset ref. Fixes 'ImageTransformKJ .image (IMAGE): no node outputs IMAGE' for image-anchored scenes/runs: the image is now materialised and auto-wires to IMAGE inputs. - Boot-error overlay gets a ✕ dismiss button so it can't permanently block the top menu (so you can still reach Restart ComfyUI etc.). Co-Authored-By: Claude Opus 4.8 --- movie_editor/frontend/index.html | 12 ++++++++++-- movie_editor/server.py | 4 +++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/movie_editor/frontend/index.html b/movie_editor/frontend/index.html index 962c1c15..0437a817 100644 --- a/movie_editor/frontend/index.html +++ b/movie_editor/frontend/index.html @@ -15,11 +15,19 @@ var b = document.getElementById("boot-error"); if (!b) { b = document.createElement("div"); b.id = "boot-error"; - b.style.cssText = "position:fixed;z-index:99999;left:0;right:0;top:0;padding:10px 14px;" + + b.style.cssText = "position:fixed;z-index:99999;left:0;right:0;top:0;padding:10px 34px 10px 14px;" + "background:#3a1320;color:#ffb3c1;font:12px/1.5 monospace;border-bottom:1px solid #e0566b;white-space:pre-wrap"; + var x = document.createElement("button"); + x.textContent = "✕"; x.title = "Dismiss"; + x.style.cssText = "position:absolute;top:6px;right:8px;background:transparent;border:1px solid #e0566b;" + + "color:#ffb3c1;border-radius:6px;cursor:pointer;font:12px monospace;padding:1px 7px;line-height:1.4"; + x.onclick = function () { b.remove(); }; + b.appendChild(x); (document.body || document.documentElement).appendChild(b); } - b.textContent = "Movie Editor error — " + msg + "\n(restart ComfyUI + hard-reload Cmd/Ctrl+Shift+R; if it persists, send me this text)"; + var t = b.querySelector(".boot-error-text"); + if (!t) { t = document.createElement("span"); t.className = "boot-error-text"; b.insertBefore(t, b.firstChild); } + t.textContent = "Movie Editor error — " + msg + "\n(restart ComfyUI + hard-reload Cmd/Ctrl+Shift+R; if it persists, send me this text)"; } window.addEventListener("error", function (e) { show((e.message || "load error") + (e.filename ? " @ " + e.filename.split("/").pop() + ":" + e.lineno : "")); diff --git a/movie_editor/server.py b/movie_editor/server.py index 838f5307..4669eccf 100644 --- a/movie_editor/server.py +++ b/movie_editor/server.py @@ -88,7 +88,9 @@ def _prepare_media(proj: Project) -> Optional[dict]: src = sc.source ref = getattr(src, "media_ref", None) tgt = getattr(src, "target", None) - if not (src and getattr(src, "type", "") in ("image", "generated_frame") and ref and tgt): + # A target is OPTIONAL now (routing is automatic — the image becomes a LoadImage + # IMAGE producer that auto-wires). Only an asset reference is required. + if not (src and getattr(src, "type", "") in ("image", "generated_frame") and ref): continue path = media.path_for(ref) if not path: