import { ArrowLeft, Heart, Play, RefreshCw } from 'lucide-react' import { Link } from 'react-router-dom' import { PageBackButton } from '../components/PageBackButton' import { ExternalPlayerButton } from '../components/ExternalPlayerButton' import { ManualScrapeDialog } from '../components/ManualScrapeDialog' import { MetadataEditDialog } from '../components/MetadataEditDialog' import { OrganizeMediaDialog } from '../components/OrganizeMediaDialog' import type { Media } from '../types' import { isDirectStreamMedia } from './playerPageModel' import { MediaDetailAdminPanel } from './MediaDetailAdminPanel' import { MediaDetailPoster } from './MediaDetailArtwork' import { MediaDetailMetadata } from './MediaDetailMetadata' import { mediaDetailScrapeMediaType } from './MediaDetailPageModel' interface MediaDetailPlaybackActionsProps { media: Media favourite: boolean onToggleFavourite: () => void playTargetId?: string } interface MediaDetailMainContentProps extends MediaDetailPlaybackActionsProps { isAdmin: boolean scrapeEpisodeArtwork: boolean onScrapeEpisodeArtworkChange: (checked: boolean) => void onSmartScrape: () => void onManualScrape: () => void onMetadataEdit: () => void onOrganize: () => void onProbe: () => void onExportNFO: () => void onDelete: () => void } interface MediaDetailDialogsProps { media: Media manualScrapeOpen: boolean metadataEditOpen: boolean organizeOpen: boolean scrapeEpisodeArtwork: boolean onManualScrapeClose: () => void onMetadataEditClose: () => void onOrganizeClose: () => void onManualScrapeApplied: () => void onMetadataSaved: (media: Media) => void | Promise onOrganized: () => void } interface MediaDetailManualScrapeDialogProps { open: boolean media: Media episodeArtwork: boolean onClose: () => void onApplied: () => void } export function MediaDetailLoading() { return (
) } export function MediaDetailMissing() { return (

媒体资源已被移除或不存在

) } export function MediaDetailBackButton({ onBack }: { onBack: () => void }) { return (
) } export function MediaDetailPlaybackActions({ media, favourite, onToggleFavourite, playTargetId, }: MediaDetailPlaybackActionsProps) { const targetId = media.id || playTargetId || '' return (
立即播放 {!isDirectStreamMedia(media) && ( HLS 兼容转码播放 )}
) } export function MediaDetailMainContent({ media, isAdmin, favourite, playTargetId, scrapeEpisodeArtwork, onToggleFavourite, onScrapeEpisodeArtworkChange, onSmartScrape, onManualScrape, onMetadataEdit, onOrganize, onProbe, onExportNFO, onDelete, }: MediaDetailMainContentProps) { return (
{isAdmin && ( )}
) } export function MediaDetailDialogs({ media, manualScrapeOpen, metadataEditOpen, organizeOpen, scrapeEpisodeArtwork, onManualScrapeClose, onMetadataEditClose, onOrganizeClose, onManualScrapeApplied, onMetadataSaved, onOrganized, }: MediaDetailDialogsProps) { return ( <> ) } function MediaDetailManualScrapeDialog({ open, media, episodeArtwork, onClose, onApplied, }: MediaDetailManualScrapeDialogProps) { return ( ) }