import { useState } from 'react' import { useLocation, useParams, useSearchParams } from 'react-router-dom' import { motion } from 'framer-motion' import type { Media } from '../types' import { useAuthStore } from '../stores/auth' import type { SeriesCard } from '../utils/groupSeries' import { LibraryPageDialogs } from './LibraryPageDialogs' import { LibraryPageHeader } from './LibraryPageHeader' import { LibraryMediaSections } from './LibraryMediaSections' import { LibrarySeriesDetailSection } from './LibrarySeriesDetailSection' 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 [scrapeDialogOpen, setScrapeDialogOpen] = useState(false) 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, handleRepairRescrape, handleSeriesSmartScrape, handleSeriesProbe, handleSeriesNFO, handleSeriesOrganize, handleSeriesSoftDelete, movieActions, } = useLibraryAdminActions({ libraryID: id, role, library, selectedSeries, selectedSeriesEpisodes, reloadCurrentLibrary, clearSelectedSeries, setManualMovie, }) if (loading) { return (
加载中…
) } return (
setScrapeDialogOpen(true)} onRepairRescrape={handleRepairRescrape} /> setManualSeriesScrapeOpen(true)} onMetadataEdit={() => setSeriesMetadataEditOpen(true)} onProbe={handleSeriesProbe} onNFO={handleSeriesNFO} onOrganize={handleSeriesOrganize} onSoftDelete={handleSeriesSoftDelete} onSeasonChange={setSelectedSeason} /> setScrapeDialogOpen(false)} onCloseManualSeriesScrape={() => setManualSeriesScrapeOpen(false)} onCloseSeriesMetadataEdit={() => setSeriesMetadataEditOpen(false)} onCloseManualMovie={() => setManualMovie(null)} onApplied={reloadCurrentLibrary} />
) }