aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/app
diff options
context:
space:
mode:
authorkamtschatka <simon.schatka@gmx.at>2024-10-28 02:51:00 +0100
committerGitHub <noreply@github.com>2024-10-28 01:51:00 +0000
commit4a13c36da50f6b3171d817edebefe96ba85dc666 (patch)
tree60ff553426493e7ae2460e73c3500a5525ba735c /apps/web/app
parent3b7451f4d0727d597c0af0e602f0c74cf58999af (diff)
downloadkarakeep-4a13c36da50f6b3171d817edebefe96ba85dc666.tar.zst
feature: Archive videos using yt-dlp. Fixes #215 (#525)
* Allow downloading more content from a webpage and index it #215 Added a worker that allows downloading videos depending on the environment variables refactored the code a bit added new video asset updated documentation * Some tweaks * Drop the dependency on the yt-dlp wrapper * Update openapi specs * Dont log an error when the url is not supported * Better handle supported websites that dont download anything --------- Co-authored-by: Mohamed Bassem <me@mbassem.com>
Diffstat (limited to 'apps/web/app')
-rw-r--r--apps/web/app/api/assets/[assetId]/route.ts32
1 files changed, 26 insertions, 6 deletions
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,
+ },
+ });
+ }
}