diff --git a/apps/web/app/api/assets/[assetId]/route.ts b/apps/web/app/api/assets/[assetId]/route.ts index 73237d8d..3bff79ba 100644 --- a/apps/web/app/api/assets/[assetId]/route.ts +++ b/apps/web/app/api/assets/[assetId]/route.ts @@ -27,10 +27,30 @@ export async function GET( assetId: params.assetId, }); - return new Response(asset, { - status: 200, - headers: { - "Content-type": metadata.contentType, - }, - }); + const range = request.headers.get("Range"); + if (range) { + const parts = range.replace(/bytes=/, "").split("-"); + const start = parseInt(parts[0], 10); + const end = parts[1] ? parseInt(parts[1], 10) : asset.length - 1; + + // TODO: Don't read the whole asset into memory in the first place + const chunk = asset.subarray(start, end + 1); + return new Response(chunk, { + status: 206, // Partial Content + headers: { + "Content-Range": `bytes ${start}-${end}/${asset.length}`, + "Accept-Ranges": "bytes", + "Content-Length": chunk.length.toString(), + "Content-type": metadata.contentType, + }, + }); + } else { + return new Response(asset, { + status: 200, + headers: { + "Content-Length": asset.length.toString(), + "Content-type": metadata.contentType, + }, + }); + } } diff --git a/apps/web/components/dashboard/preview/AttachmentBox.tsx b/apps/web/components/dashboard/preview/AttachmentBox.tsx index 436f1026..d631f4d9 100644 --- a/apps/web/components/dashboard/preview/AttachmentBox.tsx +++ b/apps/web/components/dashboard/preview/AttachmentBox.tsx @@ -20,6 +20,7 @@ import { Pencil, Plus, Trash2, + Video, } from "lucide-react"; import { @@ -44,6 +45,7 @@ export default function AttachmentBox({ bookmark }: { bookmark: ZBookmark }) { screenshot: , fullPageArchive: , bannerImage: , + video: