CreaRack-SL

MediaAsset · Modelo signage

Entidadactiveverificado 2026-04-21#signage#model#media#video#svg

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:

CampoTipoNotas
organizationFK(core.Organization, CASCADE)Scope tenant
nameCharField(255)Nombre de display
file_pathCharField(500)Ruta relativa bajo MEDIA_ROOT/signage/; vacío para URL/stream
thumbnail_pathCharField(500)Miniatura post-proceso
asset_typeCharField(choices)image/video/html5/url/stream
statusCharField(choices)uploading/processing/ready/error
mime_typeCharField(100)MIME detectado
file_sizeBigIntegerFieldBytes; cuota workspace
durationFloatField(null)Segundos; solo vídeo/stream
resolutionCharField(20)1920x1080
metadataJSONFieldCódec, bitrate, color space
transcoded_variantsJSONField{"1080p": "path", "720p": "path"}
tagsArrayField(CharField)Libres; ["corporate"] tiene semántica especial
created_at / updated_atDateTimeFieldAuto

Meta:

  • ordering = ["-created_at"].
  • Índice idx_media_org_type sobre (organization, asset_type).
  • verbose_name = "Media Asset".

Métodos:

  • __str__ — "{name} ({asset_type_display})". Sin lógica adicional; los procesos viven en signage/tasks.py y signage/api/content.py.

Dependencias entrantes

MóduloUso
signage.PlaybackLogFK nullable asset — proof-of-play; SET_NULL
signage/api/content.pyCRUD completo: create, list, get, update, delete, bulk-delete, tag
signage/api/playlists.pyLookup por IDs para compose_project_svg
signage/api/portal.pyUpload desde portal cliente; swap en playlist
signage/views.pyLista/upload con filtro por tag
signage/views_publish.pyResolución en publish, corporate image, scheduled download
signage/services/deployment.pyCarga assets por IDs para SVG de despliegue
monitoring/api/signage/deploy.pyCorporate image: create/delete con tag corporate
core/workspace_api.pySUM(file_size) para cuota de storage
signage/tasks.pyprocess_media_asset: actualiza status, duration, resolution, metadata, thumbnail

Dependencias salientes

  • core.Organization — FK CASCADE.
  • django.contrib.postgres.fields.ArrayField — campo tags.
  • MEDIA_ROOT/signage/ — filesystem local o remoto.
  • signage/services/svg_composer.py — consume asset.file_path y asset.duration en _render_slide/_render_overlay; usa os.path.basename(asset.file_path) para generar xlink:href en <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()
  • entity--signage--model--playlist — referencia assets via JSON items[].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]]