61 lines
1.9 KiB
TypeScript
61 lines
1.9 KiB
TypeScript
import express from "express";
|
|
import u from "@/utils";
|
|
import { z } from "zod";
|
|
import { error, success } from "@/lib/responseFormat";
|
|
import { validateFields } from "@/middleware/middleware";
|
|
import { generateScript } from "@/utils/generateScript";
|
|
const router = express.Router();
|
|
interface NovelChapter {
|
|
id: number;
|
|
reel: string;
|
|
chapter: string;
|
|
chapterData: string;
|
|
projectId: number;
|
|
}
|
|
function mergeNovelText(novelData: NovelChapter[]): string {
|
|
if (!Array.isArray(novelData)) return "";
|
|
return novelData
|
|
.map((chap) => {
|
|
return `${chap.chapter.trim()}\n\n${chap.chapterData.trim().replace(/\r?\n/g, "\n")}\n`;
|
|
})
|
|
.join("\n");
|
|
}
|
|
|
|
// 生成剧本
|
|
export default router.post(
|
|
"/",
|
|
validateFields({
|
|
outlineId: z.number(),
|
|
scriptId: z.number(),
|
|
}),
|
|
async (req, res) => {
|
|
const { outlineId, scriptId } = req.body;
|
|
const outlineData = await u.db("t_outline").where("id", outlineId).select("*").first();
|
|
if (!outlineData) return res.status(500).send(success({ message: "大纲为空" }));
|
|
const parameter = JSON.parse(outlineData.data!);
|
|
|
|
const novelData = (await u
|
|
.db("t_novel")
|
|
.whereIn("chapterIndex", parameter.chapterRange)
|
|
.where("projectId", outlineData.projectId)
|
|
.select("*")) as NovelChapter[];
|
|
|
|
if (novelData.length == 0) return res.status(500).send(success({ message: "原文为空" }));
|
|
|
|
const result: string = mergeNovelText(novelData);
|
|
try {
|
|
const data = await generateScript(parameter ?? "", result ?? "");
|
|
if (!data) return res.status(500).send({ message: "生成剧本失败" });
|
|
|
|
await u.db("t_script").where("id", scriptId).update({
|
|
content: data,
|
|
});
|
|
|
|
res.status(200).send(success({ message: "生成剧本成功" }));
|
|
} catch (e) {
|
|
const errMsg = u.error(e).message || "生成剧本失败";
|
|
res.status(500).send(error(errMsg));
|
|
}
|
|
},
|
|
);
|