import { useState } from 'react' import { useLocation, useParams, useSearchParams } from 'react-router-dom' import { motion, AnimatePresence } from 'framer-motion' import type { Media } from '../types' import { useAuthStore } from '../stores/auth' import { seriesTitle, type SeriesCard } from '../utils/groupSeries' import { ManualScrapeDialog } from '../components/ManualScrapeDialog' import { MetadataEditDialog } from '../components/MetadataEditDialog' import { LibrarySeriesEpisodes } from './LibrarySeriesEpisodes' import { LibrarySeriesDetailHeader } from './LibrarySeriesDetailHeader' import { LibraryPageHeader } from './LibraryPageHeader' import { LibraryMediaSections } from './LibraryMediaSections' import { useLibraryData } from './useLibraryData' import { useLibraryScanStatus } from './useLibraryScanStatus' import { useLibrarySeriesSelection } from './useLibrarySeriesSelection' import { useLibraryAdminActions } from './useLibraryAdminActions' export function LibraryPage() { const { id = '' } = useParams() const [searchParams, setSearchParams] = useSearchParams() const location = useLocation() const role = useAuthStore((s) => s.user?.role) const [manualSeriesScrapeOpen, setManualSeriesScrapeOpen] = useState(false) const [seriesMetadataEditOpen, setSeriesMetadataEditOpen] = useState(false) const [manualMovie, setManualMovie] = useState(null) // 剧集模式:选中某个剧集后展开详情 const [selectedSeries, setSelectedSeries] = useState(null) const [selectedSeason, setSelectedSeason] = useState(null) const { library, items, seriesEpisodeItems, total, loading, loadingSeriesEpisodes, isSeriesLibrary, isSeries, seriesCards, loadingAllText, reloadCurrentLibrary, } = useLibraryData(id, selectedSeries) const { scanning, scanProgress, handleScan, } = useLibraryScanStatus({ libraryID: id, isAdmin: role === 'admin', onLibraryChanged: reloadCurrentLibrary, }) const { selectedEpisodes, visibleEpisodes, selectedSeriesEpisodes, selectedSeriesMediaIDs, handleSeriesClick, clearSelectedSeries, } = useLibrarySeriesSelection({ items, seriesEpisodeItems, isSeriesLibrary, isSeries, loading, seriesCards, searchParams, setSearchParams, selectedSeries, setSelectedSeries, selectedSeason, setSelectedSeason, onClearSeriesState: () => setSeriesMetadataEditOpen(false), }) const { scraping, scrapeEpisodeArtwork, repairing, seriesToolBusy, setScrapeEpisodeArtwork, handleScrape, handleRepairRescrape, handleSeriesSmartScrape, handleSeriesProbe, handleSeriesNFO, handleSeriesOrganize, handleSeriesSoftDelete, movieActions, } = useLibraryAdminActions({ libraryID: id, role, library, selectedSeries, selectedSeriesEpisodes, reloadCurrentLibrary, clearSelectedSeries, setManualMovie, }) if (loading) { return (
加载中…
) } return (
{/* 剧集详情:季/集选择器 */} {selectedSeries && ( setManualSeriesScrapeOpen(true)} onMetadataEdit={() => setSeriesMetadataEditOpen(true)} onProbe={handleSeriesProbe} onNFO={handleSeriesNFO} onOrganize={handleSeriesOrganize} onSoftDelete={handleSeriesSoftDelete} /> {/* 季 / 集列表 */}
)}
setManualSeriesScrapeOpen(false)} onApplied={reloadCurrentLibrary} /> setSeriesMetadataEditOpen(false)} onSaved={reloadCurrentLibrary} /> setManualMovie(null)} onApplied={reloadCurrentLibrary} />
) } function scrapeMediaType(libraryType: string | undefined, media: Media): string { if ((media.season_num ?? 0) > 0 || (media.episode_num ?? 0) > 0) { return 'tv' } return libraryType || 'movie' }