Airi

Reproductor

Un reproductor profesional que incrustas con una línea, conectado a tu almacenamiento y a tu DRM. Es gratis: pagas la entrega y las licencias que la reproducción ya consume, no el reproductor.

Qué es #

Un player es una configuración con nombre — colores, controles, restricciones — guardada en tu cuenta. La incrustas en cualquier web con su id, junto al vídeo que quieras reproducir. Un player sirve para todo tu catálogo: el embed elige el contenido, el player pone el resto.

Por debajo es Shaka Player, el reproductor de código abierto que mantiene Google: HLS y DASH adaptativos, mp4 progresivo, DRM. Nosotros añadimos la configuración persistente, la firma de URLs, la conexión con tu DRM y el embed de una línea.

Por qué es gratis

Un reproductor no genera coste por existir. Lo que cuesta es lo que ya cobramos por sus propios servicios: los GB que sirve la CDN y las licencias DRM que emite tu cuenta. Cobrar además por el reproductor sería cobrar dos veces, y regalarlo hace más valioso todo lo demás.

¿Prefieres montar el reproductor tú mismo, con tu propio Shaka o Video.js? La guía de integración manual sigue ahí — el player es opcional por diseño.

Incrustarlo #

Dos formas. La recomendada es el cargador: construye el iframe con los permisos correctos (autoplay, encrypted-media, pantalla completa), que escritos a mano se olvidan.

Con el cargador (recomendado)
<div data-airi-player="PLAYER_ID" data-file="FILE_ID"></div>
<script async src="https://airi.live/player.js"></script>
Iframe directo
<iframe
  src="https://airi.live/embed/PLAYER_ID?file=FILE_ID"
  style="aspect-ratio:16/9;width:100%;border:0"
  allow="autoplay; encrypted-media; fullscreen; picture-in-picture"
  allowfullscreen></iframe>

FILE_ID es el id (o tu customId) de un fichero de tu almacenamiento: un mp4 suelto o un paquete HLS/DASH. Para una fuente externa usa data-src="https://…" en lugar de data-file. En una SPA que pinta el div después de cargar, llama a AiriPlayer.scan().

AtributoQué hace
data-airi-playerEl id del player. Obligatorio.
data-fileFichero de tu almacenamiento (id o customId).
data-srcURL https externa (mp4, m3u8 o mpd), sin firmar.
data-aspectProporción del contenedor (16:9 por defecto).
data-*Cualquier parámetro de la tabla siguiente, como atributo.

Parámetros por URL #

Cada embed puede ajustar el player sin tocar su configuración guardada. La precedencia es URL > configuración > defectos, y solo alcanza a presentación y reproducción — la entrega (caducidades, países, velocidad) y los dominios permitidos no se pueden tocar desde una URL, por construcción.

ParámetroQué hace
autoplay=1Arranca solo, en silencio (política de los navegadores).
muted=1Empieza sin sonido.
loop=1Repite en bucle.
t=90Empieza en el segundo 90.
rate=1.5Velocidad inicial.
maxh=720Techo de calidad en líneas.
lang=enIdioma de los controles (es, en, auto).
captions=esSubtítulos en ese idioma, visibles desde el inicio.
audio=enPista de audio preferida.
poster=https://…Imagen de espera.
accent=22ccaaColor de acento, hex sin #.
bigplay=0Sin botón grande de play.
controls=0Sin controles — para vídeos de fondo.

La configuración #

El panel cubre lo habitual con vista previa en vivo. La superficie completa —orden exacto de los botones, velocidades del menú, colores de cada barra— vive en el objeto config del API, agrupada en cuatro bloques:

BloqueQué contiene
themeColores de acento y de las barras, proporción, póster, logo con enlace, posición y opacidad.
playbackAutoplay, silencio, bucle, posición inicial, velocidad, techo de calidad, idiomas de audio y subtítulos.
uiQué botones aparecen y en qué orden, menú desbordante, velocidades, barra de progreso, botón grande, atajos de teclado, gestos móviles, idioma, título.
deliveryVigencia de la URL firmada, países permitidos o bloqueados, tope de velocidad. Se aplican en el borde de la CDN.

Todo es opcional: {} es un player completamente funcional con los defectos de Shaka. El esquema exacto, con cada campo documentado, está en la referencia OpenAPI bajo PlayerConfig.

Por API #

Los players se gestionan con los scopes player:read y player:write. El id que devuelve la creación es el que va en el embed.

Crear un player
curl -X POST https://kms.airi.live/v1/players \
  -H "Authorization: Bearer $TOKEN" \
  -H 'content-type: application/json' \
  -d '{
    "name": "Mi player",
    "config": {
      "theme": { "accentColor": "#22ccaa" },
      "playback": { "muted": true }
    },
    "allowedOrigins": ["https://miweb.com"]
  }'
Gestión
# Listar
curl "https://kms.airi.live/v1/players" -H "Authorization: Bearer $TOKEN"

# Actualizar (config = reemplazo completo; allowedOrigins: null la quita)
curl -X PATCH "https://kms.airi.live/v1/players/$ID" \
  -H "Authorization: Bearer $TOKEN" -H 'content-type: application/json' \
  -d '{ "config": { "ui": { "locale": "en" } } }'

# Borrar — todos los embeds con este id dejan de funcionar al momento
curl -X DELETE "https://kms.airi.live/v1/players/$ID" -H "Authorization: Bearer $TOKEN"

El embed llama a un endpoint público de resolución — GET /v1/players/{id}/resolve — que devuelve la configuración y, si se pide contenido, su URL firmada y los endpoints de licencia. Puedes llamarlo tú mismo para construir tu propio reproductor sobre nuestra resolución: no requiere token.

Restringir a tus dominios #

Un embed público funciona en cualquier web — es el modelo YouTube, y para la mayoría es lo correcto. Si quieres que tu player solo funcione en tus sitios, dale una lista de orígenes:

ejemplo
curl -X PATCH "https://kms.airi.live/v1/players/$ID" \
  -H "Authorization: Bearer $TOKEN" -H 'content-type: application/json' \
  -d '{ "allowedOrigins": ["https://miweb.com", "https://www.miweb.com"] }'

El muro de verdad no es una comprobación nuestra: el documento del embed responde con Content-Security-Policy: frame-ancestors y es el navegador del espectador el que se niega a pintar el iframe fuera de tu lista. La resolución además contesta 403 cuando el origen no cuadra, como fallo rápido.

Qué protege y qué no

Protege contra el embed casual en webs ajenas — el caso real. No es DRM: quien pueda ver el vídeo siempre podrá grabar la pantalla, y las URLs firmadas caducan según delivery.urlTtlSeconds. Para contenido que necesita protección de verdad, cífralo al codificar: el player lo reproduce igual de fácil.

DRM automático #

Si un paquete salió cifrado de tu codificación, el embed lo sabe sin que configures nada: la resolución detecta la clave del trabajo y entrega los endpoints de licencia de tu propio DRM. La web que incrusta no ve claves ni URLs de licencia — solo el div y el script de siempre.

Cada reproducción con DRM emite licencias, y cada licencia se cobra a la tarifa de siempre ($0.009). Es el mismo coste con nuestro player o con el tuyo.

Límites de esta versión #

  • Sin Chromecast. El botón de Cast llegará con un receptor propio; preferimos no enseñar un botón que falla.
  • FairPlay pendiente — ver la nota de Safari, arriba.
  • data-src externo no lleva DRM: una URL ajena no puede resolver licencias nuestras.
  • Los mp4 sueltos reproducen en progresivo: sin escalera adaptativa ni menú de calidad. Codifícalos para tener ABR — es exactamente para lo que existe la codificación.
  • Sin analíticas de reproducción todavía: los datos de entrega están en tu facturación diaria.