wranglebot
Version:
open source media asset management
56 lines (45 loc) • 1.97 kB
text/typescript
import { SocketServer } from "../../SocketServer.js";
import { WrangleBot } from "../../../core/WrangleBot.js";
import RouteResult from "../../RouteResult.js";
import LogBot from "logbotjs";
export default {
method: "post",
requiredParams: ["libraryId", "metafileId"],
requiredBody: ["engine", "metafiles", ""],
url: "/library/:libraryId/metafiles/analyse",
handler: async (req, res, bot: WrangleBot, server: SocketServer) => {
if (!bot.ML) {
return new RouteResult(404, "Machine Learning module not loaded");
}
const libraryId = req.params.libraryId;
const analyseOptions = req.body;
const { engine, metafiles, resolution, save } = analyseOptions;
for (let i = 0; i < analyseOptions.metafiles.length; i++) {
const metafile = await bot.query.library.one(libraryId).metafiles.one(analyseOptions.metafiles[i]).fetch();
const frames: string[] = [];
const step = Math.floor(metafile.thumbnails.length / Math.floor(metafile.thumbnails.length * (1 / analyseOptions.resolution)));
for (let i = 0; i < metafile.thumbnails.length; i += step) {
frames.push(metafile.thumbnails[i].id);
}
const result = await metafile.analyse({
engine: analyseOptions.engine,
frames: frames,
prompt: analyseOptions.prompt,
temperature: Number(analyseOptions.temperature),
max_tokens: Number(analyseOptions.max_tokens),
});
if (result) {
if (analyseOptions.save) {
if (!analyseOptions.save.key) throw new Error("Key is required for saving analyse result");
const res = await metafile.query.metadata.put({
key: analyseOptions.save.key,
value: result.response,
});
if (!res) throw new Error("Failed to save analyse result");
}
server.inform("database", "metafiles", metafile.toJSON());
}
}
return new RouteResult(200, "Analysis completed");
},
};