Modifier la route de rendu vidéo pour utiliser GET, ajouter la gestion de l'accès au fichier vidéo et renvoyer le contenu vidéo en fonction de la plage demandée

This commit is contained in:
2025-03-10 17:45:42 +01:00
parent 9ec8ff73f3
commit 3469c757ec

View File

@@ -256,11 +256,11 @@ router.delete('/videos/:id', (req, res) => {
* 400: * 400:
* description: Video not yet produced * description: Video not yet produced
*/ */
router.post('/videos/render/:video_id', async (req, res) => { router.get('/videos/file/:video_id', (req, res) => {
const videoId = req.params.video_id; const videoId = req.params.video_id;
const query = 'SELECT measurement_ids, project_id, duration FROM public.videos WHERE id = $1'; const query = 'SELECT video_file, status FROM public.videos WHERE id = $1';
db.query(query, [videoId], async (err, results) => { db.query(query, [videoId], (err, results) => {
if (err) { if (err) {
console.error('Error getting video:', err); console.error('Error getting video:', err);
return serveFallbackVideo(res); return serveFallbackVideo(res);
@@ -270,31 +270,47 @@ router.post('/videos/render/:video_id', async (req, res) => {
return serveFallbackVideo(res); return serveFallbackVideo(res);
} }
console.log('Video found:', results.rows[0]); const video = results.rows[0];
const duration = results.rows[0].duration; if (video.status === 0) {
return res.status(400).json({ error: 'Video not yet produced' });
console.log('Rendering video:', videoId);
const measurementIds = results.rows[0].measurement_ids;
const project_id = results.rows[0].project_id;
console.log('Measurement IDs:', measurementIds);
console.log('Project ID:', project_id);
try {
const pathList = await measureManager.getPathList(measurementIds, project_id);
console.log('Path list:', pathList);
res.json({ message: 'Render process started' });
const videoFile = await videoManager.createVideoWithList(project_id, pathList, duration, videoId);
console.log('Video file:', videoFile);
await videoManager.updateVideoFile(videoId, videoFile);
console.log('Video rendering complete');
} catch (err) {
console.error('Error during video rendering:', err);
return serveFallbackVideo(res);
} }
const videoPath = video.video_file;
// Check if the video file exists
fs.access(videoPath, fs.constants.F_OK, (err) => {
if (err) {
console.error('Video file not found:', err);
return serveFallbackVideo(res);
}
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);
}
});
}); });
}); });