import type { ChunkStorage } from '../lib/chunk-storage'; import type { AudioRecordStorage } from '../hooks/useScreenCapture'; import type { MediaTake } from '../lib/take-types'; import { type WaitingAd } from './SfuViewerRecorder'; /** Modes de capture. `sfu-viewer` (v2.1+) : enregistre un flux SFU distant. */ export type MultiTakeRecordingMode = 'screen-record' | 'audio-only' | 'sfu-viewer' | 'composite-split'; export type MultiTakeSurface = 'window' | 'full-screen'; export type MultiTakeOutputFormat = 'mp4' | 'webm' | 'gif'; export interface MultiTakeRecorderLogo { /** URL absolue ou relative vers le logo (PNG/JPEG/WebP). */ url?: string; position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'; sizePct?: number; opacity?: number; marginPct?: number; } export interface MultiTakeRecorderMeta { sessionId: string; recordingMode: MultiTakeRecordingMode; outputFormat: MultiTakeOutputFormat; surface: MultiTakeSurface; micEnabled: boolean; webcamEnabled: boolean; systemAudioEnabled: boolean; recordAudioSeparately: boolean; audioStorage: AudioRecordStorage; audioServerUrl: string; videoStorage: ChunkStorage; videoServerUrl: string; videoOnly: boolean; cameraDeviceId?: string; cameraLabelHint?: string; logo?: MultiTakeRecorderLogo; } export interface MultiTakeRecorderProps { /** Identifiant root pré-existant (reprise L3 — J4). Optionnel. */ initialSessionId?: string; /** Mode d'enregistrement initial. screen-record = capture écran (default). * audio-only = mic-only (délègue à AudioOnlyRecorder, single take). */ initialRecordingMode?: MultiTakeRecordingMode; /** Format de sortie passé à VideoEditor.defaultFormat (mp4 par défaut). */ initialOutputFormat?: MultiTakeOutputFormat; /** Hint du picker getDisplayMedia : 'window' ou 'full-screen' (Chrome only). */ initialSurface?: MultiTakeSurface; /** Activer le micro (default true). */ initialMicEnabled?: boolean; /** Activer l'overlay webcam (default true). */ initialWebcamEnabled?: boolean; /** Capter l'audio système (default true). */ initialSystemAudioEnabled?: boolean; /** Stratégie storage chunks vidéo. memory | indexeddb | filesystem | server. Défaut 'indexeddb' (L3 ready). */ initialVideoStorage?: ChunkStorage; /** Endpoint POST si videoStorage='server'. Défaut '/api/record/video'. */ initialVideoServerUrl?: string; /** Stratégie storage chunks audio quand recordAudioSeparately. Défaut 'memory'. */ initialAudioStorage?: AudioRecordStorage; /** Endpoint POST si audioStorage='server'. Défaut '/api/record/audio'. */ initialAudioServerUrl?: string; /** Audio séparé en plus de la vidéo (default false). */ initialRecordAudioSeparately?: boolean; /** v1.11.10 — vidéo pure (track audio retirée du combinedStream). Force * implicitement recordAudioSeparately=true. Use case : montage pro. */ initialVideoOnly?: boolean; /** Pré-sélection caméra par deviceId. */ cameraDeviceId?: string; /** Fallback robuste si deviceId obsolète. Match label case-insensitive (ex: 'Logitech'). */ cameraLabelHint?: string; initialLogo?: MultiTakeRecorderLogo; /** Room SFU (= classroom) à consommer en mode `sfu-viewer`. */ sfuRoom?: string; /** Base de l'API SFU pour le mode `sfu-viewer`. * Ex: `https://studio.amia.fr/api/sfu`. */ sfuApiBase?: string; /** ICE servers WebRTC pour le mode `sfu-viewer`. Défaut STUN public. */ sfuIceServers?: RTCIceServer[]; /** Mode `sfu-viewer` : salle d'attente (rejoindre la classe avant le prof). Défaut true. */ sfuWaitForPublisher?: boolean; /** Mode `sfu-viewer` : horaire prévu du cours → compte à rebours en salle d'attente. */ sfuScheduledStartAt?: number | string; /** Mode `sfu-viewer` : pubs affichées en carrousel pendant la salle d'attente. */ sfuWaitingAds?: WaitingAd[]; /** URL de base de la page viewer élève (pour le QR "viewer" du configure step). * Ex: `https://camera.amia.fr/classroom`. Si absent → fallback viewer.html démo. */ sfuViewerBaseUrl?: string; /** Durée max par take en ms (hard cap, défaut 30 min). */ maxTakeDurationMs?: number; /** URLs initiales des viewers protocoles. L'utilisateur peut les modifier * au runtime dans le panneau (persistance localStorage). Si non passé, * défaut studio.amia.fr (infra amia). */ defaultViewerUrls?: { sfu?: string; mcu?: string; p2p?: string; }; /** Préfixe de la clé localStorage utilisée pour persister les URLs viewers. */ viewerUrlsStorageKey?: string; /** Appelé quand l'utilisateur valide la session (clic "Aller à l'édition"). * Reçoit la liste des takes, le sessionId, ET la meta complète (settings finaux). */ onSessionComplete: (takes: MediaTake[], sessionId: string, meta?: MultiTakeRecorderMeta) => void; /** Appelé quand l'utilisateur annule. */ onCancel?: () => void; /** @deprecated utilise initialVideoStorage */ videoStorage?: ChunkStorage; /** @deprecated utilise initialAudioStorage */ audioStorage?: AudioRecordStorage; /** @deprecated utilise initialRecordAudioSeparately */ recordAudioSeparately?: boolean; /** @deprecated utilise initialWebcamEnabled */ webcamOverlay?: boolean; /** @deprecated utilise initialSystemAudioEnabled */ systemAudio?: boolean; } export default function MultiTakeRecorder({ initialSessionId, initialRecordingMode, initialOutputFormat, initialSurface, initialMicEnabled, initialWebcamEnabled, initialSystemAudioEnabled, initialVideoStorage, initialVideoServerUrl, initialAudioStorage, initialAudioServerUrl, initialRecordAudioSeparately, initialVideoOnly, cameraDeviceId, cameraLabelHint, initialLogo, sfuRoom, sfuApiBase, sfuIceServers, sfuWaitForPublisher, sfuScheduledStartAt, sfuWaitingAds, sfuViewerBaseUrl, maxTakeDurationMs, defaultViewerUrls, viewerUrlsStorageKey, onSessionComplete, onCancel, videoStorage, audioStorage, recordAudioSeparately, webcamOverlay, systemAudio, }: MultiTakeRecorderProps): import("react/jsx-runtime").JSX.Element; //# sourceMappingURL=MultiTakeRecorder.d.ts.map