/** * Tipos de `val-video-player` (ADR-087 — video como servicio de plataforma). * * Espejo agnóstico al dominio de `content.VideoAsset` (backend Go, * `backend/go/services/content/video.go`) — mismos nombres de campo en * camelCase. Cualquier app pasa acá el `VideoAsset` que le devuelve SU propio * backend (sermón en Eklesee, receta en Okhelia, animal en Chesed, artículo de * ayuda) con un mapeo trivial; el componente no conoce ni le importa de qué * dominio viene. */ export type VideoPlayerSource = 'upload' | 'link'; /** Solo aplica a `source: 'upload'`. Un link normalizado con éxito nace en 'ready'. */ export type VideoPlayerStatus = 'uploading' | 'processing' | 'ready' | 'failed' | 'rejected'; export interface VideoPlayerCaption { locale: string; url: string; } export interface VideoPlayerAsset { source: VideoPlayerSource; /** * `source:'upload'` → URL de reproducción ya presignada por el backend * (TTL corto, ~15 min — ADR-087 §6). Úsala directo, no la cachees ni la * persistas: se recalcula en cada lectura del documento. * `source:'link'` → URL normalizada del proveedor (no se usa para el * embed, ver `externalId`). */ url?: string; /** `'youtube' | 'vimeo'` — solo si `source: 'link'`. */ provider?: string; /** * ID ya normalizado por el backend — el ÚNICO dato que arma el iframe de * embed. El componente NUNCA arma un `src` con datos crudos del usuario. */ externalId?: string; durationSec?: number; /** Portada — se muestra mientras el video no está `ready` (mejor percepción de carga). */ thumbnail?: string; captions?: VideoPlayerCaption[]; status?: VideoPlayerStatus; /** * Motivo legible de `failed`/`rejected`, ya en el idioma que decidió el * backend (es-CL) — se muestra tal cual, no es un código a traducir. */ failReason?: string; }