From 8d99ceba044eeb2dc2cfaffb771b2200e28b3c94 Mon Sep 17 00:00:00 2001 From: Dicken Date: Thu, 11 Jun 2026 10:09:50 +0200 Subject: [PATCH] feat: alle Erscheinungsdaten im Modal (Kinostart DE/US, Web, Retail, Blu-ray) --- backend/src/tools/media/routes.js | 35 +++++++++++++++++-------------- frontend/src/tools/media.jsx | 22 ++++++++++++++----- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/backend/src/tools/media/routes.js b/backend/src/tools/media/routes.js index 49247d1..fbb8bca 100644 --- a/backend/src/tools/media/routes.js +++ b/backend/src/tools/media/routes.js @@ -66,24 +66,27 @@ function extractFSK(rd) { return null; } +const RELEASE_TYPE_LABEL = { 2:'Kino (limited)', 3:'Kinostart', 4:'Web', 5:'Retail', 6:'TV' }; + 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); + if (!rd?.results) return []; + const PRIORITY = ['DE','US','GB','FR','AT','CH']; + const entries = []; + for (const country of PRIORITY) { + const c = rd.results.find(r => r.iso_3166_1 === country); + if (!c) continue; + for (const r of c.release_dates) { + if (!r.release_date) continue; + if (!RELEASE_TYPE_LABEL[r.type]) continue; // Premiere+TV überspringen + entries.push({ + country, + label: `${RELEASE_TYPE_LABEL[r.type]} (${country})`, + date: r.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; + entries.sort((a, b) => a.date.localeCompare(b.date)); + return entries; } async function fetchAllPages(path, maxPages = 3) { const first = await tmdb(path, { page: 1 }); diff --git a/frontend/src/tools/media.jsx b/frontend/src/tools/media.jsx index 8a1409b..d00504d 100644 --- a/frontend/src/tools/media.jsx +++ b/frontend/src/tools/media.jsx @@ -580,11 +580,7 @@ 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_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.release_date && 🇩🇪 {fmtDE(detail.release_date)}} {detail.countries?.length > 0 && 🌍 {detail.countries.slice(0,2).join(' · ')}} {detail.genres?.length > 0 && ( @@ -598,6 +594,22 @@ function MovieModal({ tmdbId, onClose, mobile, onHasXrel }) { + {detail.release_dates?.length > 0 && ( +
+
ERSCHEINUNGSDATEN
+
+ {detail.release_dates.map((r, i) => ( +
+ {r.label} + {fmtDE(r.date)} +
+ ))} +
+
+ )} + {detail.overview && (
HANDLUNG