From 9098661d0f6e852bf2d8042e7a1ec58e62c72b34 Mon Sep 17 00:00:00 2001 From: Dicken Date: Sat, 20 Jun 2026 00:05:58 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Neuerscheinungen-Fenster=20auf=2021=20Ta?= =?UTF-8?q?ge=20verk=C3=BCrzt,=20schlie=C3=9Ft=20Top10-Titel=20explizit=20?= =?UTF-8?q?aus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/tools/media/routes.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/backend/src/tools/media/routes.js b/backend/src/tools/media/routes.js index ea60e36..ea3adef 100644 --- a/backend/src/tools/media/routes.js +++ b/backend/src/tools/media/routes.js @@ -549,9 +549,11 @@ router.get('/streaming/:providerId/new', authenticate, async (req, res) => { const cached = cacheGet(cacheKey); if (cached !== undefined) return res.json(cached); + // Enges 21-Tage-Fenster, damit "Neuerscheinungen" sich spürbar von "Top 10" + // (letzte 2 Jahre) unterscheidet, statt fast identisch zu sein const since = (() => { const d = new Date(); - d.setDate(d.getDate() - 60); + d.setDate(d.getDate() - 21); return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`; })(); const today = (() => { @@ -559,7 +561,7 @@ router.get('/streaming/:providerId/new', authenticate, async (req, res) => { return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`; })(); - // Innerhalb des 60-Tage-Fensters nach POPULARITÄT sortieren (nicht nach + // Innerhalb des 21-Tage-Fensters nach POPULARITÄT sortieren (nicht nach // Datum) – sonst landen wenig beachtete Tagesveröffentlichungen vor // tatsächlich angesagten Titeln. "Neuerscheinungen" heißt: neu UND beachtet. function baseParams(mediaKind) { @@ -614,10 +616,17 @@ router.get('/streaming/:providerId/new', authenticate, async (req, res) => { const tvRaw = [...(tvP1.results||[]), ...(tvP2.results||[])] .filter(m => !BLOCKED_LANGS.has(m.original_language)); - const movies = applyLanguageWeighting(movieRaw) + // Titel die bereits in der (gecachten) Top-10-Liste dieses Anbieters stehen + // aus den Neuerscheinungen ausschließen, damit beide Reiter sich nicht + // überschneiden, selbst wenn sich die Zeitfenster teilweise überlappen + const top10Cached = cacheGet(`streaming-top10:${provider.id}`); + const top10MovieIds = new Set((top10Cached?.movies || []).map(m => m.id)); + const top10TvIds = new Set((top10Cached?.tvShows || []).map(m => m.id)); + + const movies = applyLanguageWeighting(movieRaw.filter(m => !top10MovieIds.has(m.id))) .map((m, i) => ({ ...enrichMovie(m, genreMap, null, i + 1), media_type: 'movie' })); - const tvShows = applyLanguageWeighting(tvRaw) + const tvShows = applyLanguageWeighting(tvRaw.filter(m => !top10TvIds.has(m.id))) .map((m, i) => ({ id: m.id, media_type: 'tv', rank: i + 1, title: m.name || m.original_name,