Video Generator API
Vue d'ensemble
API REST pour la génération de présentations vidéo.
Base URL : https://api.momentscollectifs.fr
Endpoints
POST /create_presentation
Crée une nouvelle présentation vidéo à partir des messages collectés.
Request
POST /create_presentation
Content-Type: application/json
{
"title": "Anniversaire de Marie",
"description": "Tous vos messages pour ses 30 ans !",
"pages": [
{
"id": 1,
"type": "text",
"content": "<p><strong>Joyeux anniversaire !</strong></p><p>Je te souhaite le meilleur.</p>",
"author": "Jean"
},
{
"id": 2,
"type": "video",
"content": "https://xxx.supabase.co/storage/v1/object/sign/video_dedicace/video_1/dedicace_uuid.webm?token=xxx"
},
{
"id": 3,
"type": "text",
"content": "<p>Un message simple</p>",
"author": "Marie"
}
],
"webhook_url": "https://app.momentscollectifs.fr/api/webhook/presentation"
}
Paramètres
| Champ | Type | Requis | Description |
|---|---|---|---|
title | string | Oui | Titre de la présentation |
description | string | Non | Description/introduction |
pages | Page[] | Oui | Liste des pages à inclure |
webhook_url | string | Non | URL de callback quand terminé |
Type Page
interface Page {
id: number; // Identifiant unique
type: 'text' | 'video'; // Type de contenu
content: string; // HTML (text) ou URL signée (video)
author?: string; // Nom de l'auteur (pour text)
}
Response
Succès (202 Accepted)
{
"presentationId": "1709123456789_abc123",
"status": "processing",
"estimatedDuration": 120
}
La génération est asynchrone. Utilisez le webhook ou polling pour le statut.
Erreur (400)
{
"error": "Invalid request",
"message": "title is required"
}
GET /download/:presentationId/:filename
Télécharge une vidéo générée.
Request
GET /download/1709123456789_abc123/desktop.mp4
Paramètres URL
| Paramètre | Description |
|---|---|
presentationId | ID retourné par create_presentation |
filename | desktop.mp4 ou mobile.mp4 |
Response
Succès (200)
Content-Type: video/mp4
Content-Disposition: attachment; filename="desktop.mp4"
Content-Length: 12345678
<binary video data>
Erreur (404)
{
"error": "Not found",
"message": "Presentation not found or not ready"
}
GET /status/:presentationId
Vérifie le statut d'une présentation.
Request
GET /status/1709123456789_abc123
Response
En cours
{
"presentationId": "1709123456789_abc123",
"status": "processing",
"progress": 45,
"currentStep": "Rendering page 3 of 10"
}
Terminé
{
"presentationId": "1709123456789_abc123",
"status": "completed",
"progress": 100,
"downloadUrls": {
"desktop": "/download/1709123456789_abc123/desktop.mp4",
"mobile": "/download/1709123456789_abc123/mobile.mp4"
},
"duration": 180,
"fileSize": {
"desktop": 52428800,
"mobile": 31457280
}
}
Erreur
{
"presentationId": "1709123456789_abc123",
"status": "error",
"error": "Failed to download video from source"
}
GET /health
Vérifie l'état du service.
Request
GET /health
Response
{
"status": "healthy",
"version": "1.0.0",
"uptime": 86400,
"dependencies": {
"ffmpeg": true,
"puppeteer": true,
"storage": true
}
}
Webhook
Quand la génération est terminée, un POST est envoyé au webhook_url.
Payload Succès
{
"event": "presentation.completed",
"timestamp": "2024-03-01T15:30:00Z",
"data": {
"presentationId": "1709123456789_abc123",
"status": "completed",
"downloadUrls": {
"desktop": "https://api.momentscollectifs.fr/download/1709123456789_abc123/desktop.mp4",
"mobile": "https://api.momentscollectifs.fr/download/1709123456789_abc123/mobile.mp4"
},
"duration": 180,
"pageCount": 10
}
}
Payload Erreur
{
"event": "presentation.failed",
"timestamp": "2024-03-01T15:30:00Z",
"data": {
"presentationId": "1709123456789_abc123",
"status": "error",
"error": {
"code": "VIDEO_DOWNLOAD_FAILED",
"message": "Failed to download video: Connection timeout",
"page": 3
}
}
}
Formats de Sortie
| Format | Résolution | Ratio | Usage |
|---|---|---|---|
| Desktop | 1920 x 1080 | 16:9 | PC, TV, YouTube |
| Mobile | 1080 x 1920 | 9:16 | Stories, TikTok, Reels |
Spécifications Techniques
Codec vidéo: H.264 (libx264)
Codec audio: AAC
Framerate: 30 fps
Bitrate vidéo: ~5 Mbps
Bitrate audio: 128 kbps
Container: MP4
Limites
| Limite | Valeur |
|---|---|
| Pages par présentation | 100 max |
| Durée vidéo par page | 120 secondes max |
| Durée totale | 60 minutes max |
| Taille fichier vidéo source | 100 MB max |
| Requêtes simultanées | 5 par IP |
Codes d'Erreur
| Code | HTTP | Description |
|---|---|---|
INVALID_REQUEST | 400 | Paramètres manquants/invalides |
VIDEO_DOWNLOAD_FAILED | 422 | Impossible de télécharger la vidéo source |
VIDEO_PROCESSING_FAILED | 422 | Erreur FFmpeg |
TIMEOUT | 408 | Génération trop longue |
NOT_FOUND | 404 | Présentation non trouvée |
RATE_LIMITED | 429 | Trop de requêtes |
INTERNAL_ERROR | 500 | Erreur serveur |
Exemples
JavaScript (Frontend)
async function generatePresentation(product, items) {
const pages = items.map((item, index) => ({
id: index + 1,
type: item.message_type.toLowerCase(),
content: item.message_type === 'TEXT'
? item.message_media
: await getSignedUrl(item.message_media),
author: item.participant_name
}));
const response = await fetch('https://api.momentscollectifs.fr/create_presentation', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
title: product.name,
description: product.description,
pages,
webhook_url: `${window.location.origin}/api/webhook`
})
});
const { presentationId } = await response.json();
return presentationId;
}
cURL
# Créer une présentation
curl -X POST https://api.momentscollectifs.fr/create_presentation \
-H 'Content-Type: application/json' \
-d '{
"title": "Test",
"pages": [
{"id": 1, "type": "text", "content": "<p>Hello</p>", "author": "Test"}
]
}'
# Vérifier le statut
curl https://api.momentscollectifs.fr/status/1709123456789_abc123
# Télécharger
curl -O https://api.momentscollectifs.fr/download/1709123456789_abc123/desktop.mp4