2026-04-10 23:52:16 +08:00

161 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success, error } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
import { FlowData } from "@/agents/productionAgent/tools";
export default router.post(
"/",
validateFields({
projectId: z.number(),
episodesId: z.number(),
}),
async (req, res) => {
const { projectId, episodesId }: { projectId: number; episodesId: number } = req.body;
const sqlData = await u
.db("o_agentWorkData")
.where("projectId", String(projectId))
.andWhere("episodesId", String(episodesId))
.select("data")
.first();
const scriptData = await u.db("o_script").where("projectId", projectId).where("id", episodesId).first();
const scriptAssets = await u.db("o_scriptAssets").where("scriptId", episodesId);
const assetIds = scriptAssets.map((i) => i.assetId);
const assetsData = await u
.db("o_assets")
.leftJoin("o_image", "o_assets.imageId", "o_image.id")
.select("o_assets.*", "o_image.filePath", "o_image.state", "o_image.errorReason")
// @ts-ignore
.where("o_assets.id", "in", assetIds)
.andWhere("o_assets.assetsId", null)
.where("o_assets.projectId", projectId);
let childAssetsData = await u
.db("o_assets")
.leftJoin("o_image", "o_assets.imageId", "o_image.id")
.select("o_assets.*", "o_image.filePath", "o_image.state", "o_image.errorReason")
.where("o_assets.projectId", projectId)
// @ts-ignore
.where("o_assets.assetsId", "in", assetIds)
.whereNotNull("o_assets.assetsId");
if (!sqlData) {
const flowData: FlowData = {
script: scriptData?.content ?? "",
scriptPlan: "",
assets: await Promise.all(
assetsData.map(async (item) => ({
id: item.id,
name: item.name ?? "",
type: item.type ?? "",
prompt: item.prompt ?? "",
desc: item.describe ?? "",
src: item.filePath && (await u.oss.getFileUrl(item.filePath!)),
derive: await Promise.all(
childAssetsData
.filter((child) => child.assetsId === item.id)
.map(async (child) => ({
id: child.id,
assetsId: item.id,
name: child.name ?? "",
type: child.type,
prompt: child.prompt,
desc: child.describe ?? "",
src: child.filePath && (await u.oss.getFileUrl(child.filePath!)),
state: child.state ?? "未生成", //todo矫正状态值
})),
),
})),
),
storyboardTable: "",
storyboard: [],
//todo矫正workbench数据
//@ts-ignore
workbench: {
videoList: [],
},
// //todo矫正封面数据
// poster: {
// items: [],
// },
};
return res.status(200).send(success(flowData));
} else {
try {
const storyboardData = await u.db("o_storyboard").where("scriptId", episodesId);
await Promise.all(
storyboardData.map(async (i) => {
if (i.filePath) {
try {
i.filePath = await u.oss.getFileUrl(i.filePath);
} catch {
i.filePath = "";
}
} else {
i.filePath = "";
}
}),
);
const storyboardIds = storyboardData.map((i) => i.id);
const assetsIds = await u.db("o_assets2Storyboard").whereIn("storyboardId", storyboardIds);
const assets2StoryboardMap: Record<number, number[]> = {};
assetsIds.forEach((i) => {
if (!assets2StoryboardMap[i.storyboardId!]) {
assets2StoryboardMap[i.storyboardId!] = [];
}
assets2StoryboardMap[i.storyboardId!].push(i.assetId!);
});
const flowData = JSON.parse(sqlData!.data ?? "{}");
flowData.assets = await Promise.all(
assetsData.map(async (item) => ({
id: item.id,
name: item.name ?? "",
type: item.type ?? "",
prompt: item.prompt ?? "",
desc: item.describe ?? "",
src: item.filePath && (await u.oss.getFileUrl(item.filePath!)),
flowId: item.flowId,
derive: await Promise.all(
childAssetsData
.filter((child) => child.assetsId === item.id)
.map(async (child) => ({
id: child.id,
assetsId: item.id,
name: child.name ?? "",
prompt: child.prompt,
type: child.type,
desc: child.describe ?? "",
src: child.filePath && (await u.oss.getFileUrl(child.filePath!)),
state: child.state ?? "未生成",
errorReason: child?.errorReason ?? "",
flowId: child.flowId,
})),
),
})),
);
flowData.storyboard = storyboardData
.map((i) => ({
id: i.id,
index: i.index,
duration: i.duration ? +i.duration : 0,
prompt: i.prompt,
associateAssetsIds: assets2StoryboardMap[i.id!] ?? [],
src: i.filePath,
state: i.state,
videoDesc: i.videoDesc,
shouldGenerateImage: i.shouldGenerateImage,
reason: i?.reason ?? "",
flowId: i.flowId,
}))
.sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
res.status(200).send(success(flowData));
} catch (err) {
res.status(400).send(error());
}
}
},
);