@@ -216,7 +255,7 @@ export function LibraryPage() {
seriesCards={sortedSeriesCards}
selectedSeries={selectedSeries}
loading={loading}
- movieActions={movieActions}
+ cardActions={cardActions}
onSeriesClick={handleSeriesClick}
/>
@@ -229,6 +268,13 @@ export function LibraryPage() {
loadingEpisodes={loadingSeriesEpisodes}
playbackFrom={`${location.pathname}${location.search}`}
isAdmin={role === 'admin'}
+ canFavorite={canFavorite}
+ favourite={selectedSeries ? isFavourite(selectedSeries.rep.id) : false}
+ favouriteBusy={!!selectedSeries && favouriteBusyID === selectedSeries.rep.id}
+ onToggleFavourite={() => {
+ if (!selectedSeries) return
+ void handleToggleFavourite(selectedSeries.rep.id)
+ }}
seriesToolBusy={seriesToolBusy}
onBack={clearSelectedSeries}
onSmartScrape={handleSeriesSmartScrape}
diff --git a/web/src/pages/LibrarySeriesDetailHeader.tsx b/web/src/pages/LibrarySeriesDetailHeader.tsx
index 511d19c..6bd8543 100644
--- a/web/src/pages/LibrarySeriesDetailHeader.tsx
+++ b/web/src/pages/LibrarySeriesDetailHeader.tsx
@@ -4,6 +4,7 @@ import { ArrowLeft, Database, FileText, Film, FolderInput, Pencil, Play, Search,
import { imageURL } from '../api/client'
import { ExternalPlayerButton } from '../components/ExternalPlayerButton'
+import { MediaFavouriteButton } from '../components/MediaFavouriteButton'
import type { Media } from '../types'
import { seriesTitle, type SeriesCard } from '../utils/groupSeries'
@@ -13,6 +14,10 @@ type LibrarySeriesDetailHeaderProps = {
allEpisodes: Media[]
playbackFrom: string
isAdmin: boolean
+ canFavorite: boolean
+ favourite: boolean
+ favouriteBusy: boolean
+ onToggleFavourite: () => void
seriesToolBusy: string
onBack: () => void
onSmartScrape: () => void
@@ -30,6 +35,10 @@ export function LibrarySeriesDetailHeader({
allEpisodes,
playbackFrom,
isAdmin,
+ canFavorite,
+ favourite,
+ favouriteBusy,
+ onToggleFavourite,
seriesToolBusy,
onBack,
onSmartScrape,
@@ -75,15 +84,24 @@ export function LibrarySeriesDetailHeader({
{series.rep.overview || '暂无简介'}
- {firstEpisode && (
-
- )}
+
+ {firstEpisode && (
+ <>
+
+
+ 从第一集开始播放
+
+
+ >
+ )}
+ {canFavorite && (
+
+ )}
+
{isAdmin && allEpisodes.length > 0 && !isRemoteEmbyID(series.rep.id) && (
diff --git a/web/src/pages/LibrarySeriesDetailSection.tsx b/web/src/pages/LibrarySeriesDetailSection.tsx
index 3dd1966..d24ecee 100644
--- a/web/src/pages/LibrarySeriesDetailSection.tsx
+++ b/web/src/pages/LibrarySeriesDetailSection.tsx
@@ -19,6 +19,10 @@ type LibrarySeriesDetailSectionProps = {
loadingEpisodes: boolean
playbackFrom: string
isAdmin: boolean
+ canFavorite: boolean
+ favourite: boolean
+ favouriteBusy: boolean
+ onToggleFavourite: () => void
seriesToolBusy: string
onBack: () => void
onSmartScrape: () => void
@@ -40,6 +44,10 @@ export function LibrarySeriesDetailSection({
loadingEpisodes,
playbackFrom,
isAdmin,
+ canFavorite,
+ favourite,
+ favouriteBusy,
+ onToggleFavourite,
seriesToolBusy,
onBack,
onSmartScrape,
@@ -66,6 +74,10 @@ export function LibrarySeriesDetailSection({
allEpisodes={allEpisodes}
playbackFrom={playbackFrom}
isAdmin={isAdmin}
+ canFavorite={canFavorite}
+ favourite={favourite}
+ favouriteBusy={favouriteBusy}
+ onToggleFavourite={onToggleFavourite}
seriesToolBusy={seriesToolBusy}
onBack={onBack}
onSmartScrape={onSmartScrape}