Fournisseurs pris en charge
| Fournisseur | 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?) effectue une cascade :
liveClass.videoProvider(si spécifié dans le cours)VideoProviderConfig.isDefault(fournisseur par défaut du tenant)Tenant.config.bbb(legacy backward compat)- Variables d'environnement BBB (fallback global)
Configuration par fournisseur
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 dans 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 de la souscription 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 l'API — l'adapter marque comme completed 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 fournisseur par tenant.
Webhooks et synchronisation des enregistrements
Chaque fournisseur a son propre schéma. Studeia normalise via des gestionnaires de webhooks + un cron de secours :
POST /api/webhooks/video/zoom— événements de réunion + recording.completedPOST /api/webhooks/video/teams— notifications GraphGET /api/cron/recording-sync— scrutation toutes les 15 min pour les réunions terminées sans recordingUrl
Les webhooks sont non fiables (délais, expiration des souscriptions). Le cron est toujours utilisé comme solution de secours.
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.
Périmètre par groupe
LiveClass.classGroupId 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 : à l'échelle du cours (tous les inscrits).
Limitations
- BBB : nécessite une instance auto-hébergée (ou un fournisseur BBB géré). Coûts : $20-200/mois selon la taille.
- Zoom : limite de durée selon le niveau (gratuit=40 min, payant=illimité).
- Teams : endMeeting non pris en charge via l'API.
- Google Meet : enregistrement/transcription lancé manuellement par l'hôte.
- Streaming vers YouTube/Twitch : non pris en charge nativement.