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 { artworkScore, seriesCardLink, type SeriesCard } from '../utils/groupSeries' import { mediaTime, type LibraryPreview } from './librariesPageModel' const TYPE_ICONS: Record = { movie: , tv: , anime: , variety: , music: , } const TYPE_LABELS: Record = { movie: '电影', tv: '剧集', anime: '动漫', variety: '综艺', music: '音乐', } export function LibrariesHeader({ previewCount, total, repairMsg, repairEpisodeArtwork, repairing, onRepairEpisodeArtworkChange, onRepairRescrape, }: { previewCount: number total: number repairMsg: string repairEpisodeArtwork: boolean repairing: boolean onRepairEpisodeArtworkChange: (value: boolean) => void onRepairRescrape: () => 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 = libraryArtworkItems(preview.cards) return (
{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}

{library.path}

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

{library.name}

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

浏览全部
{cards.length > 0 ? (
{cards.map((card) => (
))}
) : (
该目录暂无可展示内容,扫描媒体库后会出现在这里。
)}
) } function libraryArtworkItems(cards: SeriesCard[]): Array<{ src: string; version?: string }> { return [...cards] .sort((a, b) => artworkScore(b.rep) - artworkScore(a.rep) || mediaTime(b.rep) - mediaTime(a.rep)) .map((card) => ({ src: card.rep.poster_url || card.rep.backdrop_url || '', version: card.rep.updated_at, })) .filter((item) => Boolean(item.src)) .slice(0, 4) }