feat: Sub-Tabs Top10/Neuerscheinungen mit Sprachgewichtung, debug-network entfernt (Endpoint existiert nicht bei TMDb)
This commit is contained in:
@@ -559,32 +559,65 @@ 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
|
||||
// Datum) – sonst landen wenig beachtete Tagesveröffentlichungen vor
|
||||
// tatsächlich angesagten Titeln. "Neuerscheinungen" heißt: neu UND beachtet.
|
||||
function baseParams(mediaKind) {
|
||||
return {
|
||||
watch_region: 'DE',
|
||||
with_watch_providers: provider.tmdbId,
|
||||
with_watch_monetization_types: 'flatrate',
|
||||
sort_by: mediaKind === 'movie' ? 'primary_release_date.desc' : 'first_air_date.desc',
|
||||
sort_by: 'popularity.desc',
|
||||
...(mediaKind === 'movie'
|
||||
? { 'primary_release_date.gte': since, 'primary_release_date.lte': today }
|
||||
: { 'first_air_date.gte': since, 'first_air_date.lte': today }),
|
||||
};
|
||||
}
|
||||
|
||||
const [movieData, tvData, genreMap] = await Promise.all([
|
||||
// Gleiche Sprachgewichtung wie bei Top 10: Deutsch/Englisch unbegrenzt,
|
||||
// alle anderen Sprachen zusammen max. 2 Plätze
|
||||
const UNLIMITED_LANGS = new Set(['de', 'en']);
|
||||
const MAX_OTHER_LANGUAGE_TOTAL = 2;
|
||||
function applyLanguageWeighting(rawList) {
|
||||
let otherCount = 0;
|
||||
const picked = [];
|
||||
const overflow = [];
|
||||
for (const item of rawList) {
|
||||
const lang = item.original_language || 'xx';
|
||||
if (UNLIMITED_LANGS.has(lang)) {
|
||||
picked.push(item);
|
||||
} else if (otherCount < MAX_OTHER_LANGUAGE_TOTAL) {
|
||||
picked.push(item);
|
||||
otherCount++;
|
||||
} else {
|
||||
overflow.push(item);
|
||||
}
|
||||
if (picked.length >= 10) break;
|
||||
}
|
||||
for (const item of overflow) {
|
||||
if (picked.length >= 10) break;
|
||||
picked.push(item);
|
||||
}
|
||||
return picked.slice(0, 10);
|
||||
}
|
||||
|
||||
const [movieP1, movieP2, tvP1, tvP2, genreMap] = await Promise.all([
|
||||
tmdb('/discover/movie', { ...baseParams('movie'), page: 1 }),
|
||||
tmdb('/discover/movie', { ...baseParams('movie'), page: 2 }),
|
||||
tmdb('/discover/tv', { ...baseParams('tv'), page: 1 }),
|
||||
tmdb('/discover/tv', { ...baseParams('tv'), page: 2 }),
|
||||
getGenreMap(),
|
||||
]);
|
||||
|
||||
const movies = (movieData.results || [])
|
||||
.filter(m => !BLOCKED_LANGS.has(m.original_language))
|
||||
.slice(0, 10)
|
||||
const movieRaw = [...(movieP1.results||[]), ...(movieP2.results||[])]
|
||||
.filter(m => !BLOCKED_LANGS.has(m.original_language));
|
||||
const tvRaw = [...(tvP1.results||[]), ...(tvP2.results||[])]
|
||||
.filter(m => !BLOCKED_LANGS.has(m.original_language));
|
||||
|
||||
const movies = applyLanguageWeighting(movieRaw)
|
||||
.map((m, i) => ({ ...enrichMovie(m, genreMap, null, i + 1), media_type: 'movie' }));
|
||||
|
||||
const tvShows = (tvData.results || [])
|
||||
.filter(m => !BLOCKED_LANGS.has(m.original_language))
|
||||
.slice(0, 10)
|
||||
const tvShows = applyLanguageWeighting(tvRaw)
|
||||
.map((m, i) => ({
|
||||
id: m.id, media_type: 'tv', rank: i + 1,
|
||||
title: m.name || m.original_name,
|
||||
@@ -904,16 +937,8 @@ router.get('/streaming/debug/:providerId', authenticate, requireAdmin, async (re
|
||||
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||
});
|
||||
|
||||
// Debug: TV-Network-ID per Namenssuche finden (für Originals-Filter)
|
||||
router.get('/streaming/debug-network/:name', authenticate, requireAdmin, async (req, res) => {
|
||||
try {
|
||||
const data = await tmdb('/search/network', { query: req.params.name });
|
||||
res.json(data.results || []);
|
||||
} catch(e) { res.status(500).json({ error: e.message }); }
|
||||
});
|
||||
|
||||
router.post('/streaming/clear-cache', authenticate, requireAdmin, (req, res) => {
|
||||
const r = db.prepare("DELETE FROM xrel_cache WHERE cache_key LIKE 'streaming-top10:%'").run();
|
||||
const r = db.prepare("DELETE FROM xrel_cache WHERE cache_key LIKE 'streaming-top10:%' OR cache_key LIKE 'streaming-new:%'").run();
|
||||
res.json({ ok: true, cleared: r.changes });
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user