auto-save 2026-05-14 03:53 (~5)

This commit is contained in:
2026-05-14 03:53:51 +08:00
parent 9572111254
commit 6eb1f98e06
5 changed files with 234 additions and 68 deletions

View File

@@ -19,7 +19,7 @@ import { ThemeToggle } from "@/components/theme-toggle"
import {
addManualFrame, analyzeJob, createJob, getJob, listJobs, uploadJob, deleteJob, deleteFrame, deleteGeneratedImage,
deleteGeneratedVideo, deleteCutout, generateStoryboardVideo,
type Job, type ImageRef, type StoryboardScene,
type Job, type ImageRef, type StoryboardScene, type FrameExtractTarget,
} from "@/lib/api"
const NODE_TYPES = {
@@ -34,6 +34,13 @@ const NODE_TYPES = {
const KEYFRAME_PANEL_ID = "keyframe-detail-panel"
const VIDEO_FRAME_PANEL_ID = "video-frame-panel"
const FLOATING_PANEL_IDS = new Set([KEYFRAME_PANEL_ID, VIDEO_FRAME_PANEL_ID])
const FRAME_TARGET_LABELS: Record<FrameExtractTarget, string> = {
balanced: "综合关键帧",
subject: "清晰主体",
transition: "转场变化",
expression: "表情瞬间",
motion: "动作峰值",
}
// 合并 input + download + split 为一个节点
// 分叉:上路 input → visual lab ↘
@@ -85,6 +92,7 @@ export default function Home() {
const job = useMemo(() => jobs.find((j) => j.id === activeJobId) ?? null, [jobs, activeJobId])
const [submitting, setSubmitting] = useState(false)
const [analyzing, setAnalyzing] = useState(false)
const [frameTarget, setFrameTarget] = useState<FrameExtractTarget>("balanced")
const [selectedFrames, setSelectedFrames] = useState<Set<number>>(new Set())
const [expandedFrame, setExpandedFrame] = useState<number | null>(null)
const [framePanelScale, setFramePanelScale] = useState(1)
@@ -163,16 +171,16 @@ export default function Home() {
setAnalyzing(true)
setSelectedFrames(new Set())
try {
await analyzeJob(job.id, 5)
toast.info("开始解析:拆轨 → 抽帧。声音文案轨单独处理")
await analyzeJob(job.id, 5, frameTarget)
toast.info(`开始解析:拆轨 → ${FRAME_TARGET_LABELS[frameTarget]}抽帧。声音文案轨单独处理`)
// 乐观更新本地状态,让轮询 useEffect 重新启动
setJob((prev) => prev ? { ...prev, status: "splitting", message: "拆轨中…", progress: 30 } : prev)
setJob((prev) => prev ? { ...prev, status: "splitting", message: `拆轨中 · ${FRAME_TARGET_LABELS[frameTarget]}`, progress: 30 } : prev)
} catch (e) {
toast.error("解析触发失败:" + (e instanceof Error ? e.message : String(e)))
} finally {
setAnalyzing(false)
}
}, [job?.id])
}, [job?.id, frameTarget])
const handleAddManualFrameForJob = useCallback(async (jobId: string, t: number) => {
try {
@@ -496,6 +504,7 @@ export default function Home() {
activeJobId,
submitting,
analyzing,
frameTarget,
selectedFrames,
expandedFrame,
framePanelScale,
@@ -507,6 +516,7 @@ export default function Home() {
onSubmitUrl: handleSubmit,
onUploadFile: handleUpload,
onAnalyze: handleAnalyze,
onFrameTargetChange: setFrameTarget,
onToggleFrame: handleToggleFrame,
onExpandFrame: setExpandedFrame,
onOpenFramePanel: handleOpenFramePanel,