MediaAsset · Modelo signage
Propósito
MediaAsset representa cualquier recurso multimedia subido o referenciado para reproducción en pantallas. Soporta 5 tipos: imagen, vídeo, widget HTML5, URL web, stream en directo. Almacena ruta bajo MEDIA_ROOT/signage/, metadatos técnicos (resolución, duración, códec) y variantes transcodificadas para servir calidad óptima al player destino. Ciclo: uploading → processing → ready | error, gestionado por process_media_asset en signage/tasks.py.
Contrato
Campos:
| Campo | Tipo | Notas |
|---|---|---|
organization | FK(core.Organization, CASCADE) | Scope tenant |
name | CharField(255) | Nombre de display |
file_path | CharField(500) | Ruta relativa bajo MEDIA_ROOT/signage/; vacío para URL/stream |
thumbnail_path | CharField(500) | Miniatura post-proceso |
asset_type | CharField(choices) | image/video/html5/url/stream |
status | CharField(choices) | uploading/processing/ready/error |
mime_type | CharField(100) | MIME detectado |
file_size | BigIntegerField | Bytes; cuota workspace |
duration | FloatField(null) | Segundos; solo vídeo/stream |
resolution | CharField(20) | 1920x1080 |
metadata | JSONField | Códec, bitrate, color space |
transcoded_variants | JSONField | {"1080p": "path", "720p": "path"} |
tags | ArrayField(CharField) | Libres; ["corporate"] tiene semántica especial |
created_at / updated_at | DateTimeField | Auto |
Meta:
ordering = ["-created_at"].- Índice
idx_media_org_typesobre(organization, asset_type). verbose_name = "Media Asset".
Métodos:
__str__—"{name} ({asset_type_display})". Sin lógica adicional; los procesos viven ensignage/tasks.pyysignage/api/content.py.
Dependencias entrantes
| Módulo | Uso |
|---|---|
signage.PlaybackLog | FK nullable asset — proof-of-play; SET_NULL |
signage/api/content.py | CRUD completo: create, list, get, update, delete, bulk-delete, tag |
signage/api/playlists.py | Lookup por IDs para compose_project_svg |
signage/api/portal.py | Upload desde portal cliente; swap en playlist |
signage/views.py | Lista/upload con filtro por tag |
signage/views_publish.py | Resolución en publish, corporate image, scheduled download |
signage/services/deployment.py | Carga assets por IDs para SVG de despliegue |
monitoring/api/signage/deploy.py | Corporate image: create/delete con tag corporate |
core/workspace_api.py | SUM(file_size) para cuota de storage |
signage/tasks.py | process_media_asset: actualiza status, duration, resolution, metadata, thumbnail |
Dependencias salientes
core.Organization— FK CASCADE.django.contrib.postgres.fields.ArrayField— campotags.MEDIA_ROOT/signage/— filesystem local o remoto.signage/services/svg_composer.py— consumeasset.file_pathyasset.durationen_render_slide/_render_overlay; usaos.path.basename(asset.file_path)para generarxlink:hrefen<image>/<video>SpinetiX.
Ejemplos
# Upload de imagen
asset = MediaAsset.objects.create(
organization=org,
name="Banner Q1",
file_path="signage/uploads/banner_q1.jpg",
asset_type="image",
status="uploading",
mime_type="image/jpeg",
file_size=204800,
)
# Uso en compose_project_svg (playlists.py)
assets_map = {a.id: a for a in MediaAsset.objects.filter(id__in=asset_ids, organization=org)}
playlist_items = [{"asset": assets_map[item["asset_id"]], "type": "image", "duration": 10}]
svg_content = compose_project_svg(playlist_items)
# Purgado imagen corporativa antes de reemplazar
MediaAsset.objects.filter(organization=org, tags__contains=["corporate"]).delete()
Related
entity--signage--model--playlist— referencia assets via JSONitems[].asset_id.entity--signage--model--signageplayer— recibe SVG generado a partir de los assets.concept--signage--deployment— ContentDeployment orquesta entrega a players.entity--signage--model--playbacklog— FK a MediaAsset para proof-of-play.
Véase también
- [[entity—signage—model—signageplayer]]
- [[entity—signage—model—playlist]]
- [[concept—signage—deployment]]
Referenciado desde
- Agente · dev-signage
- Auditoría Suprema 2 · Tanda 3: XSS almacenado en el portal de signage, el composer SVG y el editor
- Digital Signage — Flujo SpinetiX
- Digital Signage SaaS — Guía Completa
- El restore robaba los medios de Signage del org origen al restaurar en la misma instalación (v1.77.2)
- Fuga cross-tenant en el publicador anónimo de signage (playlist_id sin validar)
- SignagePlayer · Modelo signage
- SpinetiX HMP Integration Guide — CreaRack Pro