ai-chatbot/lib/worldlabs/splat-utils.ts
Your Name b3b49b4fe2
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: improve worldlabs admin controls and splat selection
2026-04-05 23:42:37 +08:00

61 lines
1.6 KiB
TypeScript

function normalizeSplatLabel(label: string) {
return String(label || "").trim().toLowerCase();
}
function parseResolutionScore(label: string) {
const normalized = normalizeSplatLabel(label);
if (!normalized) return 0;
if (
normalized.includes("full") ||
normalized.includes("origin") ||
normalized.includes("source") ||
normalized.includes("max")
) {
return Number.MAX_SAFE_INTEGER;
}
const match = normalized.match(/(\d+(?:\.\d+)?)\s*([km]?)/);
if (!match) return 0;
const value = Number(match[1]);
if (!Number.isFinite(value)) return 0;
const unit = match[2];
if (unit === "m") return Math.round(value * 1_000_000);
if (unit === "k") return Math.round(value * 1_000);
return Math.round(value);
}
function compareSplatEntries(
a: [string, string],
b: [string, string]
) {
const scoreDelta = parseResolutionScore(b[0]) - parseResolutionScore(a[0]);
if (scoreDelta !== 0) return scoreDelta;
return a[0].localeCompare(b[0], "en");
}
export function getSortedWorldLabsSplatEntries(
spzUrls?: Record<string, string> | null
) {
return Object.entries(spzUrls || {})
.filter(
(entry): entry is [string, string] =>
Boolean(entry[0]) && typeof entry[1] === "string" && entry[1].trim().length > 0
)
.sort(compareSplatEntries);
}
export function pickBestWorldLabsSplatEntry(
spzUrls?: Record<string, string> | null
) {
return getSortedWorldLabsSplatEntries(spzUrls)[0] || null;
}
export function pickBestWorldLabsSplatUrl(
spzUrls?: Record<string, string> | null
) {
return pickBestWorldLabsSplatEntry(spzUrls)?.[1] || null;
}