import "server-only"; import { getSystemSetting } from "@/lib/db/queries"; export const VIDEO_STORYBOARD_CONFIG_KEY = "video_storyboard_config"; export type VideoStoryboardConfig = { enabled: boolean; providerWhitelist: string[]; minGridConfidence: number; enableTileUpscale: boolean; sliceUpscaleMinEdge: number; dispatchIntervalSec: number; maxRetry: number; enableFallback: boolean; }; export const defaultVideoStoryboardConfig: VideoStoryboardConfig = { enabled: true, providerWhitelist: ["ruxa-video"], minGridConfidence: 0.85, enableTileUpscale: false, sliceUpscaleMinEdge: 768, dispatchIntervalSec: 10, maxRetry: 3, enableFallback: true, }; function toNumber(value: unknown, fallback: number) { const parsed = Number(value); return Number.isFinite(parsed) ? parsed : fallback; } export function normalizeVideoStoryboardConfig( value: unknown ): VideoStoryboardConfig { const raw = value && typeof value === "object" && !Array.isArray(value) ? (value as Record) : {}; const whitelist = Array.isArray(raw.providerWhitelist) ? raw.providerWhitelist .map((item) => String(item || "").trim()) .filter(Boolean) : defaultVideoStoryboardConfig.providerWhitelist; return { enabled: raw.enabled !== false, providerWhitelist: whitelist.length > 0 ? Array.from(new Set(whitelist)) : defaultVideoStoryboardConfig.providerWhitelist, minGridConfidence: Math.max( 0.5, Math.min(0.99, toNumber(raw.minGridConfidence, defaultVideoStoryboardConfig.minGridConfidence)) ), enableTileUpscale: raw.enableTileUpscale === true, sliceUpscaleMinEdge: Math.max( 256, Math.min(4096, Math.round(toNumber(raw.sliceUpscaleMinEdge, defaultVideoStoryboardConfig.sliceUpscaleMinEdge))) ), dispatchIntervalSec: Math.max( 1, Math.min(120, Math.round(toNumber(raw.dispatchIntervalSec, defaultVideoStoryboardConfig.dispatchIntervalSec))) ), maxRetry: Math.max( 0, Math.min(5, Math.round(toNumber(raw.maxRetry, defaultVideoStoryboardConfig.maxRetry))) ), enableFallback: raw.enableFallback !== false, }; } export async function getVideoStoryboardConfig(): Promise { const setting = await getSystemSetting({ key: VIDEO_STORYBOARD_CONFIG_KEY }).catch( () => undefined ); return normalizeVideoStoryboardConfig(setting?.value); }