首页增加tmdb热门轮播图

This commit is contained in:
mtvpls
2025-12-27 11:37:43 +08:00
parent e071d6fff2
commit c961d0999c
4 changed files with 466 additions and 1 deletions
+114
View File
@@ -26,10 +26,12 @@ export interface TMDBItem {
id: number;
title: string;
poster_path: string | null;
backdrop_path?: string | null; // 背景图,用于轮播图
release_date: string;
overview: string;
vote_average: number;
media_type: 'movie' | 'tv';
genre_ids?: number[]; // 类型ID列表
}
interface TMDBUpcomingResponse {
@@ -229,6 +231,70 @@ export async function getTMDBUpcomingContent(
}
}
/**
* 获取热门内容(电影+电视剧)
* @param apiKey - TMDB API Key
* @param proxy - 代理服务器地址
* @returns 热门内容列表
*/
export async function getTMDBTrendingContent(
apiKey: string,
proxy?: string
): Promise<{ code: number; list: TMDBItem[] }> {
try {
if (!apiKey) {
return { code: 400, list: [] };
}
// 获取本周热门内容(电影+电视剧)
const url = `https://api.themoviedb.org/3/trending/all/week?api_key=${apiKey}&language=zh-CN`;
const fetchOptions: any = proxy
? {
agent: new HttpsProxyAgent(proxy, {
timeout: 30000,
keepAlive: false,
}),
signal: AbortSignal.timeout(30000),
}
: {
signal: AbortSignal.timeout(15000),
};
const response = await nodeFetch(url, fetchOptions);
if (!response.ok) {
console.error('TMDB Trending API 请求失败:', response.status, response.statusText);
return { code: response.status, list: [] };
}
const data: any = await response.json();
// 转换为统一格式,只保留有backdrop_path的项目(用于轮播图)
const items: TMDBItem[] = data.results
.filter((item: any) => item.backdrop_path) // 只保留有背景图的
.slice(0, 10) // 只取前10个
.map((item: any) => ({
id: item.id,
title: item.title || item.name,
poster_path: item.poster_path,
backdrop_path: item.backdrop_path, // 添加背景图
release_date: item.release_date || item.first_air_date || '',
overview: item.overview,
vote_average: item.vote_average,
media_type: item.media_type as 'movie' | 'tv',
genre_ids: item.genre_ids || [], // 保存类型ID
}));
return {
code: 200,
list: items,
};
} catch (error) {
console.error('获取 TMDB 热门内容失败:', error);
return { code: 500, list: [] };
}
}
/**
* 获取 TMDB 图片完整 URL
* @param path - 图片路径
@@ -242,3 +308,51 @@ export function getTMDBImageUrl(
if (!path) return '';
return `https://image.tmdb.org/t/p/${size}${path}`;
}
/**
* TMDB 类型映射(中文)
*/
export const TMDB_GENRES: Record<number, string> = {
// 电影类型
28: '动作',
12: '冒险',
16: '动画',
35: '喜剧',
80: '犯罪',
99: '纪录',
18: '剧情',
10751: '家庭',
14: '奇幻',
36: '历史',
27: '恐怖',
10402: '音乐',
9648: '悬疑',
10749: '爱情',
878: '科幻',
10770: '电视电影',
53: '惊悚',
10752: '战争',
37: '西部',
// 电视剧类型
10759: '动作冒险',
10762: '儿童',
10763: '新闻',
10764: '真人秀',
10765: '科幻奇幻',
10766: '肥皂剧',
10767: '脱口秀',
10768: '战争政治',
};
/**
* 根据类型ID获取类型名称列表
* @param genreIds - 类型ID数组
* @param limit - 最多返回几个类型,默认2个
* @returns 类型名称数组
*/
export function getGenreNames(genreIds: number[] = [], limit: number = 2): string[] {
return genreIds
.map(id => TMDB_GENRES[id])
.filter(Boolean)
.slice(0, limit);
}