Documentazione / Risoluzione dei problemi / Il dispositivo riproduce soltanto una o alcune campagne

Il dispositivo riproduce soltanto una o alcune campagne

Introduzione e orientamento

Lo schermo riproduce soltanto una o poche campagne, anche se nei dettagli del dispositivo in Campagne pubblicate ne compaiono altre. Il riavvio non è servito. Questa guida La accompagna nella verifica delle impostazioni, nel confronto delle playlist e nell'individuazione dei contenuti multimediali che potrebbero bloccare un aggiornamento.

Playlist è l'elenco delle campagne e delle relative regole di riproduzione. Se il player non riesce a preparare un file multimediale richiesto da una nuova playlist, può continuare a utilizzare quella precedente. Altre possibili cause sono programmazione, destinazioni della campagna, connettività e spazio disponibile.

Controlli e risoluzione dei problemi

Diagnostichi il problema prima di effettuare modifiche. I passaggi 1–6 verificano soltanto lo stato attuale. Il passaggio 7 modifica la campagna nel portale; il passaggio 8 interrompe brevemente la riproduzione e modifica un file. Non elimini in blocco playlist, contenuti multimediali o database.

Procedura diagnostica e di riparazione

  1. Controlli le campagne nel portale.

    Apra i dettagli del dispositivo interessato e la scheda Campagne pubblicate . Per le campagne mancanti verifichi che siano destinate a questo dispositivo, attive e con date e condizioni di riproduzione valide, compresi giorni e orari. Le confronti con l'ora effettiva del dispositivo al passaggio 3.

    Una campagna non pianificata per l'orario corrente non è necessariamente difettosa. Se dovrebbe essere in riproduzione e il riavvio non è servito, prosegua. Consulti anche le guide a Campagne e Dispositivi.

  2. Apra Console remota.

    Il dispositivo deve essere online e comunicare con il server. Console remota richiede il ruolo Amministratore del server o superiore. La apra come descritto nella guida Console remota . Incolli il comando nel campo di inserimento e lo invii con ✓. Incolli per intero ogni blocco multilinea, compresa l'ultima riga PY.

    L'anteprima remota dello schermo non fornisce accesso alla console. Se il dispositivo è offline, segua prima la guida alla verifica della connettività del dispositivo. Se il Suo ruolo non consente l'accesso, chieda a un amministratore autorizzato di eseguire questi passaggi. Consulti Utenti e autorizzazioni.

    I comandi seguenti sono destinati ai player Linux con device-runtime.service service and the working directory /storage. The Python blocks require Python 3; the URL test requires curl. If the console reports that a command, service or path does not exist, do not proceed with file changes. Contact support.
  3. Controlli ora, spazio su disco e servizio del player.

    Comando da copiare:

    date
    df -h / /storage
    systemctl is-active device-runtime.service
    ls -lh --time-style=long-iso /storage/playlist /storage/playlist_new
    
    Che cosa vedeChe cosa significa e come procedere
    Data e oraLe confronti con ora locale e fuso orario correnti. Un orario errato può influire sulla selezione delle campagne e sulla connettività.
    Spazio libero nella colonna AvailSe l'archiviazione è piena, segua la guida a Spazio su disco insufficiente. Controlli anche la partizione montata in /storage.
    activeIl servizio è in esecuzione. Questo non conferma ancora una riproduzione corretta o un aggiornamento riuscito.
    inactive, failed or missing filesControlli i log al passaggio 5. Non utilizzi la riparazione temporanea prima di aver verificato l'installazione e la causa.

    /storage/playlist contains the playlist currently accepted by the player. /storage/playlist_new contains the newly received playlist, whose media the player prepares before activation. A newer timestamp or a different size is a useful clue, ma non dimostra da sola un guasto. I file possono differire temporaneamente durante un normale download.

  4. Confronti le campagne nelle due playlist.

    Il blocco seguente legge entrambi i file ed elenca ID numerico del dispositivo, numero di campagne, ID, nomi e date di validità delle campagne. Non modifica nulla. Annoti l'ID numerico del dispositivo: l'intestazione della console può mostrare un identificatore diverso, che non deve essere utilizzato successivamente nel campo DEVICE_ID.

    Comando da copiare:

    python3 - <<'PY'
    import json
    for path in ['/storage/playlist', '/storage/playlist_new']:
        print('\nFILE:', path)
        try:
            with open(path) as f:
                data = json.load(f)
            print('Device:', data.get('deviceId'))
            campaigns = data.get('campaigns', [])
            print('Campaign count:', len(campaigns))
            for c in campaigns:
                print(c.get('campaignId'), c.get('nameCampaign'),
                      'from:', c.get('start'), 'to:', c.get('end'))
        except Exception as e:
            print('ERROR:', e)
    PY
    

    Se la nuova playlist contiene le campagne previste ma quella corrente soltanto una selezione precedente, cerchi un errore di preparazione nel passaggio successivo. Se le campagne mancano anche nel nuovo file, controlli impostazioni e ricezione degli aggiornamenti dal portale. Un errore di analisi JSON può indicare un file incompleto o danneggiato; non lo sovrascriva manualmente senza ulteriori verifiche.

  5. Individui l'errore di download e controlli la risposta del server.

    Visualizzi le ultime 120 voci del log del servizio degli ultimi 20 minuti. Cerchi errori ricorrenti, URL e ID del contenuto multimediale. Se vede soltanto la parte finale di un errore, aumenti -n 120 or extend the time range.

    Comando da copiare:

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

    Output di esempio — non lo incolli nella console. Un esempio di errore risolto con questa procedura:

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

    Received 0 bytes significa che il player non ha ricevuto contenuti utilizzabili del file. Questo messaggio da solo non ne spiega la causa. Nell'esempio, l'ID del contenuto multimediale è 1790935600695; for your own case, note the ID and exact URL from your logs.

    Incolli l'indirizzo esatto dei Suoi log nel campo evidenziato qui sotto; verrà inserito automaticamente nel comando. Mantenga le virgolette. La prova scarta i dati scaricati e non modifica contenuti multimediali o playlist. Non utilizzi automaticamente l'indirizzo di esempio per un altro dispositivo.

    Incolli l'indirizzo esatto che inizia con https:// o http://. Non incolli l'intero messaggio di errore o un percorso /storage/video/….

    URL mancante. Per il momento la copia del comando è disattivata.

    2. Controlli l'indirizzo nel comando, quindi copi l'intero blocco. L'indirizzo viene inserito automaticamente.

    Comando da modificare e copiare:

    curl -sS -L --connect-timeout 10 --max-time 30 \
      --range 0-1023 --max-filesize 1048576 \
      -D - -o /dev/null \
      -w '\nHTTP: %{http_code}\nDownloaded: %{size_download} bytes\n' \
      'PASTE_MEDIA_URL_HERE'
    
    Che cosa vedeChe cosa significa e come procedere
    HTTP 404Il server non fornisce il contenuto multimediale all'indirizzo richiesto. Ne identifichi la campagna al passaggio 6 e la corregga al passaggio 7.
    HTTP 401 / 403Il server ha negato l'accesso. Verifichi autorizzazioni e configurazione del servizio con l'assistenza.
    HTTP 5xxUn errore del server. Indaghi il servizio file; eliminare la playlist non ripara il server.
    Errore DNS, di connessione, timeout o TLSSegua l'errore specifico: controlli rete, risoluzione dei nomi, disponibilità del server, ora o certificato. Non disattivi la verifica dei certificati.
    HTTP 200 / 206 e dati non vuotiLa prova ha ricevuto dati. Non conferma che il video completo sia integro o riproducibile; controlli i log per altri errori.
    Limite di dimensione di curlIl server potrebbe aver ignorato la richiesta dei primi 1.024 byte. La prova è limitata a 1 MiB e 30 secondi; il raggiungimento di un limite non significa di per sé che il contenuto sia difettoso.
  6. Trovi la campagna tramite l'ID del contenuto multimediale.

    Inserisca prima l'ID del contenuto multimediale. Il valore rosso 000 is only a placeholder. Il blocco cerca il valore esatto del resourceId field, including alternative visuals, and lists matching campaigns. Note their names and IDs. An unchanged block with the value 000 exits safely without changing anything.

    Utilizzi il numero dopo l'ultima barra nell'URL del contenuto multimediale del passaggio 5. Non è l'ID della campagna né quello del dispositivo. Lo inserisca senza estensione .mp4.

    ID mancante. Non copi ancora il comando.

    2. Controlli la riga evidenziata in rosso, quindi copi l'intero comando. Dopo l'inserimento di un ID valido, questo viene inserito automaticamente nel comando e il pulsante Copia viene attivato.

    Comando da modificare e copiare:

    python3 - <<'PY'
    import json
    RESOURCE_ID = 000  # YOUR MEDIA ID MUST GO HERE
    if RESOURCE_ID <= 0:
        raise SystemExit('Enter the media ID in RESOURCE_ID first.')
    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('Campaign:', c.get('nameCampaign'))
            print('Campaign ID:', c.get('campaignId'))
            print('Primary visual:', c.get('primary'))
            print('Alternative visuals:', c.get('alternative'))
    if not found:
        print('Media not found in the new playlist. Check the latest logs and ID.')
    PY
    

    Se il contenuto non viene trovato, il file potrebbe essere cambiato nel frattempo. Controlli di nuovo gli ultimi log e la nuova playlist. Se più campagne utilizzano questo contenuto, correggerne una sola potrebbe non bastare; controlli ogni corrispondenza.

  7. Corregga la campagna nel portale.

    Apra la campagna identificata tramite nome e ID. Sostituisca il contenuto multimediale non disponibile con un nuovo file caricato oppure metta temporaneamente in pausa la campagna e salvi la modifica. Consulti le guide a Contenuti multimediali e Campagne.

    Attenda l'arrivo della playlist aggiornata e il download dei relativi contenuti. Il tempo dipende da connettività e dimensioni dei file. Ripeta i controlli dei passaggi 3 e 4: se ha sospeso la campagna o sostituito il contenuto, la nuova playlist non deve più fare riferimento al file difettoso.

    Se il file è invariato e contiene ancora il riferimento originale, la playlist aggiornata non è ancora arrivata. Controlli lo stato online e che la modifica nel portale sia stata salvata. Il solo riavvio non può ripristinare un file per cui il server restituisce ancora HTTP 404. Se deve ripristinare temporaneamente gli altri annunci, prosegua al passaggio 8; altrimenti verifichi il risultato al passaggio 9.

  8. Riparazione locale temporanea con backup.

    Procedura di assistenza — interrompe brevemente la riproduzione. La utilizzi soltanto dopo aver confermato il contenuto multimediale non disponibile e la relativa campagna. Lo script rimuove un'intera campagna dalla nuova playlist, non soltanto il video. Lo esegua sul dispositivo corretto in un momento in cui una breve interruzione della riproduzione sia accettabile.

    Lo script verifica tutti gli ID e arresta soltanto device-runtime.service, backs up both files to /storage/playlist-backup-DATUM-CAS, removes the specified campaign from playlist_new and starts the service again. It does not directly overwrite the current playlist or delete media. A backup is made before writing; if the edit fails, the script attempts to restore the original new playlist. It also attempts to restart the service if an error occurs within this block, provided the script can finish; a power outage or forced termination cannot be handled this way.

    Prima di eseguirlo, completi tutti e tre i campi seguenti:

    • DEVICE_ID: the numeric device ID from step 4.
    • CAMPAIGN_ID: the campaign ID from step 6.
    • RESOURCE_ID: the unavailable media ID from the logs.

    Non utilizzi gli ID di esempio, salvo che si tratti esattamente di quel caso. I valori rossi 000 sono una protezione: la copia rimane disattivata finché non sono compilati tutti gli ID e lo script invariato non effettua modifiche. Sul dispositivo deve rimanere almeno un'altra campagna.

    1. Inserisca tutti e tre gli ID prima di copiare

    Ogni numero identifica un elemento diverso. Li controlli con i passaggi 4 e 6; non utilizzi automaticamente i valori di esempio.

    Dal passaggio 4; non è l'identificatore nell'intestazione della console.

    Dal passaggio 6; non è l'ID del contenuto multimediale.

    Lo stesso ID del contenuto multimediale verificato al passaggio 6.

    Inserisca tutti e tre gli ID. Per il momento la copia del comando è disattivata.

    2. Controlli i tre valori evidenziati in rosso, quindi copi l'intero blocco. L'esecuzione interrompe brevemente la riproduzione. Lo script verifica inoltre che gli ID di dispositivo, campagna e contenuto multimediale corrispondano al contenuto della playlist.

    Comando da modificare e copiare:

    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('Enter all three IDs first. Nothing has changed.')
    
    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('Device ID does not match.')
        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('Campaign or media does not match the specified IDs.')
        data['campaigns'] = [c for c in data['campaigns']
                             if c.get('campaignId') != CAMPAIGN_ID]
        if not data['campaigns']:
            raise RuntimeError('No campaigns would remain after exclusion.')
        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('Backup:', backup)
        print('Campaigns retained:', len(data['campaigns']))
    except Exception:
        if saved:
            shutil.copy2(backup / 'playlist_new', path)
        raise
    finally:
        subprocess.run(['systemctl', 'start', service], check=True)
    PY
    

    L'output riuscito comprende il percorso del backup e il numero di campagne mantenute. Conservi il percorso per l'assistenza. Se lo script segnala ID non corrispondenti, non rimuova i controlli: torni al passaggio 4 o 6. Se scrittura, ripristino o avvio del servizio non riescono, invii l'output completo all'assistenza; non sposti manualmente la nuova playlist sopra quella corrente.

    Questa riparazione temporanea riguarda soltanto questo dispositivo. Non modifica le impostazioni del server. Un aggiornamento successivo potrebbe inviare di nuovo la campagna difettosa. Completi anche la correzione nel portale al passaggio 7. Un altro contenuto multimediale mancante potrebbe ancora bloccare l'attivazione.
  9. Verifichi l'attivazione della playlist e la riproduzione effettiva.

    Dopo circa un minuto controlli servizio e log; attenda di più per i download multimediali grandi. Questo blocco non modifica nulla.

    Comando da copiare:

    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
    

    Elenchi di nuovo le campagne con il comando del passaggio 4. La playlist corrente deve contenere la nuova selezione prevista, il servizio deve essere attivo e i log correnti non devono ripetere lo stesso errore di download. Le sole dimensioni uguali dei file non sono una prova sufficiente.

    Infine osservi lo schermo fisico o la sua anteprima remota abbastanza a lungo da coprire un intero ciclo pubblicitario. Verifichi che compaiano tutte le campagne previste dalle condizioni correnti. Per campagne pianificate o con intervalli tra le riproduzioni, adatti di conseguenza il periodo di osservazione.

  10. Se il problema persiste.

    • Compare un ID multimediale diverso: ripeta i passaggi 5 e 6 per il nuovo file. Il blocco precedente potrebbe averne nascosto un altro.
    • La nuova playlist non è arrivata: controlli stato online, dispositivo di destinazione e modifica salvata della campagna. Una modifica locale non dimostra la corretta ricezione degli aggiornamenti del server.
    • La playlist è attiva ma manca ancora un annuncio: controlli le condizioni di programmazione e gli ulteriori errori di riproduzione. Questa procedura non risolve automaticamente ogni problema di video o pianificazione.
    • Il servizio non è in esecuzione: ne controlli lo stato con il comando seguente e invii il risultato all'assistenza.

    Comando da copiare:

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

    Invii al fornitore del software l'ID del dispositivo, l'ora locale del problema con il fuso orario, i nomi delle campagne previste, entrambi gli elenchi di campagne, l'errore pertinente del log e il risultato della prova dell'URL. Se ha effettuato la riparazione locale, includa output e percorso del backup. Non invii password o credenziali di accesso.

Non ha trovato ciò che cercava?
Contatti il Suo fornitore del software.