fix: xREL leere Cache-Einträge bei manuellem Suchen ignorieren, Titel als Query-Params
This commit is contained in:
@@ -244,7 +244,7 @@ router.get('/movie/:id', authenticate, async (req, res) => {
|
|||||||
} catch(e) { res.status(500).json({ error: e.message }); }
|
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||||
});
|
});
|
||||||
|
|
||||||
// xREL on-demand – ?refresh=1 ignoriert den Cache (erneute Suche)
|
// xREL on-demand – ?refresh=1 ignoriert Cache, ?imdb_id=tt...&title=...&orig=... vermeidet TMDb-Calls
|
||||||
router.get('/movie/:id/xrel', authenticate, async (req, res) => {
|
router.get('/movie/:id/xrel', authenticate, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const cacheKey = `xrel:tmdb:${req.params.id}`;
|
const cacheKey = `xrel:tmdb:${req.params.id}`;
|
||||||
@@ -252,18 +252,31 @@ router.get('/movie/:id/xrel', authenticate, async (req, res) => {
|
|||||||
|
|
||||||
if (!forceRefresh) {
|
if (!forceRefresh) {
|
||||||
const cached = cacheGet(cacheKey);
|
const cached = cacheGet(cacheKey);
|
||||||
if (cached !== undefined) return res.json({ xrel: cached, has_xrel: cached.length > 0 });
|
// Nur nicht-leere Cache-Einträge sofort zurückgeben
|
||||||
|
// Leere Einträge → nochmal suchen (könnte Rate-Limit-Artefakt sein)
|
||||||
|
if (cached !== undefined && cached.length > 0) {
|
||||||
|
return res.json({ xrel: cached, has_xrel: true });
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Cache-Eintrag löschen für diesen Film
|
|
||||||
db.prepare('DELETE FROM xrel_cache WHERE cache_key=?').run(cacheKey);
|
db.prepare('DELETE FROM xrel_cache WHERE cache_key=?').run(cacheKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
const [detail, extIds] = await Promise.all([
|
// Titel + IMDb-ID aus Query-Params wenn vorhanden (spart 2 TMDb-Calls)
|
||||||
tmdb(`/movie/${req.params.id}`, { append_to_response: '' }).catch(()=>({})),
|
let imdbId = req.query.imdb_id || null;
|
||||||
tmdb(`/movie/${req.params.id}/external_ids`).catch(()=>({})),
|
let title = req.query.title || null;
|
||||||
]);
|
let origTitle = req.query.orig || null;
|
||||||
const imdbId = extIds.imdb_id || null;
|
|
||||||
const xrel = await getXrelData(req.params.id, imdbId, detail.title, detail.original_title);
|
if (!title) {
|
||||||
|
const [detail, extIds] = await Promise.all([
|
||||||
|
tmdb(`/movie/${req.params.id}`, { append_to_response: '' }).catch(()=>({})),
|
||||||
|
tmdb(`/movie/${req.params.id}/external_ids`).catch(()=>({})),
|
||||||
|
]);
|
||||||
|
imdbId = extIds.imdb_id || null;
|
||||||
|
title = detail.title || null;
|
||||||
|
origTitle = detail.original_title || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const xrel = await getXrelData(req.params.id, imdbId, title, origTitle);
|
||||||
res.json({ xrel, has_xrel: xrel.length > 0 });
|
res.json({ xrel, has_xrel: xrel.length > 0 });
|
||||||
} catch(e) { res.status(500).json({ error: e.message }); }
|
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -456,10 +456,16 @@ function MovieModal({ tmdbId, onClose, mobile, onHasXrel }) {
|
|||||||
}, [tmdbId]);
|
}, [tmdbId]);
|
||||||
|
|
||||||
const searchXrel = async (refresh = false) => {
|
const searchXrel = async (refresh = false) => {
|
||||||
|
if (!detail) return;
|
||||||
setXrelLoading(true);
|
setXrelLoading(true);
|
||||||
try {
|
try {
|
||||||
const url = `/tools/media/movie/${tmdbId}/xrel${refresh ? '?refresh=1' : ''}`;
|
const params = new URLSearchParams({
|
||||||
const d = await api(url);
|
title: detail.title || '',
|
||||||
|
orig: detail.original_title || '',
|
||||||
|
imdb_id: detail.imdb_id || '',
|
||||||
|
});
|
||||||
|
if (refresh) params.set('refresh', '1');
|
||||||
|
const d = await api(`/tools/media/movie/${tmdbId}/xrel?${params}`);
|
||||||
setXrel(d.xrel || []);
|
setXrel(d.xrel || []);
|
||||||
if (d.has_xrel) onHasXrel?.(tmdbId);
|
if (d.has_xrel) onHasXrel?.(tmdbId);
|
||||||
} catch(_) { setXrel([]); }
|
} catch(_) { setXrel([]); }
|
||||||
|
|||||||
Reference in New Issue
Block a user