82 lines
2.4 KiB
TypeScript
82 lines
2.4 KiB
TypeScript
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<string, unknown>)
|
|
: {};
|
|
|
|
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<VideoStoryboardConfig> {
|
|
const setting = await getSystemSetting({ key: VIDEO_STORYBOARD_CONFIG_KEY }).catch(
|
|
() => undefined
|
|
);
|
|
return normalizeVideoStoryboardConfig(setting?.value);
|
|
}
|
|
|