Aller au contenu
Studeia Docs
AI-assisted translation — last updated 2026-06-03. For original (pt-BR or en-US), use the language switcher.

Cours en direct multi-provider (BBB, Zoom, Teams, Meet)

Studeia supporte 4 fournisseurs vidéo : BBB (iframe embed), Zoom (S2S OAuth), Teams (Graph API), Meet (OAuth Calendar). Adapter pattern, webhook lifecycle, sync enregistrements via cron

2026-06-03 6 min
Resposta curta

Les cours en direct dans Studeia prennent en charge 4 providers via l'adapter pattern : BigBlueButton (par défaut, iframe embed), Zoom (Server-to-Server OAuth), Microsoft Teams (Graph API), Google Meet (OAuth Calendar). Identifiants chiffrés AES-256-GCM. Webhook lifecycle + cron de recording sync (fallback 15 min). LiveClassTranscription automatique pour Zoom/Teams (ingérable dans le RAG).

Providers pris en charge

ProviderAuthRejoindreEnregistrementsTranscription
BBBsharedSecretiframeOui, API nativeTexte fourni
ZoomServer-to-Server OAuthnouvel ongletWebhook + cronVTT auto
TeamsClient Credentialsnouvel ongletGraph API + cronVTT auto
Google MeetOAuth + Calendar APInouvel ongletCalendar API + cronManuel 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 :

  1. liveClass.videoProvider (si spécifié dans le cours)
  2. VideoProviderConfig.isDefault (provider par défaut du tenant)
  3. Tenant.config.bbb (legacy backward compat)
  4. 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

  1. Créez une application Server-to-Server OAuth sur le Zoom Marketplace
  2. Scopes : meeting:read, meeting:write, recording:read, user:read
  3. Paramètres > Fournisseur vidéo > Zoom > Account ID + Client ID + Client Secret
  4. Webhook : /api/webhooks/video/zoom avec HMAC SHA-256 via x-zm-signature

Teams

  1. Enregistrement d'application Azure AD
  2. Permissions : Microsoft Graph OnlineMeetings.ReadWrite.All, OnlineMeetingRecording.Read.All
  3. Paramètres > Fournisseur vidéo > Teams > Tenant ID + Client ID + Client Secret + e-mail de l'organisateur
  4. Webhook : Graph Change Notifications (validation d'abonnement via validationToken)

Google Meet

  1. Google Cloud Console > APIs > Calendar API + Meet REST API v2
  2. OAuth 2.0 Client (application Web)
  3. Paramètres > Fournisseur vidéo > Google Meet > Client ID + Client Secret
  4. Flux de consentement administrateur via OAuth (redirection vers Google)
  5. 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.completed
  • POST /api/webhooks/video/teams — notifications Graph
  • GET /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.

Voir aussi

FAQ

Quel provider vidéo Studeia utilise-t-il ?

4 options : BigBlueButton (par défaut, iframe embed, open-source), Zoom (Server-to-Server OAuth), Microsoft Teams (Azure AD Client Credentials), Google Meet (OAuth admin consent). L'administrateur choisit par tenant (VideoProviderConfig par défaut) ou par cours spécifique (LiveClass.videoProvider override).

BBB et Zoom fonctionnent-ils de la même façon pour l'étudiant ?

Pas exactement. BBB prend en charge l'iframe embed (joinMethod='iframe', l'étudiant voit le cours dans Studeia). Zoom, Teams et Meet s'ouvrent dans un nouvel onglet (joinMethod='external', X-Frame-Options bloque l'iframe). L'interface affiche une carte avec un compte à rebours + un bouton « Rejoindre » pour ces 3 providers.

Les enregistrements sont-ils disponibles automatiquement ?

Oui, automatiquement. Le webhook du provider notifie lorsque l'enregistrement est prêt + le cron /api/cron/recording-sync s'exécute toutes les 15 min en tant que fallback. recordingUrl est enregistré dans LiveClass. Pour Zoom/Teams : la transcription VTT est également capturée (crée un LiveClassTranscription pouvant être ingéré dans le RAG).

Puis-je restreindre un cours en direct à un groupe spécifique ?

Oui. LiveClass.classGroupId est optionnel. Lorsqu'il est défini : seuls les étudiants de ce groupe voient le cours et peuvent le rejoindre (règle critique 45-48). Sans classGroupId : tous les étudiants inscrits au cours peuvent le voir.

Veja tambem

Cours en direct multi-provider (BBB, Zoom, Teams, Meet)