ai-chatbot/lib/video-canvas/uploaded-resource.ts

52 lines
1.7 KiB
TypeScript

import type { VideoCanvasNodeCreationConfig } from "@/lib/video-canvas/node-creation";
export const VIDEO_CANVAS_RESOURCE_UPLOAD_PURPOSE =
"video-canvas-add-resource";
export const VIDEO_CANVAS_RESOURCE_UPLOAD_SOURCE_TYPE =
"video_canvas_upload";
export type VideoCanvasUploadedResourceMediaType =
| "audio"
| "image"
| "video";
export type VideoCanvasUploadedResourceValidation =
| { mediaType: VideoCanvasUploadedResourceMediaType; valid: true }
| { error: string; valid: false };
export function getVideoCanvasUploadedResourceMediaType(
contentType: string,
): VideoCanvasUploadedResourceMediaType | null {
const normalized = contentType.trim().toLowerCase();
if (normalized.startsWith("image/")) return "image";
if (normalized.startsWith("video/")) return "video";
if (normalized.startsWith("audio/")) return "audio";
return null;
}
export function validateVideoCanvasUploadedResource(
file: { size: number; type: string },
config: VideoCanvasNodeCreationConfig["upload"],
): VideoCanvasUploadedResourceValidation {
const mediaType = getVideoCanvasUploadedResourceMediaType(file.type);
if (!mediaType) {
return { error: "仅支持图片、视频或音频文件", valid: false };
}
if (file.size > config.maxFileSizeMb * 1024 * 1024) {
return {
error: `单个文件不能超过 ${config.maxFileSizeMb}MB`,
valid: false,
};
}
return { mediaType, valid: true };
}
export function getVideoCanvasUploadedResourceUrl(payload: unknown) {
if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
return "";
}
const record = payload as Record<string, unknown>;
return String(record.url || record.originalUrl || "").trim();
}