Files
embycovers/homescreen_editor/lib/genre-cleanup.js
T
2026-06-08 21:58:16 +12:00

55 lines
1.5 KiB
JavaScript

function normalizeGenreKey(value) {
return String(value || '')
.trim()
.toLowerCase()
.replace(/[^a-z0-9]+/g, '');
}
export function normalizeGenreNames(values) {
const seen = new Set();
const names = [];
for (const value of values || []) {
const trimmed = String(value || '').trim();
if (!trimmed) continue;
const key = normalizeGenreKey(trimmed);
if (!key || seen.has(key)) continue;
seen.add(key);
names.push(trimmed);
}
return names;
}
export function pickSuggestedGenre(tmdbGenres, currentGenres = []) {
const normalizedTmdbGenres = normalizeGenreNames(tmdbGenres);
if (!normalizedTmdbGenres.length) return '';
const currentKeys = new Set(normalizeGenreNames(currentGenres).map(normalizeGenreKey));
const matched = normalizedTmdbGenres.find((genre) => currentKeys.has(normalizeGenreKey(genre)));
return matched || normalizedTmdbGenres[0];
}
export function buildSingleGenreUpdate(item, genreName) {
const selectedGenre = String(genreName || '').trim();
if (!selectedGenre) {
throw new Error('A genre is required');
}
const nextItem = JSON.parse(JSON.stringify(item || {}));
const existingGenreItems = Array.isArray(item?.GenreItems) ? item.GenreItems : [];
const matchedGenreItem = existingGenreItems.find(
(entry) => normalizeGenreKey(entry?.Name) === normalizeGenreKey(selectedGenre)
);
nextItem.Genres = [selectedGenre];
nextItem.GenreItems = [
matchedGenreItem
? { ...matchedGenreItem, Name: selectedGenre }
: { Name: selectedGenre }
];
return nextItem;
}