From 77c5af01c9a0e3c06c5e06ead708f7981ab91d8a Mon Sep 17 00:00:00 2001 From: Dicken Date: Wed, 10 Jun 2026 22:38:40 +0200 Subject: [PATCH] fix: xREL Sonderzeichen im Titel entfernen, leere Ergebnisse nur 30min cachen, Cache-Clear Endpoint --- backend/src/tools/media/routes.js | 34 ++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/backend/src/tools/media/routes.js b/backend/src/tools/media/routes.js index 34b2826..b4f05c6 100644 --- a/backend/src/tools/media/routes.js +++ b/backend/src/tools/media/routes.js @@ -118,14 +118,30 @@ function enrichMovie(movie, genreMap, fsk, rank) { // Jeder Eintrag hat ext_info.title für exakten Match + main_lang für German-Filter // Das spart den ext_info_id Lookup komplett +// Sonderzeichen aus Suchtitel entfernen die xREL verwirren +function cleanTitle(t) { + return (t || '').replace(/[*#@!?]/g, '').replace(/\s+/g, ' ').trim(); +} + async function xrelSearchGerman(title, originalTitle) { - const cacheKey = `xrel:${originalTitle || title}`.toLowerCase(); + const cleanOrig = cleanTitle(originalTitle); + const cleanTitle_ = cleanTitle(title); + const cacheKey = `xrel:${cleanOrig || cleanTitle_}`.toLowerCase(); const cached = dbCacheGet(cacheKey); if (cached !== undefined) return cached; - const queries = [originalTitle, title].filter(Boolean) + // Queries: original ohne Sonderzeichen, dann deutsch, dann ohne Artikel + const rawQueries = [cleanOrig, cleanTitle_] + .filter(Boolean) .filter((v, i, a) => a.indexOf(v) === i); + // Zusätzlich: deutschen Artikel entfernen (Der/Die/Das am Anfang) + const extraQueries = rawQueries + .map(q => q.replace(/^(Der|Die|Das|Ein|Eine)\s+/i, '').trim()) + .filter(q => q && !rawQueries.includes(q)); + + const queries = [...rawQueries, ...extraQueries]; + const results = []; const seen = new Set(); @@ -182,7 +198,13 @@ async function xrelSearchGerman(title, originalTitle) { } results.sort((a, b) => (b.date || '').localeCompare(a.date || '')); - dbCacheSet(cacheKey, results); + // Leere Ergebnisse nur kurz cachen (30 Min) damit xREL später nochmal gefragt wird + if (results.length > 0) { + dbCacheSet(cacheKey, results); + } else { + db.prepare('INSERT OR REPLACE INTO xrel_cache (cache_key, value, expires_at) VALUES (?,?,?)') + .run(cacheKey, '[]', Date.now() + 30 * 60 * 1000); + } return results; } @@ -301,4 +323,10 @@ router.put('/settings', authenticate, requireAdmin, (req, res) => { res.json({ ok: true }); }); +// DELETE /api/tools/media/xrel-cache – Cache leeren (Admin) +router.delete('/xrel-cache', authenticate, requireAdmin, (req, res) => { + const info = db.prepare('DELETE FROM xrel_cache').run(); + res.json({ deleted: info.changes }); +}); + module.exports = router;