mirror of
https://github.com/KuekHaoYang/KVideo.git
synced 2026-08-12 23:33:43 +08:00
113 lines
2.7 KiB
TypeScript
113 lines
2.7 KiB
TypeScript
/**
|
|
* Detail API Route
|
|
* Fetches video details including episodes and M3U8 URLs with automatic source validation
|
|
*/
|
|
|
|
import { NextRequest, NextResponse } from 'next/server';
|
|
import { getVideoDetail } from '@/lib/api/client';
|
|
import { getSourceById } from '@/lib/api/video-sources';
|
|
|
|
export const runtime = 'edge';
|
|
|
|
/**
|
|
* Shared handler for fetching video details
|
|
*/
|
|
async function handleDetailRequest(id: string | null, source: string | null, method: string) {
|
|
// Validate input
|
|
if (!id) {
|
|
return NextResponse.json(
|
|
{ error: 'Missing video ID parameter' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// Validate source
|
|
if (!source) {
|
|
return NextResponse.json(
|
|
{ error: 'Missing source parameter' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
let sourceConfig;
|
|
|
|
// If source is an object (from POST), use it
|
|
if (typeof source === 'object') {
|
|
sourceConfig = source;
|
|
} else {
|
|
// If source is a string ID (from GET), try to look it up
|
|
sourceConfig = getSourceById(source);
|
|
}
|
|
|
|
if (!sourceConfig) {
|
|
return NextResponse.json(
|
|
{ error: 'Invalid source configuration' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// Fetch video detail without validation (already validated during search)
|
|
try {
|
|
const videoDetail = await getVideoDetail(id, sourceConfig);
|
|
|
|
// Skip validation - videos are already checked during search
|
|
// Just return the episodes as-is
|
|
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
data: videoDetail,
|
|
});
|
|
} catch (error) {
|
|
console.error('Detail API error:', error);
|
|
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Failed to fetch video detail',
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const searchParams = request.nextUrl.searchParams;
|
|
const id = searchParams.get('id');
|
|
const source = searchParams.get('source');
|
|
|
|
return await handleDetailRequest(id, source, 'GET');
|
|
} catch (error) {
|
|
console.error('Detail API error:', error);
|
|
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Internal server error',
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
// Support POST method for complex requests
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { id, source } = body;
|
|
|
|
return await handleDetailRequest(id, source, 'POST');
|
|
} catch (error) {
|
|
console.error('Detail API error:', error);
|
|
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: error instanceof Error ? error.message : 'Internal server error',
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|