Files
NianAIGC/lib/content/video-templates.ts
2026-05-29 10:26:02 +08:00

61 lines
2.1 KiB
TypeScript

import catalog from "@/runtime/nianxx-play/content/seedance-starter/catalog.json";
type LegacyCatalog = typeof catalog;
type LegacyCase = LegacyCatalog["cases"][number];
export type VideoTemplate = {
id: string;
title: string;
mode: string;
modeLabel: string;
prompt: string;
seedanceInstruction?: string;
coverUrl?: string;
referenceVideoUrl?: string;
resultVideoUrl?: string;
selectable: boolean;
controls: string[];
materials: Array<{
role: string;
type: "image" | "video" | "audio";
url: string;
label?: string;
}>;
};
export function getVideoTemplates(): VideoTemplate[] {
return (catalog.cases as LegacyCase[]).map((item) => ({
id: item.id,
title: item.title,
mode: item.mode,
modeLabel: item.modeLabel,
prompt: item.prompt,
seedanceInstruction: typeof item.promptPattern?.seedanceInstruction === "string" ? item.promptPattern.seedanceInstruction : undefined,
coverUrl: rewriteLegacyUrl(item.display?.coverPublicUrl),
referenceVideoUrl: rewriteLegacyUrl(item.display?.referenceVideoPublicUrl),
resultVideoUrl: rewriteLegacyUrl(item.display?.resultVideoPublicUrl),
selectable: Boolean(item.display?.selectableAsReferenceTemplate),
controls: item.interactionHooks?.visibleControls || [],
materials: (item.assets || [])
.map((asset) => ({
role: asset.role,
type: asset.role.includes("video") ? "video" as const : asset.role.includes("audio") ? "audio" as const : "image" as const,
url: rewriteLegacyUrl(asset.publicUrl) || "",
label: "promptLabel" in asset ? asset.promptLabel : undefined
}))
.filter((asset) => asset.url)
}));
}
export function getTemplateById(id?: string): VideoTemplate | undefined {
if (!id) return undefined;
return getVideoTemplates().find((template) => template.id === id);
}
function rewriteLegacyUrl(url?: string | null): string | undefined {
if (!url) return undefined;
if (/^https?:\/\//i.test(url)) return url;
if (url.startsWith("/seedance-starter-assets/") || url.startsWith("/starter/") || url.startsWith("/planning-cases/")) return url;
return url;
}