Typy zdarzeń
Ignite Webhooks obsługują trzy typy zdarzeń z cyklu życia wideo. Przy tworzeniu subskrypcji webhooka możesz wybrać dowolną ich kombinację.
Dostępne zdarzenia
video.created
Uruchamiane, gdy w twoim workspace powstaje nowe wideo.
Kiedy się wywołuje:
- Nowy obiekt wideo jest tworzony przez API
- Wideo jest przesyłane przez panel administracyjny
Payload: Pełny obiekt wideo ze wszystkimi wartościami początkowymi. Pamiętaj, że status wideo może wtedy być NO_FILE albo PROCESSING.
video.updated
Uruchamiane przy każdej zmianie właściwości wideo.
Kiedy się wywołuje:
- Aktualizowane są metadane wideo (tytuł, opis, widoczność itd.)
- Kończy się przetwarzanie wideo (status przechodzi na
COMPLETE) - Dodawane lub zmieniane są ścieżki tekstowe albo rozdziały
- Zmieniane są kategorie lub tagi
- Aktualizowana jest miniatura
Payload: Pełny obiekt wideo ze wszystkimi aktualnymi wartościami po aktualizacji.
video.deleted
Uruchamiane, gdy wideo jest usuwane z twojego workspace.
Kiedy się wywołuje:
- Wideo jest usuwane przez API
- Wideo jest usuwane przez panel administracyjny
Payload: Pełny obiekt wideo w stanie sprzed usunięcia.
Struktura payloadu zdarzeń
Wszystkie zdarzenia dostarczają pełny obiekt wideo w treści żądania. Typ zdarzenia jest podany w nagłówku X-Webhook-Event, a nie w body.
Przykład: video.created
Nagłówki:
POST /your-webhook-endpoint HTTP/1.1
Content-Type: application/json
X-Webhook-Event: video.created
X-Webhook-Signature: t=1705316400000,v1=abc123...
X-Webhook-Delivery-Id: del_507f1f77bcf86cd799439011Body:
{
"id": "507f1f77bcf86cd799439011",
"status": "PROCESSING",
"visibility": "private",
"title": "My New Video",
"description": "",
"duration": 0,
"workspace": "507f1f77bcf86cd799439000",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:30:00.000Z"
}Przykład: video.updated
Nagłówki:
POST /your-webhook-endpoint HTTP/1.1
Content-Type: application/json
X-Webhook-Event: video.updated
X-Webhook-Signature: t=1705316500000,v1=def456...
X-Webhook-Delivery-Id: del_507f1f77bcf86cd799439012Body:
{
"id": "507f1f77bcf86cd799439011",
"status": "COMPLETE",
"visibility": "public",
"title": "My New Video",
"description": "A great video about something",
"duration": 120,
"fps": 30,
"orientation": "landscape",
"src": {
"thumbnails": [
{
"name": "1080p", "width": 1920, "height": 1080,
"formats": {
"jpeg": { "url": "https://cdn.ignite.video/.../a1b2c3d4-1080p.jpg", "fileSize": 9180 },
"webp": { "url": "https://cdn.ignite.video/.../a1b2c3d4-1080p.webp", "fileSize": 4256 }
}
},
// ... additional resolutions
],
"thumbnailUrl": "https://cdn.ignite.video/.../a1b2c3d4-1080p.jpg",
"abr": {
"resolution": "auto",
"description": "Adaptive Bitrate Streaming (ABR)",
"url": "https://cdn.ignite.video/.../master.m3u8",
"maxWidth": 1920,
"maxHeight": 1080
},
"hls": [...],
"mp4": [...]
},
"workspace": "507f1f77bcf86cd799439000",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:35:00.000Z"
}Przykład: video.deleted
Nagłówki:
POST /your-webhook-endpoint HTTP/1.1
Content-Type: application/json
X-Webhook-Event: video.deleted
X-Webhook-Signature: t=1705316600000,v1=ghi789...
X-Webhook-Delivery-Id: del_507f1f77bcf86cd799439013Body:
{
"id": "507f1f77bcf86cd799439011",
"status": "COMPLETE",
"visibility": "public",
"title": "My New Video",
"description": "A great video about something",
"duration": 120,
"workspace": "507f1f77bcf86cd799439000",
"createdAt": "2024-01-15T10:30:00.000Z",
"updatedAt": "2024-01-15T10:35:00.000Z"
}Dobre praktyki
Obsługuj wszystkie zapisane zdarzenia
Zawsze sprawdzaj nagłówek X-Webhook-Event i odpowiednio obsługuj każdy typ:
const eventType = request.headers['x-webhook-event'];
switch(eventType) {
case 'video.created':
// Handle new video
break;
case 'video.updated':
// Handle video update
break;
case 'video.deleted':
// Handle video deletion
break;
default:
console.log('Unknown event type:', eventType);
}Używaj ID dostawy do idempotentności
Nagłówek X-Webhook-Delivery-Id zawiera unikalny identyfikator każdej dostawy webhooka. Zapisuj przetworzone ID, żeby uniknąć podwójnej obsługi przy ponowieniach:
const deliveryId = request.headers['x-webhook-delivery-id'];
if (await hasBeenProcessed(deliveryId)) {
return res.status(200).json({ received: true, duplicate: true });
}
// Process the event...
await markAsProcessed(deliveryId);