From 71c411a350a6903e0685e71a31129818b1413e55 Mon Sep 17 00:00:00 2001 From: Dicken Date: Thu, 11 Jun 2026 09:46:55 +0200 Subject: [PATCH] feat: DE/US Kinostart + US Digital Release-Datum im Modal --- backend/src/tools/media/routes.js | 21 +++++++++++++++++++++ frontend/src/tools/media.jsx | 20 ++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/backend/src/tools/media/routes.js b/backend/src/tools/media/routes.js index 51b5ef9..49247d1 100644 --- a/backend/src/tools/media/routes.js +++ b/backend/src/tools/media/routes.js @@ -65,6 +65,26 @@ function extractFSK(rd) { for (const r of sorted) { const c = (r.certification||'').trim(); if (c) return c; } return null; } + +function extractReleaseDates(rd) { + const out = {}; + // DE Kinostart (type 3) + const de = rd?.results?.find(r => r.iso_3166_1 === 'DE'); + if (de) { + const theatrical = de.release_dates.find(r => r.type === 3); + if (theatrical?.release_date) out.de_cinema = theatrical.release_date.slice(0,10); + } + // US Kinostart (type 3) + const us = rd?.results?.find(r => r.iso_3166_1 === 'US'); + if (us) { + const theatrical = us.release_dates.find(r => r.type === 3); + if (theatrical?.release_date) out.us_cinema = theatrical.release_date.slice(0,10); + // US Digital (type 4) + const digital = us.release_dates.find(r => r.type === 4); + if (digital?.release_date) out.us_digital = digital.release_date.slice(0,10); + } + return out; +} async function fetchAllPages(path, maxPages = 3) { const first = await tmdb(path, { page: 1 }); const total = Math.min(first.total_pages || 1, maxPages); @@ -262,6 +282,7 @@ router.get('/movie/:id', authenticate, async (req, res) => { backdrop_path: detail.backdrop_path, release_date: detail.release_date, runtime: detail.runtime, vote_average: detail.vote_average, genres: (detail.genres||[]).map(g => g.name), fsk, + release_dates: extractReleaseDates(detail.release_dates), cast: (detail.credits?.cast||[]).slice(0,8).map(a => a.name), director: detail.credits?.crew?.find(c => c.job==='Director')?.name||null, tmdb_url: `https://www.themoviedb.org/movie/${detail.id}`, diff --git a/frontend/src/tools/media.jsx b/frontend/src/tools/media.jsx index d8730be..8a1409b 100644 --- a/frontend/src/tools/media.jsx +++ b/frontend/src/tools/media.jsx @@ -580,8 +580,12 @@ function MovieModal({ tmdbId, onClose, mobile, onHasXrel }) { {detail.vote_average > 0 && β˜… {detail.vote_average.toFixed(1)}} {detail.runtime > 0 && ⏱ {detail.runtime} Min} {fskStyle && FSK {detail.fsk}} - {detail.release_date && πŸ‡©πŸ‡ͺ {fmtDE(detail.release_date)}} - {detail.countries?.length > 0 && 🌍 {detail.countries.slice(0,2).join(' Β· ')}} + {detail.release_dates?.de_cinema + ? πŸ‡©πŸ‡ͺ Kino {fmtDE(detail.release_dates.de_cinema)} + : detail.release_date && πŸ‡©πŸ‡ͺ {fmtDE(detail.release_date)}} + {detail.release_dates?.us_cinema && πŸ‡ΊπŸ‡Έ Kino {fmtDE(detail.release_dates.us_cinema)}} + {detail.release_dates?.us_digital && πŸ’» Digital {fmtDE(detail.release_dates.us_digital)}} + {detail.countries?.length > 0 && 🌍 {detail.countries.slice(0,2).join(' Β· ')}} {detail.genres?.length > 0 && (
@@ -642,6 +646,18 @@ function MovieModal({ tmdbId, onClose, mobile, onHasXrel }) { {/* xREL Releases */}
+ {/* Web-Release aus frΓΌhestem WEB-Release ableiten */} + {xrel?.length > 0 && (() => { + const webRelease = xrel + .filter(r => /web/i.test(r.dirname||'')) + .sort((a,b) => (a.date||'').localeCompare(b.date||''))[0]; + return webRelease?.date ? ( +
+ 🌐 Erster Web-Release: {fmtDE(webRelease.date)} + {webRelease.p2p ? 'P2P' : 'SCN'} +
+ ) : null; + })()}
RELEASES (XREL.TO)