From e2a94fee2d7e60e7016431371e03f23012295bd3 Mon Sep 17 00:00:00 2001 From: mtvpls Date: Tue, 20 Jan 2026 13:31:52 +0800 Subject: [PATCH] =?UTF-8?q?huya=E6=B5=81=E4=BB=A3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/web-live/proxy/[filename]/route.ts | 36 +++++++++++++++++++ src/app/api/web-live/stream/route.ts | 5 +-- src/app/web-live/page.tsx | 1 + 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 src/app/api/web-live/proxy/[filename]/route.ts diff --git a/src/app/api/web-live/proxy/[filename]/route.ts b/src/app/api/web-live/proxy/[filename]/route.ts new file mode 100644 index 0000000..9bcce73 --- /dev/null +++ b/src/app/api/web-live/proxy/[filename]/route.ts @@ -0,0 +1,36 @@ +import { NextRequest, NextResponse } from 'next/server'; + +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url); + const url = searchParams.get('url'); + + if (!url) { + return NextResponse.json({ error: '缺少URL参数' }, { status: 400 }); + } + + const streamRes = await fetch(url, { + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + 'Referer': 'https://www.huya.com/' + } + }); + + if (!streamRes.ok) { + return NextResponse.json({ error: '无法获取直播流' }, { status: 404 }); + } + + return new NextResponse(streamRes.body, { + headers: { + 'Content-Type': streamRes.headers.get('Content-Type') || 'application/octet-stream', + 'Cache-Control': 'no-cache', + 'Access-Control-Allow-Origin': '*' + } + }); + } catch (error) { + return NextResponse.json( + { error: error instanceof Error ? error.message : '代理失败' }, + { status: 500 } + ); + } +} diff --git a/src/app/api/web-live/stream/route.ts b/src/app/api/web-live/stream/route.ts index 03a2fe0..c5a627a 100644 --- a/src/app/api/web-live/stream/route.ts +++ b/src/app/api/web-live/stream/route.ts @@ -56,9 +56,10 @@ export async function GET(request: NextRequest) { const { sFlvUrl, sStreamName, sFlvUrlSuffix, sFlvAntiCode } = streamInfo; const newAntiCode = getAntiCode(sFlvAntiCode, sStreamName); - const url = `${sFlvUrl}/${sStreamName}.${sFlvUrlSuffix}?${newAntiCode}`; + const streamUrl = `${sFlvUrl}/${sStreamName}.${sFlvUrlSuffix}?${newAntiCode}`; + const proxyUrl = `/api/web-live/proxy/proxy.flv?url=${encodeURIComponent(streamUrl)}`; - return NextResponse.json({ url }); + return NextResponse.json({ url: proxyUrl }); } return NextResponse.json({ error: '不支持的平台' }, { status: 400 }); diff --git a/src/app/web-live/page.tsx b/src/app/web-live/page.tsx index d931286..69460cc 100644 --- a/src/app/web-live/page.tsx +++ b/src/app/web-live/page.tsx @@ -94,6 +94,7 @@ export default function WebLivePage() { url: videoUrl, isLive: true, autoplay: true, + fullscreen: true, customType: { m3u8: m3u8Loader, flv: flvLoader