24 lines
860 B
TypeScript
24 lines
860 B
TypeScript
import type { MediaAsset } from "./api";
|
||
|
||
const tokens = (value: string) => value
|
||
.toLocaleLowerCase("ru")
|
||
.replaceAll("ё", "е")
|
||
.replace(/^(оз\.|р\.)\s*/, "")
|
||
.replace(/[^a-zа-я0-9]+/giu, " ")
|
||
.trim()
|
||
.split(/\s+/)
|
||
.filter(Boolean);
|
||
|
||
export const findMediaByLabel = (assets: MediaAsset[], label: string): MediaAsset | undefined => {
|
||
const wanted = tokens(label);
|
||
const exact = assets.filter((asset) => tokens(asset.label ?? "").join(" ") === wanted.join(" "));
|
||
if (exact.length === 1) return exact[0];
|
||
|
||
const wantedSet = new Set(wanted);
|
||
const candidates = assets.filter((asset) => {
|
||
const available = new Set(tokens(asset.label ?? ""));
|
||
return wanted.every((token) => available.has(token)) || [...available].every((token) => wantedSet.has(token));
|
||
});
|
||
return candidates.length === 1 ? candidates[0] : undefined;
|
||
};
|