Volver a la wiki

Digital Signage — Flujo SpinetiX

Digital Signage — Flujo SpinetiX

Qué es

Pipeline completo para publicar contenido multimedia en reproductores SpinetiX HMP (Hyper Media Player). Abarca desde composición de proyecto SVG dinámico hasta descarga autónoma por el dispositivo físico, sin requerir conexión permanente con el servidor.

Por qué existe

Los SpinetiX usan Scheduled Download: consultan periódicamente una URL HTTP para obtener índice WebDAV (spx-listing.xml) y descargan solo archivos cambiados. Esto exige endpoints públicos sin autenticación de sesión, identificados por token UUID (publish_token) por SignagePlayer. El módulo resuelve el contrato para que el reproductor opere autónomo incluso con NAT o cortafuegos.

Componentes

SpinetiXAdapter (signage/services/adapters/spinetix.py): adapter async con 2 protocolos:

Auth opcional: si credentials["username"] existe, aiohttp.BasicAuth.

SVG Composer (signage/services/svg_composer.py): genera SVG completo compatible SpinetiX desde items de playlist.

Scheduled Download — endpoints públicos (signage/views_publish.py): bajo /signage/publish/<token>/ sin CSRF ni auth de sesión:

EndpointFunción
spx-listing.xml (o PROPFIND raíz)DAV:multistatus XML con project.svg, index.svg y media files, con size, content-type, ETag
project.svg / index.svgGenera SVG dinámico en tiempo real via compose_project_svg()
<filename>Sirve binario del MediaAsset via FileResponse

Cada request a spx_listing actualiza last_heartbeat y status="online" del player (proof-of-life pasivo). Si hay current_schedule, se evalúa con scheduling.engine.evaluate_schedule() para determinar playlist activa antes de componer SVG.

Despliegue activo (signage/services/deployment.py): execute_deployment(deployment_id) punto de entrada del task Huey. Modo push:

  1. Carga ContentDeployment, pone estado deploying.
  2. Resuelve IP del player desde device_profile o monitoring_target.
  3. Descifra credenciales sensibles (password, api_key, token) con CredentialManager.safe_decrypt.
  4. Instancia adapter correcto via registry.get_adapter(slug, ip, creds, config).
  5. Ejecuta en nuevo event loop: push_content() por cada archivo + set_playlist() + set_schedule() si aplica.
  6. Agrega resultados por player (ok/partial/error) y actualiza deployment_results.

Estado final: deployed, failed o partial.

Flujos

Scheduled Download (principal SpinetiX):

Operador → edita Playlist → asigna a SignagePlayer (current_playlist)
SpinetiX HMP → GET /signage/publish/<token>/spx-listing.xml (periódico)
  → _get_playlist_items() resuelve MediaAssets
  → compose_project_svg() genera project.svg dinámico
  → respuesta DAV:multistatus con ETags
HMP → compara ETags, descarga solo archivos nuevos
  → GET /signage/publish/<token>/project.svg
  → GET /signage/publish/<token>/<imagen_o_video>
HMP → reproduce nativamente (animaciones SVG + spx:repeatCount)
Cada fetch → actualiza last_heartbeat (proof-of-life)

Despliegue activo (push para otros adapters):

API POST /api/signage/deployments/ → Huey → execute_deployment(id)
  → _deploy_to_player() por cada player
      → adapter.push_content() via WebDAV
      → adapter.set_playlist() via JSON-RPC
      → adapter.set_schedule() via JSON-RPC
  → ContentDeployment.status = deployed|partial|failed

Proof-of-play:

Véase también

Subir