diff --git a/backend/src/tools/media/routes.js b/backend/src/tools/media/routes.js index 3e5366f..b968021 100644 --- a/backend/src/tools/media/routes.js +++ b/backend/src/tools/media/routes.js @@ -15,6 +15,14 @@ const BLOCKED_LANGS = new Set(['tr', 'hi', 'te', 'ta', 'ml', 'kn', 'bn', 'mr', ' // 16=Animation, 99=Documentary – aber nur rausfiltern wenn explizit kein Spielfilm-Genre dabei const DOC_GENRE_ID = 99; +// Umlaut-Normalisierung für xREL-Suche (Nürnberg → Nuernberg etc.) +function normalizeUmlauts(s) { + return (s||'') + .replace(/ä/g,'ae').replace(/ö/g,'oe').replace(/ü/g,'ue') + .replace(/Ä/g,'Ae').replace(/Ö/g,'Oe').replace(/Ü/g,'Ue') + .replace(/ß/g,'ss'); +} + // ── SQLite Cache ────────────────────────────────────────────────────────────── function cacheGet(key) { const row = db.prepare('SELECT value, expires_at FROM xrel_cache WHERE cache_key=?').get(key); @@ -125,7 +133,7 @@ async function getXrelData(tmdbId, imdbId, title, originalTitle) { const searchResults = await Promise.all(queries.map(async q => { try { return await xrelFetch('/search/ext_info.json', { - q: q.replace(/[*#!?:]/g,''), type:'movie', limit:10 + q: normalizeUmlauts(q).replace(/[*#!?:]/g,''), type:'movie', limit:10 }); } catch(_) { return null; } }));