feat(canvas): 视频节点截取重生成 - 支持多段/时间线导入并调用视频模型批量重生成 (#197)

* feat(canvas): 视频节点截取重生成 - 支持多段/时间线导入并调用视频模型批量重生成

* test(canvas): 视频节点时间线导入 - 修正旧数据标题回退测试

* style(canvas): 视频节点截取重生成 - 格式化新增文件并修正测试

---------

Co-authored-by: sikongyue <3155157671@qq.com>
This commit is contained in:
爱笑的毛毛虫
2026-08-10 00:13:02 +08:00
committed by GitHub
parent 690cb61bf2
commit d33c6389d4
19 changed files with 1206 additions and 8 deletions

View File

@@ -0,0 +1,52 @@
import { describe, expect, test } from "bun:test";
import { collectUpstreamVideoNodes } from "../src/lib/canvas/canvas-resource-references";
import { CanvasNodeType, type CanvasConnection, type CanvasNodeData } from "../src/types/canvas";
function videoNode(id: string): CanvasNodeData {
return {
id,
type: CanvasNodeType.Video,
title: id,
position: { x: 0, y: 0 },
width: 100,
height: 100,
metadata: { content: `data:video/mp4;base64,${id}` },
};
}
function textNode(id: string): CanvasNodeData {
return {
id,
type: CanvasNodeType.Text,
title: id,
position: { x: 0, y: 0 },
width: 100,
height: 60,
metadata: { content: id },
};
}
function connection(fromNodeId: string, toNodeId: string): CanvasConnection {
return { id: `conn-${fromNodeId}-${toNodeId}`, fromNodeId, toNodeId };
}
describe("collectUpstreamVideoNodes", () => {
test("下游视频节点能回溯到上游视频源", () => {
const source = videoNode("source-video");
const segment = videoNode("segment-video");
const target = videoNode("target-video");
const text = textNode("script");
const nodes = [target, segment, source, text];
const connections = [connection("source-video", "segment-video"), connection("segment-video", "target-video"), connection("script", "segment-video")];
expect(collectUpstreamVideoNodes("target-video", nodes, connections).map((node) => node.id)).toEqual(["target-video", "segment-video", "source-video"]);
});
test("存在环时不会死循环", () => {
const a = videoNode("a");
const b = videoNode("b");
const nodes = [a, b];
const connections = [connection("a", "b"), connection("b", "a")];
expect(collectUpstreamVideoNodes("a", nodes, connections).length).toBe(2);
});
});