Modifier la route de téléchargement de vidéo pour gérer le streaming avec prise en charge des plages de fichiers

This commit is contained in:
2025-03-10 16:55:59 +01:00
parent 8f69705ae9
commit e9fd9dfaa1
3 changed files with 29 additions and 8 deletions

1
package-lock.json generated
View File

@@ -14,6 +14,7 @@
"multer": "^1.4.5-lts.1",
"mysql2": "^3.11.3",
"pg": "^8.13.0",
"range-parser": "^1.2.1",
"sharp": "^0.33.5",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^5.0.1"

View File

@@ -16,6 +16,7 @@
"multer": "^1.4.5-lts.1",
"mysql2": "^3.11.3",
"pg": "^8.13.0",
"range-parser": "^1.2.1",
"sharp": "^0.33.5",
"swagger-jsdoc": "^6.2.8",
"swagger-ui-express": "^5.0.1"

View File

@@ -2,6 +2,7 @@ const express = require('express');
const router = express.Router();
const db = require('../db');
const fs = require('fs');
const rangeParser = require('range-parser');
const path = require('path');
const serverError = require('../utils/serverError');
const videoManager = require('../src/video/videoManager');
@@ -270,14 +271,32 @@ router.get('/videos/file/:video_id', (req, res) => {
return res.status(400).json({ error: 'Video not yet produced' });
}
const videoPath = video.video_file;
console.log('Video path:', videoPath);
fs.access(videoPath, fs.constants.F_OK, (err) => {
if (err) {
console.error('Video not found:', err);
return res.status(404).json({ error: 'Video not found' });
}
res.download(videoPath);
});
const stat = fs.statSync(videoPath);
const fileSize = stat.size;
const range = req.headers.range;
if (range) {
const parts = rangeParser(fileSize, range);
const start = parts[0].start;
const end = parts[0].end;
const chunksize = (end - start) + 1;
const file = fs.createReadStream(videoPath, { start, end });
const head = {
'Content-Range': `bytes ${start}-${end}/${fileSize}`,
'Accept-Ranges': 'bytes',
'Content-Length': chunksize,
'Content-Type': 'video/mp4',
};
res.writeHead(206, head);
file.pipe(res);
} else {
const head = {
'Content-Length': fileSize,
'Content-Type': 'video/mp4',
};
res.writeHead(200, head);
fs.createReadStream(videoPath).pipe(res);
}
});
});