Proveedores soportados
| Proveedor | Auth | Unirse | Grabaciones | Transcript |
|---|---|---|---|---|
| BBB | sharedSecret | iframe | Sí, API nativa | Texto proporcionado |
| Zoom | Server-to-Server OAuth | nueva pestaña | Webhook + cron | VTT auto |
| Teams | Client Credentials | nueva pestaña | Graph API + cron | VTT auto |
| Google Meet | OAuth + Calendar API | nueva pestaña | Calendar API + cron | Manual en 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?) aplica cascada:
liveClass.videoProvider(si se especifica en la clase)VideoProviderConfig.isDefault(proveedor predeterminado del tenant)Tenant.config.bbb(legacy backward compat)- Variables de entorno BBB (fallback global)
Configuración por proveedor
BBB (predeterminado)
Prerequisito: instancia BBB en ejecución. Configuración > Proveedor de Video > BBB > URL + Shared Secret.
Zoom
- Cree una Server-to-Server OAuth app en Zoom Marketplace
- Scopes:
meeting:read,meeting:write,recording:read,user:read - Configuración > Proveedor de Video > Zoom > Account ID + Client ID + Client Secret
- Webhook:
/api/webhooks/video/zoomcon HMAC SHA-256 viax-zm-signature
Teams
- Azure AD App Registration
- Permisos: Microsoft Graph
OnlineMeetings.ReadWrite.All,OnlineMeetingRecording.Read.All - Configuración > Proveedor de Video > Teams > Tenant ID + Client ID + Client Secret + correo del organizador
- Webhook: Graph Change Notifications (validación de suscripción via
validationToken)
Google Meet
- Google Cloud Console > APIs > Calendar API + Meet REST API v2
- OAuth 2.0 Client (Web application)
- Configuración > Proveedor de Video > Google Meet > Client ID + Client Secret
- Flujo de admin consent via OAuth (redirige a Google)
- Limitación: endMeeting no está soportado via API — el adapter marca como completed localmente
Credenciales
Almacenadas en VideoProviderConfig con AES-256-GCM:
encryptedCredentials— JSON blob cifradoencryptionIv+encryptionAuthTag- OAuth tokens (Teams/Meet):
accessToken,refreshToken,tokenExpiresAt
Unique: [tenantId, provider] — una configuración por proveedor por tenant.
Webhooks y recording sync
Cada proveedor tiene su propio esquema. Studeia normaliza mediante webhook handlers + cron fallback:
POST /api/webhooks/video/zoom— meeting events + recording.completedPOST /api/webhooks/video/teams— Graph notificationsGET /api/cron/recording-sync— polling cada 15 min para meetings completados sin recordingUrl
Los webhooks son poco confiables (retrasos, expiración de suscripciones). El cron siempre actúa como fallback.
Transcripción
Zoom y Teams proporcionan VTT nativamente tras la grabación. Studeia crea LiveClassTranscription con:
transcriptionText(parseado del VTT)transcriptionLanguage- estado: pending → transcribing → review → approved → ingested
Tras la aprobación, el administrador puede iniciar la ingestión en el RAG del curso. Detalles en Media Transcription.
Alcance por grupo
LiveClass.classGroupId es opcional. Cuando está configurado:
- Solo los estudiantes de ese grupo lo ven en /live-classes/
- Solo los estudiantes del grupo pueden unirse (validado en el join)
- Las notificaciones son solo para el grupo
Sin classGroupId: course-wide (todos los matriculados).
Limitaciones
- BBB: requiere instancia auto-hospedada (o proveedor BBB gestionado). Costos: $20-200/mes según el tamaño.
- Zoom: límite de duración según el tier (free=40 min, pago=ilimitado).
- Teams: endMeeting no está soportado via API.
- Google Meet: grabación/transcripción iniciada manualmente por el host.
- Streaming a YouTube/Twitch: no soportado de forma nativa.