正在加载视频详情...
'use client'; import { Suspense, useEffect } from 'react'; import { useSearchParams, useRouter } from 'next/navigation'; import { Button } from '@/components/ui/Button'; import { VideoPlayer } from '@/components/player/VideoPlayer'; import { VideoMetadata } from '@/components/player/VideoMetadata'; import { EpisodeList } from '@/components/player/EpisodeList'; import { PlayerError } from '@/components/player/PlayerError'; import { useVideoPlayer } from '@/lib/hooks/useVideoPlayer'; import { useHistoryStore } from '@/lib/store/history-store'; import { WatchHistorySidebar } from '@/components/history/WatchHistorySidebar'; import { FavoritesSidebar } from '@/components/favorites/FavoritesSidebar'; import { FavoriteButton } from '@/components/favorites/FavoriteButton'; import { PlayerNavbar } from '@/components/player/PlayerNavbar'; import Image from 'next/image'; function PlayerContent() { const searchParams = useSearchParams(); const router = useRouter(); const { addToHistory } = useHistoryStore(); const videoId = searchParams.get('id'); const source = searchParams.get('source'); const title = searchParams.get('title'); const episodeParam = searchParams.get('episode'); // Redirect if no video ID or source if (!videoId || !source) { router.push('/'); return null; } const { videoData, loading, videoError, currentEpisode, playUrl, setCurrentEpisode, setPlayUrl, setVideoError, fetchVideoDetails, } = useVideoPlayer(videoId, source, episodeParam); // Add initial history entry when video data is loaded useEffect(() => { if (videoData && playUrl && videoId) { // Map episodes to include index const mappedEpisodes = videoData.episodes?.map((ep, idx) => ({ name: ep.name || `第${idx + 1}集`, url: ep.url, index: idx, })) || []; addToHistory( videoId, videoData.vod_name || title || '未知视频', playUrl, currentEpisode, source, 0, // Initial playback position 0, // Will be updated by VideoPlayer videoData.vod_pic, mappedEpisodes ); } }, [videoData, playUrl, videoId, currentEpisode, source, title, addToHistory]); const handleEpisodeClick = (episode: any, index: number) => { setCurrentEpisode(index); setPlayUrl(episode.url); setVideoError(''); // Update URL to reflect current episode const params = new URLSearchParams(searchParams.toString()); params.set('episode', index.toString()); router.replace(`/player?${params.toString()}`, { scroll: false }); }; // Handle auto-next episode const handleNextEpisode = () => { const episodes = videoData?.episodes; if (!episodes || currentEpisode >= episodes.length - 1) return; const nextIndex = currentEpisode + 1; const nextEpisode = episodes[nextIndex]; if (nextEpisode) { handleEpisodeClick(nextEpisode, nextIndex); } }; return (
正在加载视频详情...