summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/FileServerService.ts
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2024-01-15 18:17:01 +0900
committerGitHub <noreply@github.com>2024-01-15 18:17:01 +0900
commit8b0fdfcd69334dbf934a69cf707826b3be8cf2d0 (patch)
tree0ecd2004474980d90151a56952b97b6de94962f9 /packages/backend/src/server/FileServerService.ts
parentenhance(frontend): dedicated games page (diff)
downloadsharkey-8b0fdfcd69334dbf934a69cf707826b3be8cf2d0.tar.gz
sharkey-8b0fdfcd69334dbf934a69cf707826b3be8cf2d0.tar.bz2
sharkey-8b0fdfcd69334dbf934a69cf707826b3be8cf2d0.zip
enhance: 動画・音声周りのUIと動作改良 (#12925)
* wip * (fix) `/files` をバイトレンジリクエストに対応させる * video * audio * fix * fix * spdx * fix (rangeRequest) * fix * Update CHANGELOG.md * (add) ボリュームを保存できるように * (fix) ミュート復帰時に音量が固定される * named export * tweak design * Add sensitive class for audio component * Refactor seekbar styles * Refactor hms * Revert "(add) ボリュームを保存できるように" This reverts commit 6271f9493b63f96d0dd9915207e97fe120ef9037. * Revert "(fix) ミュート復帰時に音量が固定される" This reverts commit a65002b56ecdcb10f76bcc2debbe38593a69643f. * revert revert changes --------- Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/backend/src/server/FileServerService.ts')
-rw-r--r--packages/backend/src/server/FileServerService.ts111
1 files changed, 101 insertions, 10 deletions
diff --git a/packages/backend/src/server/FileServerService.ts b/packages/backend/src/server/FileServerService.ts
index f59996ce17..7745a6cb78 100644
--- a/packages/backend/src/server/FileServerService.ts
+++ b/packages/backend/src/server/FileServerService.ts
@@ -168,11 +168,35 @@ export class FileServerService {
}
if (!image) {
- image = {
- data: fs.createReadStream(file.path),
- ext: file.ext,
- type: file.mime,
- };
+ if (request.headers.range && file.file.size > 0) {
+ const range = request.headers.range as string;
+ const parts = range.replace(/bytes=/, '').split('-');
+ const start = parseInt(parts[0], 10);
+ let end = parts[1] ? parseInt(parts[1], 10) : file.file.size - 1;
+ if (end > file.file.size) {
+ end = file.file.size - 1;
+ }
+ const chunksize = end - start + 1;
+
+ image = {
+ data: fs.createReadStream(file.path, {
+ start,
+ end,
+ }),
+ ext: file.ext,
+ type: file.mime,
+ };
+
+ reply.header('Content-Range', `bytes ${start}-${end}/${file.file.size}`);
+ reply.header('Accept-Ranges', 'bytes');
+ reply.header('Content-Length', chunksize);
+ } else {
+ image = {
+ data: fs.createReadStream(file.path),
+ ext: file.ext,
+ type: file.mime,
+ };
+ }
}
if ('pipe' in image.data && typeof image.data.pipe === 'function') {
@@ -203,11 +227,54 @@ export class FileServerService {
reply.header('Content-Type', FILE_TYPE_BROWSERSAFE.includes(file.mime) ? file.mime : 'application/octet-stream');
reply.header('Cache-Control', 'max-age=31536000, immutable');
reply.header('Content-Disposition', contentDisposition('inline', filename));
+
+ if (request.headers.range && file.file.size > 0) {
+ const range = request.headers.range as string;
+ const parts = range.replace(/bytes=/, '').split('-');
+ const start = parseInt(parts[0], 10);
+ let end = parts[1] ? parseInt(parts[1], 10) : file.file.size - 1;
+ if (end > file.file.size) {
+ end = file.file.size - 1;
+ }
+ const chunksize = end - start + 1;
+ const fileStream = fs.createReadStream(file.path, {
+ start,
+ end,
+ });
+ reply.header('Content-Range', `bytes ${start}-${end}/${file.file.size}`);
+ reply.header('Accept-Ranges', 'bytes');
+ reply.header('Content-Length', chunksize);
+ reply.code(206);
+ return fileStream;
+ }
+
return fs.createReadStream(file.path);
} else {
reply.header('Content-Type', FILE_TYPE_BROWSERSAFE.includes(file.file.type) ? file.file.type : 'application/octet-stream');
reply.header('Cache-Control', 'max-age=31536000, immutable');
reply.header('Content-Disposition', contentDisposition('inline', file.filename));
+
+ if (request.headers.range && file.file.size > 0) {
+ const range = request.headers.range as string;
+ const parts = range.replace(/bytes=/, '').split('-');
+ const start = parseInt(parts[0], 10);
+ let end = parts[1] ? parseInt(parts[1], 10) : file.file.size - 1;
+ console.log(end);
+ if (end > file.file.size) {
+ end = file.file.size - 1;
+ }
+ const chunksize = end - start + 1;
+ const fileStream = fs.createReadStream(file.path, {
+ start,
+ end,
+ });
+ reply.header('Content-Range', `bytes ${start}-${end}/${file.file.size}`);
+ reply.header('Accept-Ranges', 'bytes');
+ reply.header('Content-Length', chunksize);
+ reply.code(206);
+ return fileStream;
+ }
+
return fs.createReadStream(file.path);
}
} catch (e) {
@@ -340,11 +407,35 @@ export class FileServerService {
}
if (!image) {
- image = {
- data: fs.createReadStream(file.path),
- ext: file.ext,
- type: file.mime,
- };
+ if (request.headers.range && file.file && file.file.size > 0) {
+ const range = request.headers.range as string;
+ const parts = range.replace(/bytes=/, '').split('-');
+ const start = parseInt(parts[0], 10);
+ let end = parts[1] ? parseInt(parts[1], 10) : file.file.size - 1;
+ if (end > file.file.size) {
+ end = file.file.size - 1;
+ }
+ const chunksize = end - start + 1;
+
+ image = {
+ data: fs.createReadStream(file.path, {
+ start,
+ end,
+ }),
+ ext: file.ext,
+ type: file.mime,
+ };
+
+ reply.header('Content-Range', `bytes ${start}-${end}/${file.file.size}`);
+ reply.header('Accept-Ranges', 'bytes');
+ reply.header('Content-Length', chunksize);
+ } else {
+ image = {
+ data: fs.createReadStream(file.path),
+ ext: file.ext,
+ type: file.mime,
+ };
+ }
}
if ('cleanup' in file) {