revert: restore storyboard intake workflow

This commit is contained in:
2026-05-19 16:17:58 +08:00
parent a7aa280330
commit b9ba8113f0
6 changed files with 55 additions and 260 deletions

View File

@@ -229,7 +229,7 @@ export default function Home() {
const created = await uploadJob(file)
addJob(created)
setProductionJobIds((prev) => new Set(prev).add(created.id))
toast.success(`已上传 ${created.id.slice(0, 8)},视频就绪后自动提取音频文案`)
toast.success(`已上传 ${created.id.slice(0, 8)},视频就绪后自动跑音频和抽帧`)
} catch (e) {
toast.error("上传失败:" + (e instanceof Error ? e.message : String(e)))
} finally {
@@ -473,13 +473,31 @@ export default function Home() {
try {
const updated = await triggerTranscribe(target.id)
updateJobInList(updated)
toast.info("文案路已启动:字幕、讲话人、节奏和背景音同步解析")
toast.info("音频路已启动:字幕、讲话人、节奏和背景音同步解析")
} catch (e) {
autoTriggeredRef.current.delete(audioKey)
toast.error("音频解析启动失败:" + (e instanceof Error ? e.message : String(e)))
}
}
}, [updateJobInList])
const visualKey = `${target.id}:visual`
const hasVisualResult = target.frames.length > 0
const visualRunning = target.status === "splitting"
if (!hasVisualResult && !visualRunning && !autoTriggeredRef.current.has(visualKey)) {
autoTriggeredRef.current.add(visualKey)
const frameTarget = frameTargets[target.id] ?? "motion"
const frameCount = frameCounts[target.id] ?? 12
const frameQuality = frameQualities[target.id] ?? "accurate"
try {
const updated = await analyzeJob(target.id, frameCount, frameTarget, "replace", frameQuality)
updateJobInList(updated)
toast.info(`视觉路已启动:${FRAME_QUALITY_LABELS[frameQuality]} · ${FRAME_TARGET_LABELS[frameTarget]} · ${frameCount} 张参考帧`)
} catch (e) {
autoTriggeredRef.current.delete(visualKey)
toast.error("视觉抽帧启动失败:" + (e instanceof Error ? e.message : String(e)))
}
}
}, [frameCounts, frameQualities, frameTargets, updateJobInList])
const ensureDefaultProductRefs = useCallback(async (jobId: string) => {
const cached = defaultProductRefsByJob[jobId]
@@ -559,20 +577,21 @@ export default function Home() {
}
if (!created && target.status === "failed") {
autoTriggeredRef.current.delete(`${target.id}:audio`)
autoTriggeredRef.current.delete(`${target.id}:visual`)
}
if (!created && target.status === "failed" && !target.video_url) {
try {
target = await retryJobDownload(target.id)
updateJobInList(target)
toast.info("已重新提交下载;下载完成后会自动跑音频文案路")
toast.info("已重新提交下载;下载完成后会自动跑音频文案路和视觉抽帧路")
} catch (e) {
toast.error("重新下载失败:" + (e instanceof Error ? e.message : String(e)))
return
}
}
setProductionJobIds((prev) => new Set(prev).add(target.id))
if (target.video_url) toast.success("已进入第一步:自动提取音频文案")
else toast.success("已进入第一步:下载完成后自动提取音频文案")
if (target.video_url) toast.success("已进入并行素材分析:音频文案路和视觉抽帧路会同步推进")
else toast.success("已进入并行素材分析:下载完成后自动音频文案路和视觉抽帧路")
void startProductionLanesForJob(target)
}, [handleSubmit, job, startProductionLanesForJob, updateJobInList])