/* eslint-disable react-hooks/exhaustive-deps, no-console */ 'use client'; import Image from 'next/image'; import { useRouter, useSearchParams } from 'next/navigation'; import { Suspense, useEffect, useState } from 'react'; import PageLayout from '@/components/PageLayout'; interface SearchResult { id: string; title: string; poster: string; episodes: string[]; source: string; source_name: string; class?: string; year: string; desc?: string; type_name?: string; } function AggregatePageClient() { const searchParams = useSearchParams(); const query = searchParams.get('q')?.trim() || ''; const title = searchParams.get('title')?.trim() || ''; const year = searchParams.get('year')?.trim() || ''; const [results, setResults] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const router = useRouter(); useEffect(() => { if (!query) { setError('缺少搜索关键词'); setLoading(false); return; } const fetchData = async () => { try { const res = await fetch(`/api/search?q=${encodeURIComponent(query)}`); if (!res.ok) { throw new Error('搜索失败'); } const data = await res.json(); const all: SearchResult[] = data.results || []; const map = new Map(); all.forEach((r) => { // 根据传入参数进行精确匹配: // 1. 如果提供了 title,则按 title 精确匹配,否则按 query 精确匹配; // 2. 如果还提供了 year,则额外按 year 精确匹配。 const titleMatch = title ? r.title === title : r.title === query; const yearMatch = year ? r.year === year : true; if (!titleMatch || !yearMatch) { return; } const key = `${r.title}-${r.year}`; const arr = map.get(key) || []; arr.push(r); map.set(key, arr); }); if (map.size == 1) { setResults(Array.from(map.values()).flat()); } else if (map.size > 1) { // 存在多个匹配,跳转到搜索页 router.push(`/search?q=${encodeURIComponent(query)}`); } } catch (e) { setError(e instanceof Error ? e.message : '搜索失败'); } finally { setLoading(false); } }; fetchData(); }, [query, router]); // 选出信息最完整的字段 const chooseString = (vals: (string | undefined)[]): string | undefined => { return vals.reduce((best, v) => { if (!v) return best; if (!best) return v; return v.length > best.length ? v : best; }, undefined); }; const aggregatedInfo = { title: title || query, cover: chooseString(results.map((d) => d.poster)), desc: chooseString(results.map((d) => d.desc)), type: chooseString(results.map((d) => d.type_name)), year: chooseString(results.map((d) => d.year)), remarks: chooseString(results.map((d) => d.class)), }; const infoReady = Boolean( aggregatedInfo.cover || aggregatedInfo.desc || aggregatedInfo.type || aggregatedInfo.year || aggregatedInfo.remarks ); const uniqueSources = Array.from( new Map(results.map((r) => [r.source, r])).values() ); // 详情映射,便于快速获取每个源的集数 const sourceDetailMap = new Map(results.map((d) => [d.source, d])); return (
{loading ? (
) : error ? (
加载失败
{error}
) : !infoReady ? (
未找到匹配结果
) : (
{/* 主信息区:左图右文 */}
{/* 返回按钮 */} {/* 封面 */}
{aggregatedInfo.title}
{/* 右侧信息 */}

{aggregatedInfo.title}

{aggregatedInfo.remarks && ( {aggregatedInfo.remarks} )} {aggregatedInfo.year && {aggregatedInfo.year}} {aggregatedInfo.type && {aggregatedInfo.type}}
{aggregatedInfo.desc}
{/* 选播放源 */} {uniqueSources.length > 0 && (
选择播放源
共 {uniqueSources.length} 个
{uniqueSources.map((src) => { const d = sourceDetailMap.get(src.source); const epCount = d ? d.episodes.length : src.episodes.length; return ( {/* 名称 */} {src.source_name} {/* 集数徽标 */} {epCount && epCount > 1 ? ( {epCount}集 ) : null} ); })}
)}
)}
); } export default function AggregatePage() { return ( ); }