ai-tube / src /app /server /actions /utils /parseDatasetPrompt.ts
jbilcke-hf's picture
jbilcke-hf HF staff
playing with stable video diffusion
4c34e70
raw
history blame
No virus
2.8 kB
import { ChannelInfo, ParsedDatasetPrompt } from "@/types"
import { parseVideoModelName } from "./parseVideoModelName"
export function parseDatasetPrompt(markdown: string, channel: ChannelInfo): ParsedDatasetPrompt {
try {
const { title, description, tags, prompt, model, lora, style, thumbnail, voice, music } = parseMarkdown(markdown)
return {
title: typeof title === "string" && title ? title : "",
description: typeof description === "string" && description ? description : "",
tags:
tags && typeof tags === "string" ? tags.split("-").map(x => x.trim()).filter(x => x)
: (channel.tags || []),
prompt: typeof prompt === "string" && prompt ? prompt : "",
model: parseVideoModelName(model, channel.model),
lora: typeof lora === "string" && lora ? lora : (channel.lora || ""),
style: typeof style === "string" && style ? style : (channel.style || ""),
thumbnail: typeof thumbnail === "string" && thumbnail ? thumbnail : "",
voice: typeof voice === "string" && voice ? voice : (channel.voice || ""),
music: typeof music === "string" && music ? music : (channel.music || ""),
}
} catch (err) {
return {
title: "",
description: "",
tags: channel.tags || [],
prompt: "",
model: channel.model || "HotshotXL",
lora: channel.lora || "",
style: channel.style || "",
thumbnail: "",
voice: channel.voice || "",
music: channel.music || "",
}
}
}
/**
* Simple Markdown Parser to extract sections into a JSON object
* @param markdown A Markdown string containing Description and Prompt sections
* @returns A JSON object with { "description": "...", "prompt": "..." }
*/
function parseMarkdown(markdown: string): {
title: string
description: string
tags: string
prompt: string
model: string
lora: string
style: string
thumbnail: string
voice: string
music: string
} {
markdown = `${markdown || ""}`.trim()
// Improved regular expression to find markdown sections and accommodate multi-line content.
const sectionRegex = /^#+\s+(?<key>.+?)\n\n?(?<content>[^#]+)/gm;
const sections: { [key: string]: string } = {};
let match;
while ((match = sectionRegex.exec(markdown))) {
const { key, content } = match.groups as { key: string; content: string };
sections[key.trim().toLowerCase()] = content.trim();
}
return {
title: sections["title"] || "",
description: sections["description"] || "",
tags: sections["tags"] || "",
prompt: sections["prompt"] || "",
model: sections["model"] || "",
lora: sections["lora"] || "",
style: sections["style"] || "",
thumbnail: sections["thumbnail"] || "",
voice: sections["voice"] || "",
music: sections["music"] || "",
};
}