first commit

This commit is contained in:
gotolombok
2026-01-31 17:21:32 +08:00
commit f839fbd63a
109 changed files with 19204 additions and 0 deletions

97
app/trending/page.tsx Normal file
View File

@@ -0,0 +1,97 @@
import { getTrending, Subject, TrendingResponse } from '@/lib/api';
import { getDracinRecommend, DramaboxItem } from '@/lib/dramabox';
import MovieCard from '@/components/MovieCard';
import Link from 'next/link';
export const revalidate = 3600;
export default async function TrendingPage({ searchParams }: { searchParams: Promise<{ page?: string }> }) {
const { page: pageParam } = await searchParams;
const page = parseInt(pageParam || "1", 10);
let trendingData: TrendingResponse = { subjectList: [], pager: { hasMore: false, nextPage: "1", page: "0", perPage: 0, totalCount: 0 } };
let dracinData: DramaboxItem[] = [];
try {
const [trendingRes, dracinRes] = await Promise.all([
getTrending(page),
getDracinRecommend(page, 20)
]);
trendingData = trendingRes;
dracinData = dracinRes;
} catch (e) {
console.error("Failed to fetch trending:", e);
}
const { subjectList, pager } = trendingData;
// Map Dracin Data to Subject
const dracinSubjects: Subject[] = dracinData.map(d => ({
subjectId: d.id.toString(),
subjectType: 3,
title: d.name,
description: d.introduction,
releaseDate: "",
genre: d.tags.join(", "),
cover: { url: d.cover, width: 300, height: 450 },
image: { url: d.cover, width: 300, height: 450 },
countryName: "China",
imdbRatingValue: "N/A",
detailPath: `/dracin/${d.id}`,
isDracin: true
}));
// Interleave or merge lists
// Simple merge: [...subjectList, ...dracinSubjects]
// Or interleave for better diversity
const combinedList: Subject[] = [];
const maxLength = Math.max(subjectList.length, dracinSubjects.length);
for (let i = 0; i < maxLength; i++) {
if (i < subjectList.length) combinedList.push(subjectList[i]);
if (i < dracinSubjects.length) combinedList.push(dracinSubjects[i]);
}
return (
<div className="min-h-screen pt-24 px-4 md:px-16" >
<h1 className="text-3xl font-bold text-white mb-8">Trending Now</h1>
{combinedList.length === 0 ? (
<div className="text-gray-500">No trending content found.</div>
) : (
<>
<div className="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-4 mb-12">
{combinedList.map((movie) => (
<MovieCard key={`${movie.isDracin ? 'd' : 'm'}-${movie.subjectId}`} movie={movie} />
))}
</div>
{/* Pagination */}
<div className="flex justify-center gap-4 pb-12">
{page > 1 && (
<Link
href={`/trending?page=${page - 1}`}
className="px-6 py-2 bg-gray-800 text-white rounded hover:bg-gray-700 transition"
>
Previous
</Link>
)}
<span className="px-4 py-2 text-gray-400 flex items-center">
Page {page}
</span>
{/* Use pager.hasMore from main API, effectively limiting Dracin nav to main API limits unless we want infinite dracin pages */}
{pager.hasMore && (
<Link
href={`/trending?page=${page + 1}`}
className="px-6 py-2 bg-primary text-white rounded hover:bg-red-700 transition"
>
Next
</Link>
)}
</div>
</>
)}
</div>
);
}