Améliorer la création de vidéos en démarrant le rendu immédiatement et en ajoutant une réponse immédiate avec l'état de traitement.
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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' });
|
||||
}
|
||||
|
||||
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(`
|
||||
|
||||
Reference in New Issue
Block a user