Saltar al contenido principal

Referencia del manifiesto del player

El manifiesto es el contrato entre el plugin de diseño y el player. Declara qué renderizar, cómo rutear entre variantes para un viewer dado, y qué ocurre cuando el viewer interactúa.

Lo produce el plugin de After Effects al publicar — normalmente no se escribe a mano — pero entenderlo explica qué puede y qué no puede hacer un template.

{
"version": "1.0.0",
"lottie": { "defaultUrl": "https://…/animation.json" }
}

version y lottie son los únicos campos obligatorios.

Contenido​

CampoTipoPropósito
lottieobjetoLa animación. defaultUrl más variants opcional
videoobjetoVideo de fondo. defaultUrl, variants opcional y mute
audioarregloPistas de audio. Cada una con id, defaultUrl, variants opcional y primary
posterobjetoImagen fija antes de la reproducción. url más variants opcional
fontsarregloArtefactos de glifos vectorizados, fusionados en el Lottie antes de renderizar

fonts​

Cada entrada es un artefacto .font.json que el player descarga y fusiona en la animación antes de renderizar. Por eso el texto personalizado se renderiza con la tipografía correcta sin depender de una webfont en tiempo de ejecución — sin @font-face, sin FOUT, y sin depender de que la máquina del destinatario tenga la fuente.

ClavePropósito
familyNombre de la familia tipográfica referenciada por el Lottie
fNameNombre de fuente usado dentro de la animación
urlDónde descargar el artefacto de glifos
styleCalificador de estilo opcional
ascentOverride de ascendente opcional

Personalización​

CampoTipoPropósito
dataSchemaobjetoDeclara los datos que el template espera
computedarregloValores derivados de los datos entregados antes de renderizar

dataSchema​

Cada clave describe un dato:

ClavePropósito
typestring, number o boolean
requiredSi los datos del viewer deben proveerlo
label, descriptionTexto para las personas, en el backoffice
fallbackValor usado cuando los datos no lo entregan

fallback es lo que hace resiliente a un template: un dato faltante renderiza el fallback en vez de fallar.

computed​

Cada entrada es { key, expr, outputType? }. La expresión se evalúa contra los datos del viewer antes de renderizar, y key se escribe de vuelta en los datos — así los campos computados posteriores pueden construir sobre los anteriores.

Las operaciones disponibles incluyen aritmética y redondeo (+, round, floor, ceil), lógica (if, and, or, in), concatenación (cat) y helpers de formato:

OperaciónPropósito
formatCLPFormato de moneda en pesos chilenos
formatNumberFormato de números
formatPercentFormato de porcentajes
formatDateFormato de fechas (YYYY, MMM, LL, short, long, numeric…)

Esto es lo que permite que un template muestre "ahorraste $1.234.567 este año" a partir de un número crudo, sin que el sistema del cliente tenga que pre-formatear nada.

Ruteo entre variantes​

lottie, video, audio, poster, textTracks y transcript aceptan variants, y todos usan la misma forma de regla:

{
"variants": {
"rules": [
{ "dataKey": "segmento", "equals": "premium", "src": "https://…/premium.json" }
]
}
}

Una regla coincide cuando el dataKey indicado en los datos del viewer es igual al valor dado. La regla que coincide entrega el asset — overlayUrl, videoUrl, audioUrl, posterUrl, src, o text en línea para transcripciones. Un viewer que no coincide con ninguna regla recibe el default.

La comparación es estricta, así que conviene que la regla se apoye en un campo computado booleano o numérico en vez de un data point crudo: los datos del host suelen llegar como texto, y "true" no es igual a true. El publicador emite un computado justamente por eso.

El poster sigue su PROPIO ruteo, independiente del video. Un template que rutea su video por un data point normalmente quiere que la imagen fija siga la misma rama —si no, anuncia una versión del video que a ese viewer no le va a tocar— pero se declaran por separado, así que pueden divergir a propósito.

Así un mismo template sirve a muchas audiencias: el ruteo ocurre por viewer, al momento de la vista, sin renderizar un video distinto por segmento.

Accesibilidad​

CampoTipoPropósito
textTracksarregloSubtítulos temporizados pintados sobre el video
transcriptobjetoAlternativa textual completa de todo el video

No son lo mismo, y la distinción importa para cumplimiento.

textTracks son subtítulos temporizados — cada uno con id, label, srcLang, src, variants opcional y default. Sirven a quien puede ver el video pero no oírlo.

transcript es la alternativa textual WCAG 1.2.1 / 1.2.8: el texto completo del video, útil para un lector de pantalla, cosa que los subtítulos temporizados no son. Lleva tokens {dataKey} que se interpolan con los datos resueltos del viewer — una transcripción tiene que describir lo que ese viewer vio — y soporta el mismo ruteo por variants, así que un viewer ruteado a otra composición lee el texto de esa composición.

El texto va en línea y no en un archivo aparte. En un template de 40 variantes las transcripciones medían 53 KB en crudo pero 1,7 KB comprimidas, porque son ~91% idénticas — archivos externos no habrían aportado nada.

Interacciones​

interactions mapea un id de CTA a lo que ocurre al hacer clic. Las claves se comparan contra el id de CTA emitido, sin distinguir mayúsculas.

ClavePropósito
navigateAbre la URL contenida en el dato nombrado por linkDataKey, con target opcional
setDataFusiona valores en los datos vivos, recalcula campos computados y reglas de variantes, y re-renderiza en el lugar
nameEtiqueta legible, reportada como cta_name en el evento cta.clicked. Si falta, se usa el id del CTA
questionAgrupa varios CTAs en una sola pregunta de encuesta

setData​

setData re-renderiza en el lugar — sin navegación ni recarga. Los valores pueden ser escalares literales o expresiones JSON-logic evaluadas contra los datos vivos al momento del clic, que es lo que habilita flujos como un selector de cantidad acotado.

El player evalúa cada valor de forma defensiva y conserva los datos previos cuando un valor no es evaluable. Un valor mal formado nunca se rechaza al cargar el manifiesto, porque eso haría fallar el manifiesto completo en vez de anular una sola clave.

Cuando ambos están presentes​

Ambos se ejecutan, en un orden definido: primero se aplica el parche de datos — así el link que ese mismo parche define es el que se abre — luego el link se abre sincrónicamente dentro del clic, y el re-render queda encolado detrás. El clic pausa automáticamente, como toda navegación.

question​

Las respuestas de una encuesta se autoran como CTAs independientes, así que sin question un clic es sólo un clic. Si dos CTAs comparten el mismo question, el player además emite interaction.engaged, con la pregunta como interaction_id / interaction_name y la etiqueta del CTA como interaction_value — que es lo que permite a la analítica reportar una distribución ("62% respondió Sí") en vez de dos conteos sin relación.

Es sólo para analítica y no afecta la reproducción.