Documentación / Resolución de problemas / El dispositivo solo reproduce una o algunas campañas

El dispositivo solo reproduce una o algunas campañas

Introducción y orientación

La pantalla solo reproduce una o unas pocas campañas, aunque los detalles del dispositivo, en Campañas publicadas, muestran más. Reiniciar no ha ayudado. Esta guía explica cómo revisar los ajustes, comparar las listas de reproducción e identificar archivos que puedan bloquear una actualización del contenido.

Lista de reproducción es la lista de campañas y sus reglas de reproducción. Si el reproductor no puede preparar un archivo necesario para una lista nueva, puede seguir utilizando la anterior. Otras causas posibles son la programación, los dispositivos de destino, la conectividad y el almacenamiento disponible.

Comprobaciones y resolución de problemas

Diagnostique el problema antes de realizar cambios. Los pasos 1–6 solo comprueban el estado actual. El paso 7 modifica la campaña en el portal; el paso 8 interrumpe brevemente la reproducción y modifica un archivo. No elimine en bloque listas de reproducción, archivos ni la base de datos.

Procedimiento de diagnóstico y reparación

  1. Compruebe las campañas en el portal.

    Abra los detalles del dispositivo afectado y la pestaña Campañas publicadas. En las campañas ausentes, compruebe que se dirigen a este dispositivo, están activas y tienen fechas y condiciones de reproducción válidas, incluidos días y horas. Compárelas con la hora real del dispositivo en el paso 3.

    Una campaña no programada para este momento no tiene por qué presentar un fallo. Si debería reproducirse y reiniciar no ha ayudado, continúe. Consulte también las guías de Campañas y Dispositivos.

  2. Abra la consola remota.

    El dispositivo debe estar en línea y comunicarse con el servidor. La consola remota requiere el rol de Administrador del servidor o superior. Ábrala como se indica en la guía Consola remota. Pegue el comando en el campo de entrada y envíelo con ✓. Pegue cada bloque multilínea completo, incluida la última línea PY.

    Una vista previa remota de la pantalla no da acceso a la consola. Si el dispositivo está desconectado, siga primero la guía Comprobación de la conectividad del dispositivo. Si su rol no permite el acceso, solicite a un administrador autorizado que realice estos pasos. Consulte Usuarios y permisos.

    Los siguientes comandos son para reproductores Linux con el servicio device-runtime.service y el directorio de trabajo /storage. Los bloques Python requieren Python 3; la prueba de URL requiere curl. Si la consola indica que un comando, servicio o ruta no existe, no continúe con los cambios en archivos. Contacte con soporte.
  3. Compruebe la hora, el espacio en disco y el servicio del reproductor.

    Comando para copiar:

    date
    df -h / /storage
    systemctl is-active device-runtime.service
    ls -lh --time-style=long-iso /storage/playlist /storage/playlist_new
    
    Qué apareceQué significa y qué hacer después
    Fecha y horaCompárelas con la hora local actual y la zona horaria. Una hora incorrecta puede afectar a la selección de campañas y a la conectividad.
    Espacio libre en la columna AvailSi el almacenamiento está lleno, siga la guía Espacio en disco insuficiente. Compruebe también la partición montada en /storage.
    activeEl servicio está en ejecución. Esto todavía no confirma que la reproducción sea correcta ni que la actualización haya tenido éxito.
    inactive, failed o archivos ausentesRevise los registros en el paso 5. No utilice la reparación temporal hasta haber verificado la instalación y la causa.

    /storage/playlist contiene la lista de reproducción aceptada actualmente por el reproductor. /storage/playlist_new contiene la nueva lista recibida, cuyos archivos prepara el reproductor antes de activarla. Una fecha más reciente o un tamaño diferente es una pista útil, pero no demuestra por sí solo un fallo. Los archivos pueden diferir temporalmente durante una descarga normal.

  4. Compare las campañas de ambas listas de reproducción.

    El siguiente bloque lee ambos archivos y muestra el ID numérico del dispositivo, el número de campañas y sus ID, nombres y fechas de validez. No modifica nada. Anote el ID numérico del dispositivo: la cabecera de la consola puede mostrar otro identificador que no debe utilizarse después en DEVICE_ID.

    Comando para copiar:

    python3 - <<'PY'
    import json
    for path in ['/storage/playlist', '/storage/playlist_new']:
        print('\nARCHIVO:', path)
        try:
            with open(path) as f:
                data = json.load(f)
            print('Dispositivo:', data.get('deviceId'))
            campaigns = data.get('campaigns', [])
            print('Número de campañas:', len(campaigns))
            for c in campaigns:
                print(c.get('campaignId'), c.get('nameCampaign'),
                      'desde:', c.get('start'), 'hasta:', c.get('end'))
        except Exception as e:
            print('ERROR:', e)
    PY
    

    Si la nueva lista contiene las campañas esperadas pero la actual solo contiene una selección antigua, busque un error de preparación en el siguiente paso. Si también faltan en el archivo nuevo, revise los ajustes y la recepción de las actualizaciones del portal. Un error de análisis JSON puede indicar un archivo incompleto o dañado; no lo sobrescriba manualmente sin más comprobaciones.

  5. Localice el error de descarga y compruebe la respuesta del servidor.

    Muestre las últimas 120 entradas del registro del servicio de los últimos 20 minutos. Busque errores repetidos, la URL del archivo y su ID. Si solo aparece el final de un error, aumente -n 120 o amplíe el intervalo de tiempo.

    Comando para copiar:

    sudo journalctl -u device-runtime.service --since "20 minutes ago" --no-pager -n 120 -o cat
    

    Salida de ejemplo: no la pegue en la consola. Ejemplo de un error resuelto con este procedimiento:

    https://files.screensoft.org/api/video/H265/1790935600695
    java.lang.IllegalStateException: Received 0 bytes ... /storage/video/1790935600695.mp4

    Received 0 bytes significa que el reproductor no recibió contenido de archivo utilizable. El mensaje por sí solo no explica la causa. En este ejemplo, el ID del archivo es 1790935600695; para su caso, anote el ID y la URL exacta de sus registros.

    Pegue la dirección exacta de sus registros en el campo resaltado; se insertará automáticamente en el comando. Conserve las comillas. La prueba descarta los datos descargados y no modifica archivos ni listas. No utilice automáticamente la dirección del ejemplo para otro dispositivo.

    Pegue la dirección exacta que empieza por https:// o http://. No pegue el mensaje completo ni una ruta /storage/video/…

    Falta la URL. La copia del comando está desactivada por ahora.

    2. Compruebe la dirección del comando y copie el bloque completo. La dirección se inserta automáticamente.

    Comando para editar y copiar:

    curl -sS -L --connect-timeout 10 --max-time 30 \
      --range 0-1023 --max-filesize 1048576 \
      -D - -o /dev/null \
      -w '\nHTTP: %{http_code}\nDescargado: %{size_download} bytes\n' \
      'PASTE_MEDIA_URL_HERE'
    
    Qué apareceQué significa y qué hacer después
    HTTP 404El servidor no ofrece el archivo en la dirección solicitada. Identifique su campaña en el paso 6 y corríjala en el paso 7.
    HTTP 401 / 403El servidor ha denegado el acceso. Revise los permisos y la configuración del servicio con soporte.
    HTTP 5xxError del servidor. Investigue el servicio de archivos; eliminar la lista no reparará el servidor.
    Error de DNS, conexión, tiempo de espera o TLSSiga el error concreto: compruebe la red, la resolución de nombres, la disponibilidad del servidor, la hora o el certificado. No desactive la verificación del certificado.
    HTTP 200 / 206 y datos no vacíosLa prueba ha recibido datos. No confirma que el vídeo completo esté íntegro o pueda reproducirse; busque otros errores en los registros.
    Límite de tamaño de curlEl servidor puede haber ignorado la solicitud de los primeros 1024 bytes. La prueba está limitada a 1 MiB y 30 segundos; alcanzar un límite no significa por sí solo que el archivo sea defectuoso.
  6. Localice la campaña por el ID del archivo.

    Introduzca primero el ID del archivo. El valor rojo 000 es solo un marcador de posición. El bloque busca el valor exacto del campo resourceId, también en las creatividades alternativas, y muestra las campañas coincidentes. Anote sus nombres e ID. Un bloque sin modificar con el valor 000 finaliza de forma segura sin cambiar nada.

    Utilice el número después de la última barra de la URL del paso 5. No es el ID de campaña ni de dispositivo. Introdúzcalo sin la extensión .mp4.

    Falta el ID. No copie todavía el comando.

    2. Compruebe la línea resaltada en rojo y copie el comando completo. Al introducir un ID válido, se inserta automáticamente en el comando y se activa el botón Copiar.

    Comando para editar y copiar:

    python3 - <<'PY'
    import json
    RESOURCE_ID = 000  # INTRODUZCA AQUÍ EL ID DEL ARCHIVO
    if RESOURCE_ID <= 0:
        raise SystemExit('Introduzca primero el ID del archivo en RESOURCE_ID.')
    with open('/storage/playlist_new') as f:
        data = json.load(f)
    def contains_resource(value):
        if isinstance(value, dict):
            return value.get('resourceId') == RESOURCE_ID or any(
                contains_resource(v) for v in value.values())
        if isinstance(value, list):
            return any(contains_resource(v) for v in value)
        return False
    found = False
    for c in data.get('campaigns', []):
        if contains_resource(c):
            found = True
            print('Campaña:', c.get('nameCampaign'))
            print('ID de campaña:', c.get('campaignId'))
            print('Creatividad principal:', c.get('primary'))
            print('Creatividades alternativos:', c.get('alternative'))
    if not found:
        print('Archivo no encontrado en la nueva lista. Compruebe los últimos registros y el ID.')
    PY
    

    Si no se encuentra el archivo, puede haber cambiado entretanto. Vuelva a comprobar los últimos registros y la nueva lista. Si varias campañas utilizan el archivo, corregir una sola puede no bastar; revise todas las coincidencias.

  7. Corrija la campaña en el portal.

    Abra la campaña identificada por su nombre e ID. Sustituya el archivo no disponible por uno recién cargado o pause temporalmente la campaña y guarde el cambio. Consulte las guías de Multimedia y Campañas.

    Espere a que llegue la lista actualizada y se descarguen sus archivos. El tiempo depende de la conexión y del tamaño. Repita las comprobaciones de los pasos 3 y 4: tras pausar la campaña o sustituir el archivo, la nueva lista ya no debe hacer referencia al archivo defectuoso.

    Si el archivo no cambia y mantiene la referencia original, la lista actualizada aún no ha llegado. Compruebe el estado en línea y que se guardó el cambio en el portal. Reiniciar por sí solo no puede recuperar un archivo para el que el servidor sigue devolviendo HTTP 404. Si necesita restablecer temporalmente los demás anuncios, continúe con el paso 8; si no, verifique el resultado en el paso 9.

  8. Reparación local temporal con copia de seguridad.

    Procedimiento de mantenimiento: interrumpe brevemente la reproducción. Utilice este procedimiento solo después de confirmar el archivo no disponible y su campaña. El script elimina una campaña completa de la nueva lista, no solo su vídeo. Ejecútelo en el dispositivo correcto cuando sea aceptable una breve interrupción.

    El script verifica todos los ID, detiene únicamente device-runtime.service, realiza una copia de ambos archivos en /storage/playlist-backup-DATUM-CAS, elimina la campaña indicada de playlist_new y vuelve a iniciar el servicio. No sobrescribe directamente la lista actual ni elimina archivos multimedia. Antes de escribir crea una copia; si falla la edición, intenta restaurar la nueva lista original. Si se produce un error dentro del bloque, también intenta reiniciar el servicio, siempre que pueda terminar; no puede gestionar así un corte de alimentación o una finalización forzada.

    Antes de ejecutarlo, rellene los tres campos siguientes:

    • DEVICE_ID: ID numérico del dispositivo del paso 4.
    • CAMPAIGN_ID: ID de campaña del paso 6.
    • RESOURCE_ID: ID del archivo no disponible de los registros.

    No utilice los ID de ejemplo salvo que se trate exactamente de ese caso. Los valores rojos 000 son una protección: la copia permanece desactivada hasta rellenar todos los ID y el script sin modificar no hace cambios. Debe quedar al menos otra campaña en el dispositivo.

    1. Introduzca los tres ID antes de copiar

    Cada número identifica un elemento distinto. Compruébelos con los pasos 4 y 6; no utilice automáticamente los valores de ejemplo.

    Del paso 4; no el identificador de la cabecera de la consola.

    Del paso 6; no es el ID del archivo.

    El mismo ID de archivo comprobado en el paso 6.

    Introduzca los tres ID. La copia del comando está desactivada por ahora.

    2. Compruebe los tres valores resaltados en rojo y copie el bloque completo. La ejecución interrumpe brevemente la reproducción. El script también comprueba que los ID del dispositivo, la campaña y el archivo coincidan con el contenido de la lista.

    Comando para editar y copiar:

    sudo python3 - <<'PY'
    import json
    import shutil
    import subprocess
    from datetime import datetime
    from pathlib import Path
    
    DEVICE_ID = 000
    CAMPAIGN_ID = 000
    RESOURCE_ID = 000
    
    if min(DEVICE_ID, CAMPAIGN_ID, RESOURCE_ID) <= 0:
        raise SystemExit('Introduzca primero los tres ID. No se ha cambiado nada.')
    
    root = Path('/storage')
    path = root / 'playlist_new'
    service = 'device-runtime.service'
    
    def contains_resource(value):
        if isinstance(value, dict):
            return value.get('resourceId') == RESOURCE_ID or any(
                contains_resource(v) for v in value.values())
        if isinstance(value, list):
            return any(contains_resource(v) for v in value)
        return False
    
    def prepare():
        data = json.loads(path.read_text())
        if data.get('deviceId') != DEVICE_ID:
            raise RuntimeError('El ID del dispositivo no coincide.')
        matches = [c for c in data.get('campaigns', [])
                   if c.get('campaignId') == CAMPAIGN_ID]
        if len(matches) != 1 or not contains_resource(matches[0]):
            raise RuntimeError('La campaña o el archivo no coincide con los ID indicados.')
        data['campaigns'] = [c for c in data['campaigns']
                             if c.get('campaignId') != CAMPAIGN_ID]
        if not data['campaigns']:
            raise RuntimeError('No quedaría ninguna campaña tras la exclusión.')
        return data
    
    prepare()
    backup = root / ('playlist-backup-' + datetime.now().strftime('%Y%m%d-%H%M%S-%f'))
    backup.mkdir()
    subprocess.run(['systemctl', 'stop', service], check=True)
    saved = False
    try:
        for name in ('playlist', 'playlist_new'):
            shutil.copy2(root / name, backup / name)
        saved = True
        data = prepare()
        path.write_text(json.dumps(data, ensure_ascii=False))
        print('Copia de seguridad:', backup)
        print('Campañas conservadas:', len(data['campaigns']))
    except Exception:
        if saved:
            shutil.copy2(backup / 'playlist_new', path)
        raise
    finally:
        subprocess.run(['systemctl', 'start', service], check=True)
    PY
    

    Una salida correcta incluye la ruta de la copia y el número de campañas conservadas. Guarde la ruta para soporte. Si el script indica que los ID no coinciden, no quite las comprobaciones: vuelva al paso 4 o 6. Si falla la escritura, la restauración o el inicio del servicio, envíe la salida completa a soporte; no sustituya manualmente la lista actual por la nueva.

    Esta reparación temporal solo afecta a este dispositivo. No cambia los ajustes del servidor. Una actualización posterior puede volver a enviar la campaña defectuosa. Complete también la corrección del portal del paso 7. Otro archivo ausente puede seguir bloqueando la activación.
  9. Verifique la activación de la lista y la reproducción real.

    Tras aproximadamente un minuto, compruebe el servicio y los registros; deje más tiempo para archivos grandes. Este bloque no realiza cambios.

    Comando para copiar:

    systemctl is-active device-runtime.service
    ls -lh --time-style=long-iso /storage/playlist /storage/playlist_new
    sudo journalctl -u device-runtime.service --since "2 minutes ago" --no-pager -o cat | tail -50
    

    Vuelva a listar las campañas con el comando del paso 4. La lista actual debe contener la nueva selección esperada, el servicio debe estar activo y los registros actuales ya no deben repetir el mismo error de descarga. Que los tamaños coincidan no es prueba suficiente.

    Por último, observe la pantalla física o su vista previa remota durante un ciclo publicitario completo. Verifique que se muestran todas las campañas que corresponden según sus condiciones actuales. Ajuste el periodo de observación para campañas programadas o con intervalos entre reproducciones.

  10. Si el problema persiste.

    • Aparece otro ID de archivo: repita los pasos 5 y 6 para el nuevo archivo. El bloqueo anterior puede haber ocultado otro.
    • La nueva lista no ha llegado: compruebe el estado en línea, el dispositivo de destino y el cambio guardado. Una edición local no demuestra que las actualizaciones del servidor se entreguen correctamente.
    • La lista está activa, pero sigue faltando un anuncio: revise las condiciones de programación y otros errores de reproducción. Este procedimiento no soluciona automáticamente todos los fallos de vídeo o programación.
    • El servicio no está en ejecución: compruebe su estado con el comando siguiente y envíe el resultado a soporte.

    Comando para copiar:

    sudo systemctl status device-runtime.service --no-pager

    Envíe a su proveedor el ID del dispositivo, la hora local del problema con la zona horaria, los nombres de las campañas esperadas, ambas listas, el error relevante del registro y el resultado de la prueba de URL. Si realizó la reparación local, incluya su salida y la ruta de la copia. No envíe contraseñas ni credenciales de acceso.

¿No ha encontrado lo que buscaba?
Póngase en contacto con su proveedor de software.