From d772051213e025c8da25dd3cfe81efc4c710fb6e Mon Sep 17 00:00:00 2001 From: mtvpls Date: Wed, 4 Feb 2026 01:36:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86tmdb?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=9C=A8cloudflare=E4=B8=8B=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/tmdb/detail/route.ts | 41 +++++++------------------- src/app/api/tmdb/episodes/route.ts | 46 ++++++++++-------------------- src/app/api/tmdb/search/route.ts | 43 ++++++++-------------------- 3 files changed, 37 insertions(+), 93 deletions(-) diff --git a/src/app/api/tmdb/detail/route.ts b/src/app/api/tmdb/detail/route.ts index a12fc40..c13c991 100644 --- a/src/app/api/tmdb/detail/route.ts +++ b/src/app/api/tmdb/detail/route.ts @@ -1,12 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any, no-console */ -import { HttpsProxyAgent } from 'https-proxy-agent'; import { NextRequest, NextResponse } from 'next/server'; -import nodeFetch from 'node-fetch'; import { getAuthInfoFromCookie } from '@/lib/auth'; import { getConfig } from '@/lib/config'; -import { getNextApiKey } from '@/lib/tmdb.client'; +import { getTMDBMovieDetails, getTMDBTVDetails } from '@/lib/tmdb.client'; export const runtime = 'nodejs'; @@ -34,45 +32,26 @@ export async function GET(request: NextRequest) { const tmdbProxy = config.SiteConfig.TMDBProxy; const tmdbReverseProxy = config.SiteConfig.TMDBReverseProxy; - const actualKey = getNextApiKey(tmdbApiKey || ''); - if (!actualKey) { + if (!tmdbApiKey) { return NextResponse.json( { error: 'TMDB API Key 未配置' }, { status: 400 } ); } - // 使用反代代理或默认 Base URL - const baseUrl = tmdbReverseProxy || 'https://api.themoviedb.org'; - // 根据类型选择API端点 - const endpoint = type === 'movie' ? 'movie' : 'tv'; - const url = `${baseUrl}/3/${endpoint}/${id}?api_key=${actualKey}&language=zh-CN&append_to_response=credits`; + const response = + type === 'movie' + ? await getTMDBMovieDetails(tmdbApiKey, parseInt(id), tmdbProxy, tmdbReverseProxy) + : await getTMDBTVDetails(tmdbApiKey, parseInt(id), tmdbProxy, tmdbReverseProxy); - const fetchOptions: any = tmdbProxy - ? { - agent: new HttpsProxyAgent(tmdbProxy, { - timeout: 30000, - keepAlive: false, - }), - signal: AbortSignal.timeout(30000), - } - : { - signal: AbortSignal.timeout(15000), - }; - - const response = await nodeFetch(url, fetchOptions); - - if (!response.ok) { - console.error('TMDB 详情获取失败:', response.status, response.statusText); + if (response.code !== 200 || !response.details) { return NextResponse.json( - { error: 'TMDB 详情获取失败', code: response.status }, - { status: response.status } + { error: 'TMDB 详情获取失败', code: response.code }, + { status: response.code } ); } - const data: any = await response.json(); - - return NextResponse.json(data); + return NextResponse.json(response.details); } catch (error) { console.error('TMDB详情获取失败:', error); return NextResponse.json( diff --git a/src/app/api/tmdb/episodes/route.ts b/src/app/api/tmdb/episodes/route.ts index baab637..dc5d437 100644 --- a/src/app/api/tmdb/episodes/route.ts +++ b/src/app/api/tmdb/episodes/route.ts @@ -1,12 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any, no-console */ -import { HttpsProxyAgent } from 'https-proxy-agent'; import { NextRequest, NextResponse } from 'next/server'; -import nodeFetch from 'node-fetch'; import { getAuthInfoFromCookie } from '@/lib/auth'; import { getConfig } from '@/lib/config'; -import { getNextApiKey } from '@/lib/tmdb.client'; +import { getTVSeasonDetails } from '@/lib/tmdb.search'; export const runtime = 'nodejs'; @@ -38,36 +36,22 @@ export async function GET(request: NextRequest) { return NextResponse.json({ error: 'TMDB API Key 未配置' }, { status: 400 }); } - const actualKey = getNextApiKey(tmdbApiKey); - if (!actualKey) { - return NextResponse.json({ error: 'TMDB API Key 无效' }, { status: 400 }); + const response = await getTVSeasonDetails( + tmdbApiKey, + parseInt(id), + parseInt(season), + tmdbProxy, + tmdbReverseProxy + ); + + if (response.code !== 200 || !response.season) { + return NextResponse.json( + { error: '获取失败', code: response.code }, + { status: response.code } + ); } - // 使用反代代理或默认 Base URL - const baseUrl = tmdbReverseProxy || 'https://api.themoviedb.org'; - const url = `${baseUrl}/3/tv/${id}/season/${season}?api_key=${actualKey}&language=zh-CN`; - - const fetchOptions: any = tmdbProxy - ? { - agent: new HttpsProxyAgent(tmdbProxy, { - timeout: 30000, - keepAlive: false, - }), - signal: AbortSignal.timeout(30000), - } - : { - signal: AbortSignal.timeout(15000), - }; - - const response = await nodeFetch(url, fetchOptions); - - if (!response.ok) { - return NextResponse.json({ error: '获取失败' }, { status: response.status }); - } - - const data: any = await response.json(); - - return NextResponse.json(data); + return NextResponse.json(response.season); } catch (error) { console.error('获取集数详情失败:', error); return NextResponse.json( diff --git a/src/app/api/tmdb/search/route.ts b/src/app/api/tmdb/search/route.ts index 297b3e3..de14ac0 100644 --- a/src/app/api/tmdb/search/route.ts +++ b/src/app/api/tmdb/search/route.ts @@ -1,12 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any, no-console */ -import { HttpsProxyAgent } from 'https-proxy-agent'; import { NextRequest, NextResponse } from 'next/server'; -import nodeFetch from 'node-fetch'; import { getAuthInfoFromCookie } from '@/lib/auth'; import { getConfig } from '@/lib/config'; -import { getNextApiKey } from '@/lib/tmdb.client'; +import { searchTMDBMulti } from '@/lib/tmdb.client'; export const runtime = 'nodejs'; @@ -33,46 +31,29 @@ export async function GET(request: NextRequest) { const tmdbProxy = config.SiteConfig.TMDBProxy; const tmdbReverseProxy = config.SiteConfig.TMDBReverseProxy; - const actualKey = getNextApiKey(tmdbApiKey || ''); - if (!actualKey) { + if (!tmdbApiKey) { return NextResponse.json( { error: 'TMDB API Key 未配置' }, { status: 400 } ); } - // 使用反代代理或默认 Base URL - const baseUrl = tmdbReverseProxy || 'https://api.themoviedb.org'; - // 使用 multi search 同时搜索电影和电视剧 - const url = `${baseUrl}/3/search/multi?api_key=${actualKey}&language=zh-CN&query=${encodeURIComponent(query)}&page=1`; + const response = await searchTMDBMulti( + tmdbApiKey, + query, + tmdbProxy, + tmdbReverseProxy + ); - const fetchOptions: any = tmdbProxy - ? { - agent: new HttpsProxyAgent(tmdbProxy, { - timeout: 30000, - keepAlive: false, - }), - signal: AbortSignal.timeout(30000), - } - : { - signal: AbortSignal.timeout(15000), - }; - - // 使用 node-fetch 而不是原生 fetch - const response = await nodeFetch(url, fetchOptions); - - if (!response.ok) { - console.error('TMDB 搜索失败:', response.status, response.statusText); + if (response.code !== 200) { return NextResponse.json( - { error: 'TMDB 搜索失败', code: response.status }, - { status: response.status } + { error: 'TMDB 搜索失败', code: response.code }, + { status: response.code } ); } - const data: any = await response.json(); - // 过滤出电影和电视剧 - const validResults = data.results.filter( + const validResults = response.results.filter( (item: any) => item.media_type === 'movie' || item.media_type === 'tv' );