Skip to content

Bunny Stream

Video’s worden niet opgeslagen in R2 maar gehost bij Bunny Stream. Dit scheidt video processing van de Beam infrastructure en telt niet mee in de site storage quota (500 MB).

Gebruiker selecteert video
→ POST /media/video/upload (Beam API)
→ API genereert SHA256 presigned headers via crypto.subtle
→ Media record aangemaakt (bunny_status: 0)
→ Response: { mediaId, presignHeaders, uploadUrl }
→ Client uploadt direct naar Bunny CDN (TUS resumable upload)
→ Bunny encodeert video
→ useVideoEncodingPoll() pollt batch endpoint
→ bunny_status: 4 = klaar voor afspelen

De API Worker genereert SHA256 presigned headers met crypto.subtle (Web Crypto API, beschikbaar in Workers runtime). De client uploadt vervolgens direct naar Bunny CDN — het videobestand gaat niet via de Beam API. Dit voorkomt payload-limieten en Worker CPU-tijd.

Video metadata wordt opgeslagen in de media tabel:

KolomTypeBeschrijving
bunny_video_idtextBunny video identifier
bunny_library_idtextBunny library identifier
bunny_statusinteger (0-5)Encoding status
durationfloatVideo duur in seconden
StatusBetekenis
0Created (wacht op upload)
1Uploading
2Processing
3Transcoding
4Finished (klaar voor afspelen)
5Error
LimietWaarde
Max bestandsgrootte100 MB
Ondersteunde formatenMP4, WebM, MOV
Niet meegeteld inSite storage quota (500 MB)

Status updates via useVideoEncodingPoll() hook in het dashboard (zie Technische Stack — State Management):

  • Batch API — pollt meerdere video’s tegelijk via PATCH /media/video/:id/status
  • Exponential backoff — start bij 2s, verdubbelt tot max 30s
  • Ref patternuseRef voor stabiele callback references (geen stale closures)
  • Optimistic SWR update — bij status 4 (Finished) wordt de SWR media cache direct bijgewerkt zonder revalidatie

Webhook-integratie voor push-based status updates is gepland maar nog niet geïmplementeerd.