diff --git a/backend/src/tools/media/routes.js b/backend/src/tools/media/routes.js index 693ffa0..3e5366f 100644 --- a/backend/src/tools/media/routes.js +++ b/backend/src/tools/media/routes.js @@ -250,16 +250,17 @@ router.get('/movie/:id/xrel', authenticate, async (req, res) => { const cacheKey = `xrel:tmdb:${req.params.id}`; const forceRefresh = req.query.refresh === '1'; - // Cache-Verhalten: - // - Befüllte Einträge: immer sofort zurückgeben (auch bei refresh=1) - // - Leere Einträge: ignorieren, frisch suchen - const cached = cacheGet(cacheKey); - if (cached !== undefined && cached.length > 0) { - return res.json({ xrel: cached, has_xrel: true }); - } - // Bei refresh=1: leeren Cache-Eintrag löschen damit neu gesucht wird if (forceRefresh) { + // Aktualisieren: Cache löschen und frisch von xREL laden db.prepare('DELETE FROM xrel_cache WHERE cache_key=?').run(cacheKey); + } else { + // Normaler Aufruf: befüllten Cache zurückgeben, bei leerem → nichts zurückgeben + const cached = cacheGet(cacheKey); + if (cached !== undefined) { + return res.json({ xrel: cached, has_xrel: cached.length > 0 }); + } + // Kein Cache: auch kein xREL-Call, nur leeres Ergebnis + return res.json({ xrel: [], has_xrel: false }); } // Titel + IMDb-ID aus Query-Params wenn vorhanden (spart 2 TMDb-Calls) diff --git a/frontend/src/tools/media.jsx b/frontend/src/tools/media.jsx index 270df70..a306e17 100644 --- a/frontend/src/tools/media.jsx +++ b/frontend/src/tools/media.jsx @@ -467,23 +467,25 @@ function MovieModal({ tmdbId, onClose, mobile, onHasXrel }) { api(`/tools/media/movie/${tmdbId}`) .then(d => { setDetail(d); setLoading(false); }) .catch(e => { setError(e.message); setLoading(false); }); + // Gecachte Releases laden – ohne refresh, nur befüllte Einträge + api(`/tools/media/movie/${tmdbId}/xrel`) + .then(d => { if (d.xrel?.length > 0) { setXrel(d.xrel); onHasXrel?.(tmdbId); } }) + .catch(() => {}); const prev = document.body.style.overflow; document.body.style.overflow = 'hidden'; return () => { document.body.style.overflow = prev; }; }, [tmdbId]); - const searchXrel = async () => { + const searchXrel = async (forceRefresh = false) => { if (!detail) return; setXrelLoading(true); try { - // Immer refresh=1: ignoriert leere Cache-Einträge, sucht frisch - // Befüllte Cache-Einträge werden trotzdem sofort zurückgegeben (Backend-Logik) const params = new URLSearchParams({ title: detail.title || '', orig: detail.original_title || '', imdb_id: detail.imdb_id || '', - refresh: '1', }); + if (forceRefresh) params.set('refresh', '1'); const d = await api(`/tools/media/movie/${tmdbId}/xrel?${params}`); setXrel(d.xrel || []); if (d.has_xrel) onHasXrel?.(tmdbId); @@ -629,7 +631,7 @@ function MovieModal({ tmdbId, onClose, mobile, onHasXrel }) {