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

70 lines
2.5 KiB
TypeScript

export const VIDEO_DURATION_AUTO = -1;
export const VIDEO_DURATION_MIN = 4;
export const VIDEO_DURATION_MAX = 15;
export const VIDEO_DURATION_DEFAULT = 5;
export const VIDEO_DURATION_OPTIONS = Array.from(
{ length: VIDEO_DURATION_MAX - VIDEO_DURATION_MIN + 1 },
(_, index) => VIDEO_DURATION_MIN + index
);
export const VIDEO_RATIO_DEFAULT = "9:16";
export const VIDEO_RATIOS = ["9:16", "16:9", "1:1", "4:3", "3:4", "21:9", "adaptive"] as const;
export const VIDEO_RESOLUTION_DEFAULT = "720p";
export const VIDEO_RESOLUTIONS = ["720p", "1080p", "480p"] as const;
export const VIDEO_FAST_RESOLUTIONS = ["720p", "480p"] as const;
type VideoDurationOptions = {
allowAuto?: boolean;
};
export function clampVideoDuration(
value: unknown,
fallback = VIDEO_DURATION_DEFAULT,
options: VideoDurationOptions = {}
) {
const duration = Number(value);
if (!Number.isFinite(duration)) return fallback;
const rounded = Math.round(duration);
if (options.allowAuto !== false && rounded === VIDEO_DURATION_AUTO) return VIDEO_DURATION_AUTO;
return Math.min(VIDEO_DURATION_MAX, Math.max(VIDEO_DURATION_MIN, rounded));
}
export function normalizeVideoDuration(value: unknown) {
if (value === undefined || value === null || value === "") return undefined;
return clampVideoDuration(value);
}
export function normalizeVideoRatio(value: unknown, fallback = VIDEO_RATIO_DEFAULT) {
const ratio = String(value || "").trim();
if (isSupportedVideoRatio(ratio)) return ratio;
return isSupportedVideoRatio(fallback) ? fallback : VIDEO_RATIO_DEFAULT;
}
export function normalizeVideoResolution(
value: unknown,
model?: string,
fallback = VIDEO_RESOLUTION_DEFAULT
) {
const resolutions = supportedVideoResolutions(model);
const resolution = String(value || "").trim();
if (isSupportedVideoResolution(resolution, model)) return resolution;
return (resolutions as readonly string[]).includes(fallback) ? fallback : VIDEO_RESOLUTION_DEFAULT;
}
export function supportedVideoResolutions(model?: string) {
return isSeedanceFastModel(model) ? VIDEO_FAST_RESOLUTIONS : VIDEO_RESOLUTIONS;
}
export function isSeedanceFastModel(model?: string) {
return String(model || "").toLowerCase().replace(/\./g, "-").includes("seedance-2-0-fast");
}
function isSupportedVideoRatio(value: string): value is (typeof VIDEO_RATIOS)[number] {
return VIDEO_RATIOS.includes(value as (typeof VIDEO_RATIOS)[number]);
}
function isSupportedVideoResolution(value: string, model?: string) {
return (supportedVideoResolutions(model) as readonly string[]).includes(value);
}