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; return String(record.url || record.originalUrl || "").trim(); }