/* eslint-disable @typescript-eslint/no-explicit-any, no-console */ 'use client'; import { Search, X } from 'lucide-react'; import Image from 'next/image'; import { useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { getTMDBImageUrl } from '@/lib/tmdb.search'; import { processImageUrl } from '@/lib/utils'; interface TMDBResult { id: number; title?: string; name?: string; poster_path: string | null; release_date?: string; first_air_date?: string; overview: string; vote_average: number; media_type: 'movie' | 'tv'; } interface TMDBSeason { id: number; name: string; season_number: number; episode_count: number; air_date: string | null; poster_path: string | null; overview: string; } interface CorrectDialogProps { isOpen: boolean; onClose: () => void; videoKey: string; currentTitle: string; onCorrect: () => void; } export default function CorrectDialog({ isOpen, onClose, videoKey, currentTitle, onCorrect, }: CorrectDialogProps) { const [searchQuery, setSearchQuery] = useState(currentTitle); const [searching, setSearching] = useState(false); const [results, setResults] = useState([]); const [error, setError] = useState(''); const [correcting, setCorrecting] = useState(false); // 季度选择相关状态 const [selectedResult, setSelectedResult] = useState(null); const [seasons, setSeasons] = useState([]); const [loadingSeasons, setLoadingSeasons] = useState(false); const [showSeasonSelection, setShowSeasonSelection] = useState(false); useEffect(() => { if (isOpen) { setSearchQuery(currentTitle); setResults([]); setError(''); setSelectedResult(null); setSeasons([]); setShowSeasonSelection(false); } }, [isOpen, currentTitle]); const handleSearch = async () => { if (!searchQuery.trim()) { setError('请输入搜索关键词'); return; } setSearching(true); setError(''); setResults([]); setShowSeasonSelection(false); setSelectedResult(null); try { const response = await fetch( `/api/tmdb/search?query=${encodeURIComponent(searchQuery)}` ); if (!response.ok) { throw new Error('搜索失败'); } const data = await response.json(); if (data.success && data.results) { setResults(data.results); if (data.results.length === 0) { setError('未找到匹配的结果'); } } else { setError('搜索失败'); } } catch (err) { console.error('搜索失败:', err); setError('搜索失败,请重试'); } finally { setSearching(false); } }; // 获取电视剧的季度列表 const fetchSeasons = async (tvId: number) => { setLoadingSeasons(true); setError(''); try { const response = await fetch(`/api/tmdb/seasons?tvId=${tvId}`); if (!response.ok) { throw new Error('获取季度列表失败'); } const data = await response.json(); if (data.success && data.seasons) { return data.seasons as TMDBSeason[]; } else { setError('获取季度列表失败'); return []; } } catch (err) { console.error('获取季度列表失败:', err); setError('获取季度列表失败,请重试'); return []; } finally { setLoadingSeasons(false); } }; // 处理选择结果(电影直接纠错,电视剧显示季度选择) const handleSelectResult = async (result: TMDBResult) => { if (result.media_type === 'tv') { // 电视剧:先获取季度列表 setSelectedResult(result); const seasonsList = await fetchSeasons(result.id); if (seasonsList.length === 1) { // 只有一季,直接使用该季度进行纠错 await handleCorrect(result, seasonsList[0]); } else if (seasonsList.length > 1) { // 多季,显示选择界面 setSeasons(seasonsList); setShowSeasonSelection(true); } else { // 没有季度信息,直接使用剧集信息 await handleCorrect(result); } } else { // 电影:直接纠错 await handleCorrect(result); } }; // 处理选择季度 const handleSelectSeason = async (season: TMDBSeason) => { if (!selectedResult) return; await handleCorrect(selectedResult, season); }; // 执行纠错 const handleCorrect = async (result: TMDBResult, season?: TMDBSeason) => { setCorrecting(true); try { // 构建标题和ID:如果是第二季及以后,在标题后加上季度名称,并使用季度ID let finalTitle = result.title || result.name; let finalTmdbId = result.id; if (season && season.season_number > 1) { finalTitle = `${finalTitle} ${season.name}`; } const body: any = { key: videoKey, tmdbId: finalTmdbId, title: finalTitle, posterPath: season?.poster_path || result.poster_path, releaseDate: season?.air_date || result.release_date || result.first_air_date, overview: season?.overview || result.overview, voteAverage: result.vote_average, mediaType: result.media_type, }; // 如果有季度信息,添加到请求中 if (season) { body.seasonNumber = season.season_number; body.seasonName = season.name; } const response = await fetch('/api/openlist/correct', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }); if (!response.ok) { throw new Error('纠错失败'); } onCorrect(); onClose(); } catch (err) { console.error('纠错失败:', err); setError('纠错失败,请重试'); } finally { setCorrecting(false); } }; // 返回搜索结果列表 const handleBackToResults = () => { setShowSeasonSelection(false); setSelectedResult(null); setSeasons([]); }; if (!isOpen) return null; return createPortal(
{/* 头部 */}

纠错:{currentTitle}

{/* 搜索框 */}
setSearchQuery(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { handleSearch(); } }} placeholder='输入搜索关键词' className='flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent' />
{error && (

{error}

)}
{/* 结果列表 */}
{showSeasonSelection ? ( // 季度选择界面
{selectedResult && (

{selectedResult.title || selectedResult.name}

请选择季度:

)} {loadingSeasons ? (
加载季度列表中...
) : seasons.length === 0 ? (
未找到季度信息
) : (
{seasons.map((season) => (
{/* 海报 */}
{season.poster_path ? ( {season.name} ) : (
无海报
)}
{/* 信息 */}

{season.name}

{season.episode_count} 集 {season.air_date && ` • ${season.air_date.split('-')[0]}`}

{season.overview || '暂无简介'}

{/* 选择按钮 */}
))}
)}
) : results.length === 0 ? ( // 空状态
{searching ? '搜索中...' : '请输入关键词搜索'}
) : ( // 搜索结果列表
{results.map((result) => (
{/* 海报 */}
{result.poster_path ? ( {result.title ) : (
无海报
)}
{/* 信息 */}

{result.title || result.name}

{result.media_type === 'movie' ? '电影' : '电视剧'} •{' '} {result.release_date?.split('-')[0] || result.first_air_date?.split('-')[0] || '未知'}{' '} • 评分: {result.vote_average.toFixed(1)}

{result.overview || '暂无简介'}

{/* 选择按钮 */}
))}
)}
, document.body ); }