import { Suspense } from 'react'; import VideoPlayer from './VideoPlayer'; import Link from 'next/link'; import WatchActions from './WatchActions'; import SubscribeButton from '../components/SubscribeButton'; import RelatedVideos from './RelatedVideos'; import { API_BASE } from '../constants'; interface VideoInfo { title: string; description: string; uploader: string; channel_id: string; view_count: number; thumbnail?: string; } async function getVideoInfo(id: string): Promise { try { const res = await fetch(`${API_BASE}/api/get_stream_info?v=${id}`, { cache: 'no-store' }); if (!res.ok) return null; const data = await res.json(); return { title: data.title || `Video ${id}`, description: data.description || '', uploader: data.uploader || 'Unknown', channel_id: data.channel_id || '', view_count: data.view_count || 0, thumbnail: data.thumbnail || `https://i.ytimg.com/vi/${id}/hqdefault.jpg`, }; } catch (e) { console.error(e); return null; } } function formatNumber(num: number): string { if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M'; if (num >= 1000) return (num / 1000).toFixed(0) + 'K'; return num.toString(); } export default async function WatchPage({ searchParams, }: { searchParams: Promise<{ [key: string]: string | string[] | undefined }> }) { const awaitParams = await searchParams; const v = awaitParams.v as string; if (!v) { return
No video ID provided
; } const info = await getVideoInfo(v); return (

{info?.title || `Video ${v}`}

{info && (
{info.uploader}
)} {info && (
{formatNumber(info.view_count)} views
{info.description || 'No description available.'}
)}
}>
); }