85 lines
2.6 KiB
TypeScript
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) });
|
|
}
|
|
});
|