Movie Editor: remove low-pass panel; elapsed timer; job-crash detection

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 <noreply@anthropic.com>
This commit is contained in:
digital-garbage
2026-06-07 00:56:30 +03:00
co-authored by Claude Sonnet 4.6
parent fbf7ac5ac0
commit dc049ad333
2 changed files with 21 additions and 3 deletions
+3 -2
View File
@@ -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 };
+18 -1
View File
@@ -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);