Pular para o conteúdo

Aulas ao vivo multi-provider (BBB, Zoom, Teams, Meet)

Studeia suporta 4 provedores de video: BigBlueButton (padrao, iframe embed), Zoom (S2S OAuth), Microsoft Teams (Graph API), Google Meet (OAuth Calendar). Adapter pattern, webhook lifecycle, recording sync via cron.

2026-05-23 6 min
Resposta curta

Aulas ao vivo no Studeia suportam 4 provedores via adapter pattern: BigBlueButton (padrao, iframe embed), Zoom (Server-to-Server OAuth), Microsoft Teams (Graph API), Google Meet (OAuth Calendar). Credenciais criptografadas AES-256-GCM. Webhook lifecycle + cron de recording sync (fallback 15min). LiveClassTranscription automatica para Zoom/Teams (ingerivel no RAG).

Provedores suportados

ProviderAuthJoinRecordingsTranscript
BBBsharedSecretiframeSim, API nativaTexto fornecido
ZoomServer-to-Server OAuthnova abaWebhook + cronVTT auto
TeamsClient Credentialsnova abaGraph API + cronVTT auto
Google MeetOAuth + Calendar APInova abaCalendar API + cronManual no 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?) cascateia:

  1. liveClass.videoProvider (se especificado na aula)
  2. VideoProviderConfig.isDefault (provider padrao do tenant)
  3. Tenant.config.bbb (legacy backward compat)
  4. Env vars BBB (fallback global)

Setup por provider

BBB (padrao)

Pre-requisito: instancia BBB rodando. Settings > Video Provider > BBB > URL + Shared Secret.

Zoom

  1. Crie Server-to-Server OAuth app no Zoom Marketplace
  2. Scopes: meeting:read, meeting:write, recording:read, user:read
  3. Settings > Video Provider > Zoom > Account ID + Client ID + Client Secret
  4. Webhook: /api/webhooks/video/zoom com HMAC SHA-256 via x-zm-signature

Teams

  1. Azure AD App Registration
  2. Permissions: Microsoft Graph OnlineMeetings.ReadWrite.All, OnlineMeetingRecording.Read.All
  3. Settings > Video Provider > Teams > Tenant ID + Client ID + Client Secret + Organizer email
  4. Webhook: Graph Change Notifications (subscription validation via validationToken)

Google Meet

  1. Google Cloud Console > APIs > Calendar API + Meet REST API v2
  2. OAuth 2.0 Client (Web application)
  3. Settings > Video Provider > Google Meet > Client ID + Client Secret
  4. Admin consent flow via OAuth (redirect para Google)
  5. Limitacao: endMeeting nao suportado via API — adapter marca como completed localmente

Credenciais

Armazenadas em VideoProviderConfig com AES-256-GCM:

  • encryptedCredentials — JSON blob criptografado
  • encryptionIv + encryptionAuthTag
  • OAuth tokens (Teams/Meet): accessToken, refreshToken, tokenExpiresAt

Unique: [tenantId, provider] — um config por provider por tenant.

Webhooks e recording sync

Cada provider tem padrao proprio. Studeia normaliza via webhook handlers + cron fallback:

  • POST /api/webhooks/video/zoom — meeting events + recording.completed
  • POST /api/webhooks/video/teams — Graph notifications
  • GET /api/cron/recording-sync — polling a cada 15min para meetings completed sem recordingUrl

Webhooks sao unreliable (delays, subscription expiry). Cron sempre como fallback.

Transcricao

Zoom e Teams fornecem VTT nativamente apos recording. Studeia cria LiveClassTranscription com:

  • transcriptionText (parsed do VTT)
  • transcriptionLanguage
  • status: pending → transcribing → review → approved → ingested

Apos approved, admin pode disparar ingestao no RAG do curso. Detalhes em Media Transcription.

Escopo por turma

LiveClass.classGroupId opcional. Quando setado:

  • Apenas alunos daquela turma veem em /live-classes/
  • Apenas alunos da turma podem entrar (validado no join)
  • Notificacoes apenas para turma

Sem classGroupId: course-wide (todos matriculados).

Limitacoes

  • BBB: precisa de instancia auto-hospedada (ou managed BBB provider). Custos: $20-200/mes dependendo do tamanho.
  • Zoom: limite de duracao por tier (free=40min, paid=ilimitado).
  • Teams: endMeeting nao suportado via API.
  • Google Meet: gravacao/transcricao iniciada manualmente pelo host.
  • Streaming para YouTube/Twitch: nao suportado nativamente.

Veja tambem

FAQ

Qual provider de video Studeia usa?

4 opcoes: BigBlueButton (padrao, iframe embed, open-source), Zoom (Server-to-Server OAuth), Microsoft Teams (Azure AD Client Credentials), Google Meet (OAuth admin consent). Admin escolhe por tenant (VideoProviderConfig padrao) ou por aula especifica (LiveClass.videoProvider override).

BBB e Zoom funcionam do mesmo jeito para o aluno?

Nao exatamente. BBB suporta iframe embed (joinMethod='iframe', aluno ve aula dentro do Studeia). Zoom, Teams e Meet abrem em nova aba (joinMethod='external', X-Frame-Options bloqueia iframe). UI exibe card com countdown + botao 'Entrar' para esses 3.

Gravacoes ficam disponiveis?

Sim, automaticamente. Webhook do provider notifica quando recording esta pronto + cron /api/cron/recording-sync roda a cada 15min como fallback. recordingUrl salvo em LiveClass. Para Zoom/Teams: transcript VTT tambem capturado (cria LiveClassTranscription que pode ser ingerida no RAG).

Posso restringir aula ao vivo a uma turma especifica?

Sim. LiveClass.classGroupId opcional. Quando setado: apenas alunos daquela turma veem e podem entrar (regra critica 45-48). Sem classGroupId: todos matriculados no curso veem.

Veja tambem

Aulas ao vivo multi-provider (BBB, Zoom, Teams, Meet) | Studeia Docs