diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 0abf726..f8f046f 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -17,7 +17,7 @@ "navRecommendations": { "message": "Empfehlungen" }, "navMusic": { "message": "Musik" }, "navM3uGenerator": { "message": "M3U-Generator" }, - "heroWelcome": { "message": "Willkommen bei CinePlex" }, + "heroWelcome": { "message": "" }, "heroSubtitle": { "message": "Entdecken Sie Tausende von Filmen und Serien." }, "addStream": { "message": "Stream hinzufügen" }, "moreInfo": { "message": "Mehr Info" }, @@ -261,8 +261,13 @@ "episodesCount": {"message": "$count$ Episoden", "placeholders": {"count": {"content": "$1"}}}, "seasonsCount": {"message": "$count$ Staffeln", "placeholders": {"count": {"content": "$1"}}}, "runtimeMinutes": {"message": "$count$ min", "placeholders": {"count": {"content": "$1"}}}, - "noTrailerFound": {"message": "Kein Trailer für diesen Titel gefunden."},n "fatalInitError": {"message": "Fataler Initialisierungsfehler"}, - "fatalInitErrorSub": {"message": "Die Anwendung konnte nicht geladen werden."},n "invalidStreamInfo": {"message": "Ungültige Informationen."},n "dbUnavailableForStreams": {"message": "Lokale Datenbank nicht verfügbar."},n "noPlexServersForStreams": {"message": "Keine Plex-Server."},n "notFoundOnServers": {"message": "\"$query$\" auf Plex-Servern nicht gefunden.", "placeholders": {"query": {"content": "$1"}}}, + "noTrailerFound": {"message": "Kein Trailer für diesen Titel gefunden."}, + "fatalInitError": {"message": "Fataler Initialisierungsfehler"}, + "fatalInitErrorSub": {"message": "Die Anwendung konnte nicht geladen werden."}, + "invalidStreamInfo": {"message": "Ungültige Informationen."}, + "dbUnavailableForStreams": {"message": "Lokale Datenbank nicht verfügbar."}, + "noPlexServersForStreams": {"message": "Keine Plex-Server."}, + "notFoundOnServers": {"message": "\"$query$\" auf Plex-Servern nicht gefunden.", "placeholders": {"query": {"content": "$1"}}}, "relativeTime_justNow": { "message": "Gerade eben" }, "relativeTime_minutesAgo": { "message": "Vor $count$ Minuten", "placeholders": { "count": { "content": "$1" } } }, "relativeTime_hoursAgo": { "message": "Vor $count$ Stunden", "placeholders": { "count": { "content": "$1" } } }, diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 0a00ecc..a242665 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -17,7 +17,7 @@ "navRecommendations": { "message": "Recommendations" }, "navMusic": { "message": "Music" }, "navM3uGenerator": { "message": "M3U Generator" }, - "heroWelcome": { "message": "Welcome to CinePlex" }, + "heroWelcome": { "message": "" }, "heroSubtitle": { "message": "Explore thousands of movies and series." }, "addStream": { "message": "Add Stream" }, "moreInfo": { "message": "More info" }, diff --git a/_locales/es/messages.json b/_locales/es/messages.json index f41dec2..82b2e0d 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -440,7 +440,7 @@ "tokenAddedSuccessfully": { "message": "Token añadido correctamente." }, "noStreamsFoundForSelection": { "message": "No se encontraron streams para la selección." }, "autoplayBlocked": { "message": "Reproducción automática bloqueada." }, - "welcomeToCinePlex": { "message": "Bienvenido a CinePlex" }, + "welcomeToCinePlex": { "message": "" }, "page": { "message": "Página" }, "all": { "message": "Todo" }, "userScore": { "message": "Puntuación" }, diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index 96a4d12..03c3ed0 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -17,7 +17,7 @@ "navRecommendations": { "message": "Recommandations" }, "navMusic": { "message": "Musique" }, "navM3uGenerator": { "message": "Générateur M3U" }, - "heroWelcome": { "message": "Bienvenue sur CinePlex" }, + "heroWelcome": { "message": "" }, "heroSubtitle": { "message": "Explorez des milliers de films et de séries." }, "addStream": { "message": "Ajouter un flux" }, "moreInfo": { "message": "Plus d'infos" }, diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 58c9233..eb06da2 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -17,7 +17,7 @@ "navRecommendations": { "message": "Raccomandazioni" }, "navMusic": { "message": "Musica" }, "navM3uGenerator": { "message": "Generatore M3U" }, - "heroWelcome": { "message": "Benvenuto in CinePlex" }, + "heroWelcome": { "message": "" }, "heroSubtitle": { "message": "Esplora migliaia di film e serie." }, "addStream": { "message": "Aggiungi streaming" }, "moreInfo": { "message": "Più informazioni" }, diff --git a/_locales/pt/messages.json b/_locales/pt/messages.json index ab36fbf..fe51aee 100644 --- a/_locales/pt/messages.json +++ b/_locales/pt/messages.json @@ -17,7 +17,7 @@ "navRecommendations": { "message": "Recomendações" }, "navMusic": { "message": "Música" }, "navM3uGenerator": { "message": "Gerador de M3U" }, - "heroWelcome": { "message": "Bem-vindo ao CinePlex" }, + "heroWelcome": { "message": "" }, "heroSubtitle": { "message": "Explore milhares de filmes e séries." }, "addStream": { "message": "Adicionar stream" }, "moreInfo": { "message": "Mais informações" }, diff --git a/css/main.css b/css/main.css index adffb65..d3a4b0f 100644 --- a/css/main.css +++ b/css/main.css @@ -1453,7 +1453,7 @@ body.sidebar-collapsed #main-container { color: var(--text-secondary); } -.similar-items-grid { +.similar-items-grid, .filmography-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 1.5rem; @@ -1715,7 +1715,7 @@ body.sidebar-collapsed #main-container { gap: 1.5rem; } - .similar-items-grid { + .similar-items-grid, .filmography-grid { grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 1rem; } @@ -1778,7 +1778,7 @@ body.sidebar-collapsed #main-container { height: 80px; } - .similar-items-grid { + .similar-items-grid, .filmography-grid { grid-template-columns: repeat(2, 1fr); gap: 1rem; } diff --git a/js/ui.js b/js/ui.js index 4201a39..b26fb3a 100644 --- a/js/ui.js +++ b/js/ui.js @@ -43,7 +43,7 @@ export function initializeUserData() { const savedPrefs = localStorage.getItem('cineplex_userPreferences'); state.userPreferences = savedPrefs ? JSON.parse(savedPrefs) : { genres: {}, keywords: {}, ratings: [], cast: {}, crew: {} }; } catch { - state.userPreferences = { genres: {}, keywords: {}, ratings: [], cast: {}, crew: {} }; + state.userPreferences = { genres: {}, keywords: {}, ratings: {}, cast: {}, crew: {} }; } } @@ -1393,8 +1393,8 @@ export async function initializeHeroSection() { if (!bg1 || !bg2 || !content) return; const heroButtons = content.querySelector('.hero-buttons'); - content.querySelector('.hero-title').textContent = _('heroWelcome'); - content.querySelector('.hero-subtitle').textContent = _('heroSubtitle'); + content.querySelector('.hero-title').textContent = _('welcomeToCinePlex'); + content.querySelector('.hero-subtitle').textContent = _('welcomeSubtitle'); content.querySelector('#hero-rating').innerHTML = ''; content.querySelector('#hero-year').innerHTML = ''; content.querySelector('#hero-extra').innerHTML = ''; @@ -2219,8 +2219,31 @@ async function renderActorDetails(actor) { const biography = actor.biography || _('noBiography'); const imdbId = actor.external_ids?.imdb_id; + const actorNameLower = actor.name.toLowerCase(); + + const MIN_MAIN_ROLE_ORDER = 10; + const filmography = actor.combined_credits.cast - .filter(item => (item.media_type === 'movie' || item.media_type === 'tv') && item.poster_path) + .filter(item => { + if (item.media_type !== 'movie' || !item.poster_path) { + return false; + } + + const characterNameLower = (item.character || '').toLowerCase(); + if (characterNameLower.includes('himself') || + characterNameLower.includes('herself') || + characterNameLower === 'self' || + characterNameLower.includes(actorNameLower) + ) { + return false; + } + + if (item.order !== undefined && item.order > MIN_MAIN_ROLE_ORDER) { + return false; + } + + return true; + }) .sort((a, b) => (b.popularity || 0) - (a.popularity || 0)) .slice(0, 16); @@ -2244,12 +2267,11 @@ async function renderActorDetails(actor) {