From dc049ad3335c4ac76895028449dcac52d4e6bbdb Mon Sep 17 00:00:00 2001 From: digital-garbage <133010426+digital-garbage@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:56:30 +0300 Subject: [PATCH] Movie Editor: remove low-pass panel; elapsed timer; job-crash detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sampler_panel.js: remove the Low pass section — Studio outputs high_pass_ sampler/sigmas (indices 4+5) to the chain sampler; the low-pass outputs (6+7) are not wired in the movie editor graph. Renamed header from "High pass" to "Sampler" since there's only one now. store.js: show elapsed time in the generating readout so a slow run doesn't look frozen ("Generating… 1m 23s" instead of a static "Generating… (running)"). store.js: detect job-disappeared crash — if ComfyUI returns state="pending" three polls in a row after the job was running (job left the queue but never appeared in history), stop polling and show "Job disappeared from ComfyUI queue — it may have crashed. Check the ComfyUI terminal." Previously this left the UI in "Generating… (running)" indefinitely. Co-Authored-By: Claude Sonnet 4.6 --- movie_editor/frontend/sampler_panel.js | 5 +++-- movie_editor/frontend/store.js | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/movie_editor/frontend/sampler_panel.js b/movie_editor/frontend/sampler_panel.js index bb600e0a..9f508022 100644 --- a/movie_editor/frontend/sampler_panel.js +++ b/movie_editor/frontend/sampler_panel.js @@ -314,8 +314,9 @@ return () => quiet ? save(s) : saveNow(s); } - renderPass(container, "high", "High pass", s.high, mkSave(true), mkSave(false)); - renderPass(container, "low", "Low pass", s.low, mkSave(true), mkSave(false)); + // Only the high-pass sampler is wired in the Movie Editor graph + // (studio outputs 4+5 → chain sampler; outputs 6+7 are not connected). + renderPass(container, "high", "Sampler", s.high, mkSave(true), mkSave(false)); } window.SamplerPanel = { render, defaultSamplers, defaultPass }; diff --git a/movie_editor/frontend/store.js b/movie_editor/frontend/store.js index a835ca35..e95ae0f6 100644 --- a/movie_editor/frontend/store.js +++ b/movie_editor/frontend/store.js @@ -268,12 +268,14 @@ } let pollTimer = null; + let pollStart = 0; async function generate(onlyScene) { if (!state.project) return; set({ gen: { state: "queuing", promptId: null, media: [], msg: onlyScene ? "Queuing scene…" : "Queuing montage…" } }); try { const r = await API.generate(state.project.id, onlyScene); if (!r.prompt_id) { set({ gen: { ...state.gen, state: "error", msg: "No prompt id returned." } }); return; } + pollStart = Date.now(); set({ gen: { state: "running", promptId: r.prompt_id, media: [], msg: "Generating…" } }); poll(r.prompt_id); } catch (e) { @@ -281,8 +283,14 @@ } } + function _elapsed() { + const s = Math.floor((Date.now() - pollStart) / 1000); + return s < 60 ? `${s}s` : `${Math.floor(s / 60)}m ${s % 60}s`; + } + function poll(promptId) { clearInterval(pollTimer); + let pendingStreak = 0; pollTimer = setInterval(async () => { try { const s = await API.status(state.project.id, promptId); @@ -294,7 +302,16 @@ clearInterval(pollTimer); set({ gen: { state: "done", promptId, media: s.media, msg: s.media.length ? "" : "Completed but no output media found — check ComfyUI terminal." } }); } else { - set({ gen: { ...state.gen, state: s.state, msg: `Generating… (${s.state})` } }); + // "pending" after being "running" means the job left the queue without a + // history entry — it likely crashed or was interrupted by ComfyUI. + if (s.state === "pending") pendingStreak++; + else pendingStreak = 0; + if (pendingStreak >= 3) { + clearInterval(pollTimer); + set({ gen: { state: "error", promptId, media: [], msg: "Job disappeared from ComfyUI queue — it may have crashed or been interrupted. Check the ComfyUI terminal." } }); + return; + } + set({ gen: { ...state.gen, state: s.state, msg: `Generating… ${_elapsed()}` } }); } } catch (e) { clearInterval(pollTimer);