-
- SKG · AI Material Pipeline
- - TK 二创工作台 - / Node Workflow -
-
- {job && (
-
-
+
- JOB
- {job.id.slice(0, 8)}
- ·
- {job.message || job.status}
-
- )}
-
+ JOB
+ {job.id.slice(0, 8)}
+ ·
+ {job.message || job.status}
+
+ )}
+
+
+ )
+}
+
+function MiniCard({ children, className = "", onClick }: { children: React.ReactNode; className?: string; onClick?: (e: React.MouseEvent) => void }) {
+ return (
+
+ {title}
+
+
+
+ {label}
+
+
+ {children}
+
+ )
+}
+
+interface Props {
+ data: NodeData
+}
+
+export function Dashboard({ data }: Props) {
+ const { job } = data
+ const [url, setUrl] = useState("")
+ const [videoT, setVideoT] = useState(0)
+ const [addingFrame, setAddingFrame] = useState(false)
+ const fileRef = useRef
+
+ )
+}
+
+ {/* 1. Input */}
+
+
+
+
+
+ {/* 2. Download */}
+
+
+ setUrl(e.target.value)}
+ placeholder="粘贴 TikTok 链接"
+ disabled={isDownloading || data.submitting}
+ className="w-full text-[12px] px-2.5 py-1.5 rounded-md bg-white/60 dark:bg-black/40 border border-black/10 dark:border-white/10 outline-none text-[var(--text-strong)] placeholder:text-[var(--text-faint)] focus:ring-2 focus:ring-[var(--ring)] disabled:opacity-40"
+ />
+
+ {hasVideo && (
+
+
+
+ )}
+ {job && (
+
+
+ )}
+
+
+
+
+ {
+ const f = e.target.files?.[0]
+ if (f) data.onUploadFile(f)
+ e.target.value = ""
+ }}
+ />
+
+ 来源
+
+ {job.url.startsWith("upload://") ? `📎 ${job.url.slice(9)}` : job.url}
+
+
+
+
+
+ {/* 3. Split */}
+
+
+
+ {hasVideo && job && (
+ <>
+
+
+
+
+ >
+ )}
+
+
+ {job?.url.startsWith("upload://") ? "本地上传 · 跳过下载" : "TikTok / yt-dlp 兼容站点"}
+
+
+
+
+
+ 分辨率
+ {job.width}×{job.height}
+
+
+ 时长
+ {job.duration.toFixed(1)}s
+
+
+
+
+ {/* 4. Keyframe — 5 张缩略图 */}
+
+
+
+
+
+
+ 视频流
+ → 关键帧抽取
+ 音频流
+ → ASR (16kHz mono wav)
+
+
+
+
+ {/* 5. ASR */}
+
+ {hasVideo && job && (
+
+
+
+ )}
+ {!hasFrames ? (
+
+
+ ) : (
+ job!.frames.map((f) => {
+ const isSel = data.selectedFrames.has(f.index)
+ return (
+
+
+
+ )
+ })
+ )}
+
+
+ 等待解析后抽取(默认 5 张)
+
+
+ 分镜 {f.index + 1}
+
+
+
+
+
+
+ {/* 6. Translate */}
+
+ {!hasTranscript ? (
+
+
+ ) : (
+ job!.transcript.map((s) => (
+
+
+ ))
+ )}
+
+
+ {colState.asr === "running" ? "Gemini 转录中…" : "等待关键帧抽取"}
+
+
+ {s.start.toFixed(1)}s → {s.end.toFixed(1)}s
+
+ {s.en}
+
+
+
+
+ {/* 7. Rewrite */}
+
+ {!hasZh ? (
+
+
+ ) : (
+ job!.transcript.map((s) => (
+
+
+ ))
+ )}
+
+ 等待 ASR 完成
+
+ {s.start.toFixed(1)}s → {s.end.toFixed(1)}s
+
+ {s.zh || 翻译中…}
+
+
+
+
+ {/* 8. ImageGen */}
+
+
+
+
+
+
+ 产品信息
+
+
+ 模型:gemini-2.5-pro
+
+ 下一冲刺接入
+
+ 0 ? `${data.selectedFrames.size} 张待生` : "选关键帧"}`} state={colState.imagegen} />
+
+
+ {/* 9. VideoGen */}
+
+
+
+ {data.selectedFrames.size === 0 ? (
+
+
+ ) : (
+ Array.from({ length: data.selectedFrames.size }).map((_, i) => (
+
+ 生成图 #{i + 1} · 待启动
+
+ ))
+ )}
+
+
+
+
+
+ 推荐
+ nano-banana-pro
+
+
+ 备选
+ gpt-image-2
+
+ 选关键帧后,每张 → 1 张生成图
+
+
+
+
+
+ {/* 10. Compose */}
+
+
+
+
+
+
+ 模型
+
+ {["Sora 2 · SKG 网关", "Seedance · 外部 API", "Kling · 外部 API"].map((m) => (
+
+ {m}
+ ))}
+
+ 按改写文案生成视频片段
+
+
+
+
+
+
+ 成品视频 · 待合成
+
+
+
+
+
+ 视频片段 + 字幕 / TTS
+ 本地 ffmpeg · 零 API +
+ + 本地 ffmpeg · 零 API +