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:
1
package-lock.json
generated
1
package-lock.json
generated
@@ -14,6 +14,7 @@
|
|||||||
"multer": "^1.4.5-lts.1",
|
"multer": "^1.4.5-lts.1",
|
||||||
"mysql2": "^3.11.3",
|
"mysql2": "^3.11.3",
|
||||||
"pg": "^8.13.0",
|
"pg": "^8.13.0",
|
||||||
|
"range-parser": "^1.2.1",
|
||||||
"sharp": "^0.33.5",
|
"sharp": "^0.33.5",
|
||||||
"swagger-jsdoc": "^6.2.8",
|
"swagger-jsdoc": "^6.2.8",
|
||||||
"swagger-ui-express": "^5.0.1"
|
"swagger-ui-express": "^5.0.1"
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
"multer": "^1.4.5-lts.1",
|
"multer": "^1.4.5-lts.1",
|
||||||
"mysql2": "^3.11.3",
|
"mysql2": "^3.11.3",
|
||||||
"pg": "^8.13.0",
|
"pg": "^8.13.0",
|
||||||
|
"range-parser": "^1.2.1",
|
||||||
"sharp": "^0.33.5",
|
"sharp": "^0.33.5",
|
||||||
"swagger-jsdoc": "^6.2.8",
|
"swagger-jsdoc": "^6.2.8",
|
||||||
"swagger-ui-express": "^5.0.1"
|
"swagger-ui-express": "^5.0.1"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ const express = require('express');
|
|||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
const db = require('../db');
|
const db = require('../db');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
const rangeParser = require('range-parser');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const serverError = require('../utils/serverError');
|
const serverError = require('../utils/serverError');
|
||||||
const videoManager = require('../src/video/videoManager');
|
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' });
|
return res.status(400).json({ error: 'Video not yet produced' });
|
||||||
}
|
}
|
||||||
const videoPath = video.video_file;
|
const videoPath = video.video_file;
|
||||||
console.log('Video path:', videoPath);
|
const stat = fs.statSync(videoPath);
|
||||||
fs.access(videoPath, fs.constants.F_OK, (err) => {
|
const fileSize = stat.size;
|
||||||
if (err) {
|
const range = req.headers.range;
|
||||||
console.error('Video not found:', err);
|
|
||||||
return res.status(404).json({ error: 'Video not found' });
|
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);
|
||||||
}
|
}
|
||||||
res.download(videoPath);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user