import type { ReactNode } from 'react' import { Link } from 'react-router-dom' import { motion } from 'framer-motion' import { ArrowRight, Film, FolderOpen, Library as LibraryIcon, Music, PlayCircle, RefreshCw, Tv } from 'lucide-react' import { imageURL } from '../api/client' import { EpisodeArtworkToggle } from '../components/EpisodeArtworkToggle' import { MediaCard } from '../components/MediaCard' import { seriesCardLink } from '../utils/groupSeries' import { libraryDisplayPath } from './libraryDisplayModel' import { libraryArtworkItems, type LibraryPreview } from './librariesPageModel' const TYPE_ICONS: Record = { movie: , tv: , anime: , variety: , music: , adult: , } const TYPE_LABELS: Record = { movie: '电影', tv: '剧集', anime: '动漫', variety: '综艺', music: '音乐', adult: '成人', } export function LibrariesHeader({ previewCount, total, repairMsg, repairEpisodeArtwork, repairing, onRepairEpisodeArtworkChange, onRepairRescrape, onManageLibraries, }: { previewCount: number total: number repairMsg: string repairEpisodeArtwork: boolean repairing: boolean onRepairEpisodeArtworkChange: (value: boolean) => void onRepairRescrape: () => void onManageLibraries: () => void }) { return (

媒体库

共 {previewCount} 个目录 · {total.toLocaleString()} 个条目。每个目录直接展示最新入库内容。

{repairMsg && {repairMsg}}
) } export function LibrariesEmptyState() { return (

暂无媒体库,请到管理后台添加目录。

) } export function LibrariesContent({ previews }: { previews: LibraryPreview[] }) { return ( <>

媒体库入口

按目录进入完整媒体库;下方每个目录也会直接展示最新内容。

{previews.map((preview, index) => ( ))}
{previews.map((preview, index) => ( ))}
) } function LibraryEntryCard({ preview }: { preview: LibraryPreview }) { const library = preview.library const artwork = library.cover_url ? [{ src: library.cover_url, version: library.updated_at }] : libraryArtworkItems(preview.cards) const displayPath = libraryDisplayPath(library.path) return (
1 ? 'grid-cols-2' : 'grid-cols-1'}`}> {artwork.length > 0 ? ( artwork.map(({ src, version }, index) => ( { event.currentTarget.style.visibility = 'hidden' }} /> )) ) : (
{TYPE_ICONS[library.type] ?? }
)}
{TYPE_LABELS[library.type] ?? library.type}

{library.name}

{displayPath}

{preview.total.toLocaleString()} 个条目 浏览全部
) } function LibraryShelf({ preview }: { preview: LibraryPreview }) { const library = preview.library const cards = preview.cards.slice(0, 10) const displayPath = libraryDisplayPath(library.path) return (
{TYPE_ICONS[library.type] ?? } {TYPE_LABELS[library.type] ?? library.type}

{library.name}

{displayPath} · {preview.total.toLocaleString()} 个条目 · 最新 {cards.length} 部

浏览全部
{cards.length > 0 ? (
{cards.map((card) => (
))}
) : (
该目录暂无可展示内容,扫描媒体库后会出现在这里。
)}
) }