import { createReadStream, statSync } from "node:fs"; import { Readable } from "node:stream"; import type { NextRequest } from "next/server"; import { prisma } from "@streamclipper/db"; export async function GET(req: NextRequest, { params }: { params: Promise<{ id: string }> }) { const { id } = await params; const segment = await prisma.rawSegment.findUnique({ where: { id } }); if (!segment) return new Response("Not found", { status: 404 }); let size: number; try { size = statSync(segment.filePath).size; } catch { return new Response("File not found on disk", { status: 404 }); } const headers: Record = { "Content-Type": "video/mp4", "Accept-Ranges": "bytes", }; if (req.nextUrl.searchParams.get("download") === "1") { headers["Content-Disposition"] = `attachment; filename="${id}.mp4"`; } const range = req.headers.get("range"); const match = range ? /bytes=(\d+)-(\d*)/.exec(range) : null; if (match) { const start = Number(match[1]); const end = match[2] ? Number(match[2]) : size - 1; const stream = createReadStream(segment.filePath, { start, end }); return new Response(Readable.toWeb(stream) as ReadableStream, { status: 206, headers: { ...headers, "Content-Range": `bytes ${start}-${end}/${size}`, "Content-Length": String(end - start + 1), }, }); } const stream = createReadStream(segment.filePath); return new Response(Readable.toWeb(stream) as ReadableStream, { headers: { ...headers, "Content-Length": String(size) }, }); }