From 46eecd8dbf0c4e834b2c69f0950080e15d840439 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Sat, 30 May 2026 03:36:35 +0000 Subject: [PATCH] Add related movies on Series page. Uses heuristics to show serie movies only. --- frontend/src/App.vue | 7 + frontend/src/components/MediaDetail.vue | 8 ++ frontend/src/components/SeriesFullView.vue | 156 ++++++++++++++++++++- 3 files changed, 170 insertions(+), 1 deletion(-) diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 6bad236..7a8939b 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -157,6 +157,7 @@ v-if="detailItemForRender" v-show="isDetailOpen" :item="detailItemForRender" + :all-movies="mediaIndex?.movies ?? []" :focus-episode="focusEpisode" :has-resume-position="hasResumePosition" :get-root-name="getRootName" @@ -164,6 +165,7 @@ @play="handlePlay" @open-folder="handleOpenFolder" @search-actor="handleActorSearch" + @select-movie="handleSelectMovieFromDetail" /> @@ -762,6 +764,11 @@ function handleActorSearch(actorName: string) { updateSearchQuery(actorName) } +function handleSelectMovieFromDetail(movieId: string) { + const searchPath = searchQuery.value ? getSearchPath(searchQuery.value) : null + router.push({ path: `/movies/${movieId}`, state: searchPath ? { searchPath } : undefined }) +} + function focusDetailEntryTarget(item: MediaItem): boolean { const detailPanel = document.querySelector('[data-nav-scope="detail"]') as HTMLElement | null if (!detailPanel) return false diff --git a/frontend/src/components/MediaDetail.vue b/frontend/src/components/MediaDetail.vue index 531aa10..6ae176c 100644 --- a/frontend/src/components/MediaDetail.vue +++ b/frontend/src/components/MediaDetail.vue @@ -3,12 +3,14 @@ @@ -225,6 +227,7 @@ import { const props = defineProps<{ item: MediaItem + allMovies: MovieUi[] focusEpisode?: { seasonNumber: number; episodeNumber: number } | null hasResumePosition: (filePath: string | null) => boolean getRootName: (rootId: string | null | undefined) => string | null @@ -234,6 +237,7 @@ const emit = defineEmits<{ play: [string] openFolder: [string, string | null | undefined] searchActor: [string] + selectMovie: [string] }>() // Track expanded episode for showing multiple releases @@ -747,6 +751,10 @@ function handleCastSelect(castName: string) { emit("searchActor", name) } +function handleSelectMovie(movieId: string) { + emit("selectMovie", movieId) +} + onMounted(() => { document.addEventListener("keydown", handleMovieMenuKeydown, true) }) diff --git a/frontend/src/components/SeriesFullView.vue b/frontend/src/components/SeriesFullView.vue index bc2be66..31a0c6d 100644 --- a/frontend/src/components/SeriesFullView.vue +++ b/frontend/src/components/SeriesFullView.vue @@ -130,6 +130,35 @@ + +
+

Related Movies In Library

+
+ +
+
@@ -184,7 +213,7 @@