首页增加tmdb热门轮播图
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user