diff --git a/routes/_swaggerRoutes.js b/routes/_swaggerRoutes.js index 6e81522..59a4e21 100644 --- a/routes/_swaggerRoutes.js +++ b/routes/_swaggerRoutes.js @@ -737,46 +737,6 @@ * 400: * description: Video not yet produced */ -/** - * @swagger - * /videos/render/{video_id}: - * post: - * summary: Render a video by video ID - * parameters: - * - in: path - * name: video_id - * required: true - * schema: - * type: string - * description: The video ID - * responses: - * 200: - * description: Render process started - * 404: - * description: Video not found - * 500: - * description: Server error - */ -/** - * @swagger - * /videos/reset/{video_id}: - * get: - * summary: Reset the status of a video by video ID - * parameters: - * - in: path - * name: video_id - * required: true - * schema: - * type: string - * description: The video ID - * responses: - * 200: - * description: Video reset successfully - * 404: - * description: Video not found - * 500: - * description: Server error - */ /** * @swagger * /cat: diff --git a/routes/videoRoutes.js b/routes/videoRoutes.js index 776650b..5dbcc53 100644 --- a/routes/videoRoutes.js +++ b/routes/videoRoutes.js @@ -44,7 +44,38 @@ router.post('/videos', async (req, res) => { try { const videoId = await videoManager.createVideoProject(project_id, measurement_ids, name, resolution, duration); - res.json({ message: 'Vidéo créée avec succès', videoId }); + + // Start rendering the video immediately after creation + const result = await db.query( + 'SELECT measurement_ids, project_id, duration FROM public.videos WHERE id = $1', + [videoId] + ); + + if (result.rows.length === 0) { + return res.status(404).json({ error: 'Vidéo non trouvée' }); + } + + const { duration: videoDuration, measurement_ids: videoMeasurementIds, project_id: videoProjectId } = result.rows[0]; + const pathList = await measureManager.getPathList(videoMeasurementIds, videoProjectId); + + // Start background processing + videoManager.createVideoWithList(videoProjectId, pathList, videoDuration, videoId) + .then(videoFile => { + console.log('Rendu vidéo terminé:', videoFile); + return videoManager.updateVideoFile(videoId, videoFile); + }) + .catch(error => { + console.error('Échec du rendu vidéo:', error); + }); + + // Immediate response + res.json({ + message: 'Vidéo créée avec succès et le rendu a démarré', + videoId, + status: 'processing', + check_url: `/videos/status/${videoId}` + }); + } catch (err) { console.error('Erreur lors de la création de la vidéo:', err); res.status(500).json({ error: 'Erreur lors de la création de la vidéo' }); @@ -57,10 +88,30 @@ router.delete('/videos/:id', (req, res) => { if (!videoId || isNaN(videoId)) { return res.status(400).json({ error: 'Invalid video ID' }); } - videoManager.deleteVideoProject(videoId).then(() => { - res.json({ message: 'Vidéo supprimée avec succès' }); - }).catch(err => { - console.error('Erreur lors de la suppression de la vidéo:', err); + + const query = 'SELECT video_file FROM public.videos WHERE id = $1'; + db.query(query, [videoId], (err, results) => { + if (err) { + return serverError.sendError('Error getting video:', res, err, 500); + } + if (results.rows.length === 0) { + return res.status(404).json({ error: 'Video not found' }); + } + + const videoFile = results.rows[0].video_file; + fs.unlink(videoFile, (err) => { + if (err) { + console.error('Error deleting video file:', err); + return res.status(500).json({ error: 'Error deleting video file' }); + } + + videoManager.deleteVideoProject(videoId).then(() => { + res.json({ message: 'Vidéo supprimée avec succès' }); + }).catch(err => { + console.error('Erreur lors de la suppression de la vidéo:', err); + res.status(500).json({ error: 'Erreur lors de la suppression de la vidéo' }); + }); + }); }); }); @@ -133,75 +184,6 @@ function serveFallbackVideo(res) { }); } - -router.post('/videos/render/:video_id', async (req, res) => { - try { - const videoId = req.params.video_id; - const result = await db.query( - 'SELECT measurement_ids, project_id, duration FROM public.videos WHERE id = $1', - [videoId] - ); - - if (result.rows.length === 0) { - return res.status(404).json({ error: 'Vidéo non trouvée' }); - } - - const { duration, measurement_ids, project_id } = result.rows[0]; - const pathList = await measureManager.getPathList(measurement_ids, project_id); - - // Démarrage du traitement en arrière-plan - videoManager.createVideoWithList(project_id, pathList, duration, videoId) - .then(videoFile => { - console.log('Rendu vidéo terminé:', videoFile); - return videoManager.updateVideoFile(videoId, videoFile); - }) - .catch(error => { - console.error('Échec du rendu vidéo:', error); - }); - - // Réponse immédiate - res.json({ - status: 'processing', - message: 'Le rendu a démarré', - check_url: `/videos/status/${videoId}` - }); - - } catch (error) { - console.error('Erreur initiale:', error); - res.status(500).json({ error: 'Échec de l\'initialisation du rendu' }); - } -}); - -router.get('/videos/reset/:video_id', (req, res) => { - const videoId = req.params.video_id; - const query = 'SELECT video_file FROM public.videos WHERE id = $1'; - - db.query(query, [videoId], (err, results) => { - if (err) { - return serverError.sendError('Error getting video:', res, err, 500); - } - if (results.rows.length === 0) { - return res.status(404).json({ error: 'Video not found' }); - } - - const videoFile = results.rows[0].video_file; - fs.unlink(videoFile, (err) => { - if (err) { - console.error('Error deleting video file:', err); - return res.status(500).json({ error: 'Error deleting video file' }); - } - - const updateQuery = 'UPDATE public.videos SET status = 0, video_file = NULL WHERE id = $1'; - db.query(updateQuery, [videoId], (err) => { - if (err) { - return serverError.sendError('Error resetting video status:', res, err, 500); - } - res.json({ message: 'Video reset successfully' }); - }); - }); - }); -}); - router.get('/videos/progress/:video_id', async (req, res) => { try { const result = await db.query(`