Save each Comfy run as a new clip even if the output filename repeats.

Purging desktop files let MiniMax reuse MiniMax_H3_00001_, so the next job returned the previous clip. Ignore stale events from the last job so a second generate cannot paste the first video over the new one.
This commit is contained in:
2026-08-25 20:29:36 -05:00
parent c5ed4d7ac4
commit ba7a483aac
6 changed files with 36 additions and 15 deletions
+5 -1
View File
@@ -12,12 +12,16 @@ export default defineEventHandler(async (event) => {
return {
type: 'snapshot',
status: 'running',
jobId,
message: 'Reconnecting to ComfyUI...',
progress: 90,
promptId: pending.promptId,
elapsedMs: Date.now() - pending.startedAt
elapsedMs: Date.now() - pending.startedAt,
hideThumbnail: pending.hideThumbnail,
folderLocked: pending.folderLocked
}
}
throw createError({ statusCode: 404, statusMessage: 'Job not found' })
}
const { owner } = assertLibraryOwner(event)
+1 -1
View File
@@ -11,6 +11,6 @@ export default defineEventHandler((event) => {
}
setHeader(event, 'Content-Type', 'video/mp4')
setHeader(event, 'Content-Disposition', `inline; filename="${safeDownloadName(clipTitle(clip))}.mp4"`)
setHeader(event, 'Cache-Control', 'private, max-age=3600')
setHeader(event, 'Cache-Control', 'private, no-store')
return readFileSync(path)
})
+3
View File
@@ -18,6 +18,7 @@ export interface JobEvent {
queueRunning?: number
queuePending?: number
folderLocked?: boolean
jobId?: string
}
export interface Job {
@@ -89,6 +90,7 @@ export function listJobs() {
export function jobSnapshot(job: Job) {
return {
jobId: job.id,
type: 'snapshot' as const,
status: job.status,
message: job.message,
@@ -108,6 +110,7 @@ export function jobSnapshot(job: Job) {
}
export function emitJob(job: Job, event: JobEvent) {
event.jobId = job.id
if (event.message) job.message = event.message
if (typeof event.progress === 'number') job.progress = event.progress
if (typeof event.step === 'number') job.step = event.step
-3
View File
@@ -637,9 +637,6 @@ export async function saveClip(params: {
const catalog = readCatalog(params.ownerKey)
const folder = catalog.folders.find(item => item.id === params.folderId) || catalog.folders[0]
if (!folder) throw createError({ statusCode: 400, statusMessage: 'No library folder available' })
if (params.comfyFilename && catalog.clips.some(clip => clip.comfyFilename === params.comfyFilename)) {
return catalog.clips.find(clip => clip.comfyFilename === params.comfyFilename) as LibraryClip
}
const clip: LibraryClip = {
id: crypto.randomUUID(),
folderId: folder.id,
+1
View File
@@ -91,6 +91,7 @@ export async function completePendingIfReady(pending: PendingJob) {
status: 'complete' as const,
message: pending.folderLocked ? 'Saved to the locked folder. Unlock it to view.' : 'Video ready',
progress: 100,
jobId: pending.jobId,
clipId: clip.id,
filename: pending.folderLocked ? undefined : video.filename,
subfolder: pending.folderLocked ? undefined : video.subfolder,