55 lines
1.5 KiB
JavaScript
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;
|
||
|
|
}
|