import { isRemoteEmbyID } from '../utils/remoteEmby' import { Link } from 'react-router-dom' import { ArrowLeft, Database, FileText, Film, FolderInput, Pencil, Play, Search, Sparkles, Trash2 } from 'lucide-react' import { imageURL } from '../api/client' import { ExternalPlayerButton } from '../components/ExternalPlayerButton' import { MediaFavouriteButton } from '../components/MediaFavouriteButton' import type { Media } from '../types' import { isTheatricalFeature, seriesTitle, type SeriesCard } from '../utils/groupSeries' type LibrarySeriesDetailHeaderProps = { series: SeriesCard allEpisodes: Media[] playbackFrom: string isAdmin: boolean canFavorite: boolean favourite: boolean favouriteBusy: boolean onToggleFavourite: () => void seriesToolBusy: string onBack: () => void onSmartScrape: () => void onManualScrape: () => void onMetadataEdit: () => void onProbe: () => void onNFO: () => void onOrganize: () => void onDelete: () => void } export function LibrarySeriesDetailHeader({ series, allEpisodes, playbackFrom, isAdmin, canFavorite, favourite, favouriteBusy, onToggleFavourite, seriesToolBusy, onBack, onSmartScrape, onManualScrape, onMetadataEdit, onProbe, onNFO, onOrganize, onDelete, }: LibrarySeriesDetailHeaderProps) { const tvEpisodes = allEpisodes.filter((media) => !isTheatricalFeature(media)) const theatricalCount = allEpisodes.length - tvEpisodes.length const firstEpisode = firstPlayableEpisode(tvEpisodes) return ( <>

{seriesTitle(series.rep)}

共 {tvEpisodes.length} 集{theatricalCount > 0 ? ` · ${theatricalCount} 部剧场版` : ''}
{series.rep.poster_url ? ( {series.rep.title} ) : (
)}

{series.rep.overview || '暂无简介'}

{firstEpisode && ( <> 从第一集开始播放 )} {canFavorite && ( )}
{isAdmin && allEpisodes.length > 0 && !isRemoteEmbyID(series.rep.id) && (

系统后台高级控制面板

)}
) } function firstPlayableEpisode(episodes: Media[]): Media | null { const sorted = [...episodes] sorted.sort((a, b) => (a.season_num || 0) - (b.season_num || 0) || (a.episode_num || 0) - (b.episode_num || 0), ) return sorted[0] ?? null }