Providers pris en charge
| Provider | Auth | Rejoindre | Enregistrements | Transcription |
|---|---|---|---|---|
| BBB | sharedSecret | iframe | Oui, API native | Texte fourni |
| Zoom | Server-to-Server OAuth | nouvel onglet | Webhook + cron | VTT auto |
| Teams | Client Credentials | nouvel onglet | Graph API + cron | VTT auto |
| Google Meet | OAuth + Calendar API | nouvel onglet | Calendar API + cron | Manuel dans Meet |
Adapter pattern
packages/core/src/live-class/types.ts :
interface VideoProviderAdapter {
createMeeting(params): Promise<VideoMeetingResult>;
getJoinUrl(params): Promise<VideoJoinResult>;
endMeeting(meetingId, providerData?): Promise<void>;
getMeetingStatus(meetingId): Promise<VideoMeetingStatus | null>;
getRecordings(meetingId): Promise<VideoRecording[]>;
getTranscript?(meetingId): Promise<VideoTranscript | null>;
}
resolveVideoProvider(tenantId, liveClass?) cascade ainsi :
liveClass.videoProvider(si spécifié dans le cours)VideoProviderConfig.isDefault(provider par défaut du tenant)Tenant.config.bbb(legacy backward compat)- Variables d'environnement BBB (fallback global)
Configuration par provider
BBB (par défaut)
Prérequis : instance BBB en cours d'exécution. Paramètres > Fournisseur vidéo > BBB > URL + Shared Secret.
Zoom
- Créez une application Server-to-Server OAuth sur le Zoom Marketplace
- Scopes :
meeting:read,meeting:write,recording:read,user:read - Paramètres > Fournisseur vidéo > Zoom > Account ID + Client ID + Client Secret
- Webhook :
/api/webhooks/video/zoomavec HMAC SHA-256 viax-zm-signature
Teams
- Enregistrement d'application Azure AD
- Permissions : Microsoft Graph
OnlineMeetings.ReadWrite.All,OnlineMeetingRecording.Read.All - Paramètres > Fournisseur vidéo > Teams > Tenant ID + Client ID + Client Secret + e-mail de l'organisateur
- Webhook : Graph Change Notifications (validation d'abonnement via
validationToken)
Google Meet
- Google Cloud Console > APIs > Calendar API + Meet REST API v2
- OAuth 2.0 Client (application Web)
- Paramètres > Fournisseur vidéo > Google Meet > Client ID + Client Secret
- Flux de consentement administrateur via OAuth (redirection vers Google)
- Limitation : endMeeting non pris en charge via API — l'adapter marque le cours comme terminé localement
Identifiants
Stockés dans VideoProviderConfig avec AES-256-GCM :
encryptedCredentials— blob JSON chiffréencryptionIv+encryptionAuthTag- Tokens OAuth (Teams/Meet) :
accessToken,refreshToken,tokenExpiresAt
Unique : [tenantId, provider] — une configuration par provider par tenant.
Webhooks et recording sync
Chaque provider a son propre fonctionnement. Studeia normalise via des webhook handlers + cron fallback :
POST /api/webhooks/video/zoom— événements de réunion + recording.completedPOST /api/webhooks/video/teams— notifications GraphGET /api/cron/recording-sync— polling toutes les 15 min pour les réunions terminées sans recordingUrl
Les webhooks sont peu fiables (délais, expiration des abonnements). Le cron est toujours utilisé comme fallback.
Transcription
Zoom et Teams fournissent le VTT nativement après l'enregistrement. Studeia crée un LiveClassTranscription avec :
transcriptionText(extrait du VTT)transcriptionLanguage- statut : pending → transcribing → review → approved → ingested
Après approbation, l'administrateur peut déclencher l'ingestion dans le RAG du cours. Détails dans Media Transcription.
Portée par groupe
LiveClass.classGroupId est optionnel. Lorsqu'il est défini :
- Seuls les étudiants de ce groupe voient le cours dans /live-classes/
- Seuls les étudiants du groupe peuvent rejoindre le cours (validé lors de la connexion)
- Notifications uniquement pour le groupe
Sans classGroupId : portée au cours entier (tous les étudiants inscrits).
Limitations
- BBB : nécessite une instance auto-hébergée (ou un provider BBB managé). Coûts : 20-200 USD/mois selon la taille.
- Zoom : limite de durée selon le niveau d'abonnement (gratuit = 40 min, payant = illimité).
- Teams : endMeeting non pris en charge via API.
- Google Meet : enregistrement/transcription démarré manuellement par l'hôte.
- Streaming vers YouTube/Twitch : non pris en charge nativement.