video-flow-toon/src/routes/project/queryDirectorManual.ts
2026-04-02 15:41:36 +08:00

85 lines
2.6 KiB
TypeScript

import express from "express";
import u from "@/utils";
import { success } from "@/lib/responseFormat";
import fs from "fs";
import path from "path";
const router = express.Router();
// 字段映射表
const DATA_MAP: { label: string; value: string; subDir?: string }[] = [
{ label: "README", value: "README" },
{ label: "导演规划", value: "art_directorPlanning", subDir: "art_prompt" },
{ label: "分镜表", value: "art_storyboard", subDir: "art_prompt" },
];
// 读取 md 文件内容,文件不存在时返回空字符串
function readMd(filePath: string): string {
try {
return fs.readFileSync(filePath, "utf-8");
} catch {
return "";
}
}
// 获取 images 文件夹下所有图片文件路径列表
async function readAllImages(imagesDir: string) {
try {
const ossPath = u.getPath(path.join("skills", "story_skills", imagesDir, "images"));
const files = fs.readdirSync(ossPath);
const images = files.filter((f) => /\.(png|jpe?g|gif|webp|svg)$/i.test(f)).map((f) => path.join("story_skills", imagesDir, "images", f));
if (images.length) {
return Promise.all(images.map(async (i) => await u.oss.getFileUrl(i, "skills")));
} else {
return [];
}
} catch {
return [];
}
}
// 获取导演手册
export default router.post("/", async (req, res) => {
try {
const artPromptsDir = u.getPath(["skills", "story_skills"]);
// 读取所有风格文件夹
const styleDirs = fs
.readdirSync(artPromptsDir, { withFileTypes: true })
.filter((d) => d.isDirectory())
.map((d) => d.name);
const result = await Promise.all(
styleDirs.map(async (directorManual) => {
const styleDir = path.join(artPromptsDir, directorManual);
const images = await readAllImages(directorManual);
const readmePath = path.join(styleDir, "README.md");
const readmeContent = fs.readFileSync(readmePath, "utf-8");
const firstLine = readmeContent.split("\n")[0].replace(/--/g, "");
const data = DATA_MAP.map(({ label, value, subDir }) => {
let mdPath: string;
if (subDir) {
mdPath = path.join(styleDir, subDir, `${value}.md`);
} else {
mdPath = path.join(styleDir, `${value}.md`);
}
return {
label,
value,
data: readMd(mdPath),
};
});
return {
name: firstLine,
image: images,
directorManual: directorManual,
data,
};
}),
);
res.status(200).send(success(result));
} catch (err) {
res.status(500).send({ error: String(err) });
}
});