diff --git a/app/static/public/js/video.js b/app/static/public/js/video.js index 36570d2..f4f878c 100644 --- a/app/static/public/js/video.js +++ b/app/static/public/js/video.js @@ -2060,52 +2060,52 @@ setPreviewTitle(item, buildHistoryTitle('splice', item.dataset.index || previewCount)); } - const waitTasks = taskIds.map((taskId) => - waitEditVideoResult(taskId, rawPublicKey, spliceRun) - .then((generatedVideoUrl) => ({ taskId, generatedVideoUrl })) - ); - const waitResults = await Promise.allSettled(waitTasks); - let successCount = 0; let lastMergedUrl = ''; - for (let i = 0; i < waitResults.length; i += 1) { - const result = waitResults[i]; - const taskId = taskIds[i]; - if (spliceRun.cancelled) break; - if (result.status !== 'fulfilled') { - const missItem = spliceRun.placeholders.get(taskId) || null; - if (missItem) removePreviewItem(missItem); - continue; - } - const generatedVideoUrl = result.value.generatedVideoUrl; - if (spliceRun.cancelled) break; - const item = spliceRun.placeholders.get(taskId) || null; - try { - const mergedBlob = await concatVideosLocal(frameInfo.sourceBuffer, generatedVideoUrl); - if (spliceRun.cancelled) { - throw new Error('edit_cancelled'); - } - const mergedUrl = URL.createObjectURL(mergedBlob); - if (item) { - selectedVideoItemId = String(item.dataset.index || ''); - item.dataset.url = mergedUrl; - item.dataset.round = String(nextRound); - setPreviewTitle(item, buildHistoryTitle('splice', item.dataset.index || previewCount)); - const state = { previewItem: item }; - renderVideoFromUrl(state, mergedUrl); - refreshVideoSelectionUi(); - } - lastMergedUrl = mergedUrl; - successCount += 1; - } catch (singleErr) { - if (item) { - removePreviewItem(item); - } - if (String(singleErr && singleErr.message || '') === 'edit_cancelled') { - break; - } - } - } + let processChain = Promise.resolve(); + const waitTasks = taskIds.map((taskId) => + waitEditVideoResult(taskId, rawPublicKey, spliceRun) + .then((generatedVideoUrl) => { + processChain = processChain.then(async () => { + if (spliceRun.cancelled) return; + const item = spliceRun.placeholders.get(taskId) || null; + try { + const mergedBlob = await concatVideosLocal(frameInfo.sourceBuffer, generatedVideoUrl); + if (spliceRun.cancelled) { + throw new Error('edit_cancelled'); + } + const mergedUrl = URL.createObjectURL(mergedBlob); + if (item) { + selectedVideoItemId = String(item.dataset.index || ''); + item.dataset.url = mergedUrl; + item.dataset.round = String(nextRound); + setPreviewTitle(item, buildHistoryTitle('splice', item.dataset.index || previewCount)); + const state = { previewItem: item }; + renderVideoFromUrl(state, mergedUrl); + refreshVideoSelectionUi(); + } + lastMergedUrl = mergedUrl; + successCount += 1; + } catch (singleErr) { + if (item) { + removePreviewItem(item); + } + if (String(singleErr && singleErr.message || '') === 'edit_cancelled') { + return; + } + } + }); + }) + .catch((err) => { + if (String(err && err.message || '') === 'edit_cancelled') { + return; + } + const missItem = spliceRun.placeholders.get(taskId) || null; + if (missItem) removePreviewItem(missItem); + }) + ); + await Promise.allSettled(waitTasks); + await processChain; if (spliceRun.cancelled) { throw new Error('edit_cancelled'); diff --git a/app/static/public/pages/video.html b/app/static/public/pages/video.html index 995a709..2c1fe1a 100644 --- a/app/static/public/pages/video.html +++ b/app/static/public/pages/video.html @@ -316,7 +316,7 @@ - +