diff --git a/src/app/api/proxy/logo/route.ts b/src/app/api/proxy/logo/route.ts new file mode 100644 index 0000000..7c6a65f --- /dev/null +++ b/src/app/api/proxy/logo/route.ts @@ -0,0 +1,66 @@ +import { getConfig } from '@/lib/config'; +import { NextResponse } from 'next/server'; + +export const runtime = 'nodejs'; + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url); + const imageUrl = searchParams.get('url'); + const source = searchParams.get('moontv-source'); + + if (!imageUrl) { + return NextResponse.json({ error: 'Missing image URL' }, { status: 400 }); + } + + const config = await getConfig(); + const liveSource = config.LiveConfig?.find((s: any) => s.key === source); + const ua = liveSource?.ua || 'AptvPlayer/1.4.10'; + + try { + const decodedUrl = decodeURIComponent(imageUrl); + const imageResponse = await fetch(decodedUrl, { + cache: 'no-cache', + redirect: 'follow', + credentials: 'same-origin', + headers: { + 'User-Agent': ua, + }, + }); + + if (!imageResponse.ok) { + return NextResponse.json( + { error: imageResponse.statusText }, + { status: imageResponse.status } + ); + } + + const contentType = imageResponse.headers.get('content-type'); + + if (!imageResponse.body) { + return NextResponse.json( + { error: 'Image response has no body' }, + { status: 500 } + ); + } + + // 创建响应头 + const headers = new Headers(); + if (contentType) { + headers.set('Content-Type', contentType); + } + + // 设置缓存头 + headers.set('Cache-Control', 'public, max-age=86400, s-maxage=86400'); // 缓存一天 + + // 直接返回图片流 + return new Response(imageResponse.body, { + status: 200, + headers, + }); + } catch (error) { + return NextResponse.json( + { error: 'Error fetching image' }, + { status: 500 } + ); + } +} diff --git a/src/app/live/page.tsx b/src/app/live/page.tsx index 0db9b0b..6c8d0a5 100644 --- a/src/app/live/page.tsx +++ b/src/app/live/page.tsx @@ -8,7 +8,6 @@ import { Radio, Tv } from 'lucide-react'; import { Suspense, useEffect, useRef, useState } from 'react'; import { parseCustomTimeFormat } from '@/lib/time'; -import { processImageUrl } from '@/lib/utils'; import EpgScrollableRow from '@/components/EpgScrollableRow'; import PageLayout from '@/components/PageLayout'; @@ -1132,9 +1131,10 @@ function LivePageClient() {