From 3a00ba51ebc1d171ae37620182691fb9671340dc Mon Sep 17 00:00:00 2001 From: subnub Date: Mon, 23 Dec 2024 17:04:31 -0500 Subject: [PATCH] more video streaming work --- backend/controllers/file-controller.ts | 46 +++++++++++++++++++ .../services/chunk-service/chunk-service.ts | 5 +- .../chunk-service/utils/getFileData.ts | 41 +++++++++++++++-- 3 files changed, 86 insertions(+), 6 deletions(-) diff --git a/backend/controllers/file-controller.ts b/backend/controllers/file-controller.ts index 27e2457..6ab7e8e 100644 --- a/backend/controllers/file-controller.ts +++ b/backend/controllers/file-controller.ts @@ -9,6 +9,7 @@ import ChunkService from "../services/chunk-service/chunk-service"; import streamToBuffer from "../utils/streamToBuffer"; import NotAuthorizedError from "../utils/NotAuthorizedError"; import { FileListQueryType } from "../types/file-types"; +import fs from "fs"; const fileService = new FileService(); type userAccessType = { @@ -374,6 +375,51 @@ class FileController { } }; + streamVideoTest = async ( + req: RequestTypeFullUser, + res: Response, + next: NextFunction + ) => { + if (!req.user) { + return; + } + + try { + const headers = req.headers; + console.log("headers", headers.range); + const fileSize = 26867866; + const range = headers.range!; + const parts = range.replace(/bytes=/, "").split("-"); + const start = parseInt(parts[0], 10); + const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1; + const chunksize = end - start + 1; + + const readStream = fs.createReadStream( + "/Users/kylehoell/Developer/myDrive-4/upgrade/old/video.mp4", + { start, end } + ); + + const head = { + "Content-Range": "bytes " + start + "-" + end + "/" + fileSize, + "Accept-Ranges": "bytes", + "Content-Length": chunksize, + "Content-Type": "video/mp4", + }; + + res.writeHead(206, head); + + readStream.on("data", (data) => { + res.write(data); + }); + + readStream.on("end", () => { + res.end(); + }); + } catch (e: unknown) { + next(e); + } + }; + downloadFile = async ( req: RequestTypeFullUser, res: Response, diff --git a/backend/services/chunk-service/chunk-service.ts b/backend/services/chunk-service/chunk-service.ts index ce6cb80..5be75f4 100644 --- a/backend/services/chunk-service/chunk-service.ts +++ b/backend/services/chunk-service/chunk-service.ts @@ -385,6 +385,8 @@ class StorageService { const chunksize = end - start + 1; const IV = currentFile.metadata.IV; + console.log("chunksize", start, end, chunksize); + const head = { "Content-Range": "bytes " + start + "-" + end + "/" + fileSize, "Accept-Ranges": "bytes", @@ -423,7 +425,8 @@ class StorageService { await getFileData(res, fileID, user, currentIV, { start: start, - end: end, + end, + chunksize, fixedStart, fixedEnd, skip: start - fixedStart, diff --git a/backend/services/chunk-service/utils/getFileData.ts b/backend/services/chunk-service/utils/getFileData.ts index 8474c21..4a4b868 100644 --- a/backend/services/chunk-service/utils/getFileData.ts +++ b/backend/services/chunk-service/utils/getFileData.ts @@ -25,6 +25,7 @@ const proccessData = ( fixedStart: number; fixedEnd: number; skip: number; + chunksize: number; } ) => { const eventEmitter = new EventEmitter(); @@ -88,25 +89,54 @@ const proccessData = ( } if (range) { - const extraBytes = range.fixedEnd - range.end; let bytesSent = 0; const skipStream = streamSkip(range.skip); - readStream.pipe(decipher).pipe(skipStream); - skipStream.on("data", (data: Buffer) => { - if (bytesSent + data.length > range.end) { - const neededData = data.slice(0, data.length - extraBytes); + const totalData: Buffer[] = []; + decipher.on("data", (data: Buffer) => { + // console.log("data", data.length); + if (bytesSent + data.length > range.chunksize) { + const currentDataLength = bytesSent + data.length; + const difference = currentDataLength - range.chunksize; + const neededData = data.slice(0, data.length - difference); + console.log("needed data", data.length - difference); + // console.log( + // "needed data", + // neededData.length, + // range.end - range.start, + // bytesSent + // ); res.write(neededData); + totalData.push(neededData); } else { res.write(data); + totalData.push(data); } + //totalData.push(data); bytesSent += data.length; }); + + readStream.pipe(decipher); + // decipher.on("finish", () => { + // eventEmitter.emit("finish"); + // }); decipher.on("finish", () => { + // console.log("finish", totalData); + const buffer = Buffer.concat(totalData); + console.log("buffer", buffer.length); + // res.write(buffer); + res.end(); + eventEmitter.emit("finish"); }); + // readStream + // .pipe(decipher) + // .pipe(res) + // .on("finish", () => { + // eventEmitter.emit("finish"); + // }); } else { readStream .pipe(decipher) @@ -136,6 +166,7 @@ const getFileData = ( fixedStart: number; fixedEnd: number; skip: number; + chunksize: number; } ) => { return new Promise((resolve, reject) => {