Documentação / Resolução de problemas / O dispositivo reproduz apenas uma ou algumas campanhas

O dispositivo reproduz apenas uma ou algumas campanhas

Introdução e orientação

O ecrã reproduz apenas uma ou algumas campanhas, embora os detalhes do dispositivo, em Campanhas publicadas, apresentem mais. Reiniciar não resolveu. Este guia explica como verificar as definições, comparar as listas de reprodução e identificar ficheiros que possam estar a bloquear uma atualização dos conteúdos.

Lista de reprodução é a lista de campanhas e respetivas regras de reprodução. Se o leitor não conseguir preparar um ficheiro necessário para uma lista nova, poderá continuar a utilizar a anterior. Outras causas possíveis incluem o agendamento, os dispositivos de destino, a conectividade e o armazenamento disponível.

Verificações e resolução de problemas

Diagnostique o problema antes de fazer alterações. Os passos 1–6 apenas verificam o estado atual. O passo 7 altera a campanha no portal; o passo 8 interrompe brevemente a reprodução e modifica um ficheiro. Não elimine em massa listas de reprodução, ficheiros ou a base de dados.

Procedimento de diagnóstico e reparação

  1. Verifique as campanhas no portal.

    Abra os detalhes do dispositivo afetado e o separador Campanhas publicadas. Nas campanhas em falta, verifique se se destinam a este dispositivo, se estão ativas e se têm datas e condições de reprodução válidas, incluindo dias e horas. Compare-as com a hora real do dispositivo no passo 3.

    Uma campanha não agendada para este momento não tem necessariamente um problema. Se deveria estar a ser reproduzida e reiniciar não resolveu, continue. Consulte também os guias sobre Campanhas e Dispositivos.

  2. Abra a consola remota.

    O dispositivo tem de estar online e comunicar com o servidor. A consola remota exige a função de Administrador do servidor ou superior. Abra-a conforme descrito no guia Consola remota. Cole o comando no campo de introdução e envie-o com ✓. Cole cada bloco de várias linhas na íntegra, incluindo a última linha PY.

    Uma pré-visualização remota do ecrã não dá acesso à consola. Se o dispositivo estiver offline, siga primeiro o guia Verificar a conectividade do dispositivo. Se a sua função não permitir o acesso, peça a um administrador autorizado que execute estes passos. Consulte Utilizadores e permissões.

    Os comandos seguintes destinam-se a leitores Linux com o serviço device-runtime.service e o diretório de trabalho /storage. Os blocos Python exigem Python 3; o teste do URL exige curl. Se a consola indicar que um comando, serviço ou percurso não existe, não avance com alterações aos ficheiros. Contacte o apoio técnico.
  3. Verifique a hora, o espaço em disco e o serviço do leitor.

    Comando para copiar:

    date
    df -h / /storage
    systemctl is-active device-runtime.service
    ls -lh --time-style=long-iso /storage/playlist /storage/playlist_new
    
    O que é apresentadoSignificado e passo seguinte
    Data e horaCompare-as com a hora local atual e o fuso horário. Uma hora incorreta pode afetar a seleção de campanhas e a conectividade.
    Espaço livre na coluna AvailSe o armazenamento estiver cheio, siga o guia Espaço em disco insuficiente. Verifique também a partição montada em /storage.
    activeO serviço está em execução. Isto ainda não confirma uma reprodução correta nem uma atualização bem-sucedida.
    inactive, failed ou ficheiros em faltaVerifique os registos no passo 5. Não utilize a reparação temporária antes de verificar a instalação e a causa.

    /storage/playlist contém a lista de reprodução atualmente aceite pelo leitor. /storage/playlist_new contém a nova lista recebida, cujos ficheiros o leitor prepara antes da ativação. Uma data mais recente ou um tamanho diferente é uma pista útil, mas não comprova, por si só, uma avaria. Os ficheiros podem diferir temporariamente durante um descarregamento normal.

  4. Compare as campanhas das duas listas de reprodução.

    O bloco seguinte lê os dois ficheiros e apresenta o ID numérico do dispositivo, o número de campanhas e os respetivos ID, nomes e datas de validade. Não altera nada. Anote o ID numérico do dispositivo: o cabeçalho da consola pode apresentar outro identificador, que não deve ser utilizado posteriormente em DEVICE_ID.

    Comando para copiar:

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

    Se a nova lista contiver as campanhas esperadas, mas a atual apenas uma seleção antiga, procure um erro de preparação no passo seguinte. Se também faltarem no novo ficheiro, verifique as definições e a receção das atualizações do portal. Um erro de análise JSON pode indicar um ficheiro incompleto ou danificado; não o substitua manualmente sem verificações adicionais.

  5. Localize o erro de descarregamento e verifique a resposta do servidor.

    Apresente as últimas 120 entradas do registo do serviço dos últimos 20 minutos. Procure erros recorrentes, o URL do ficheiro e o respetivo ID. Se apenas aparecer o fim de um erro, aumente -n 120 ou alargue o intervalo de tempo.

    Comando para copiar:

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

    Exemplo de saída: não o cole na consola. Exemplo de um erro resolvido com este procedimento:

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

    Received 0 bytes significa que o leitor não recebeu conteúdo de ficheiro utilizável. A mensagem, por si só, não explica a causa. Neste exemplo, o ID do ficheiro é 1790935600695; para o seu caso, anote o ID e o URL exato dos seus registos.

    Cole o endereço exato dos registos no campo destacado abaixo; será inserido automaticamente no comando. Mantenha as aspas. O teste descarta os dados descarregados e não altera ficheiros nem listas de reprodução. Não utilize automaticamente o endereço do exemplo noutro dispositivo.

    Cole o endereço exato que começa por https:// ou http://. Não cole a mensagem completa nem um percurso /storage/video/…

    O URL está em falta. A cópia do comando está desativada por enquanto.

    2. Verifique o endereço no comando e copie o bloco completo. O endereço é inserido automaticamente.

    Comando para editar e copiar:

    curl -sS -L --connect-timeout 10 --max-time 30 \
      --range 0-1023 --max-filesize 1048576 \
      -D - -o /dev/null \
      -w '\nHTTP: %{http_code}\nDescarregado: %{size_download} bytes\n' \
      'PASTE_MEDIA_URL_HERE'
    
    O que é apresentadoSignificado e passo seguinte
    HTTP 404O servidor não disponibiliza o ficheiro no endereço pedido. Identifique a campanha no passo 6 e corrija-a no passo 7.
    HTTP 401 / 403O servidor recusou o acesso. Verifique as permissões e a configuração do serviço com o apoio técnico.
    HTTP 5xxErro do servidor. Investigue o serviço de ficheiros; eliminar a lista não irá reparar o servidor.
    Erro de DNS, ligação, tempo limite ou TLSSiga o erro específico: verifique a rede, a resolução de nomes, a disponibilidade do servidor, a hora ou o certificado. Não desative a verificação do certificado.
    HTTP 200 / 206 e dados não vaziosO teste recebeu dados. Não confirma que o vídeo completo esteja íntegro ou possa ser reproduzido; procure outros erros nos registos.
    Limite de tamanho do curlO servidor pode ter ignorado o pedido dos primeiros 1024 bytes. O teste está limitado a 1 MiB e 30 segundos; atingir um limite não significa, por si só, que o ficheiro esteja danificado.
  6. Localize a campanha pelo ID do ficheiro.

    Introduza primeiro o ID do ficheiro. O valor vermelho 000 é apenas um marcador de posição. O bloco procura o valor exato do campo resourceId, incluindo nos visuais alternativos, e apresenta as campanhas correspondentes. Anote os respetivos nomes e ID. Um bloco inalterado com o valor 000 termina em segurança sem alterar nada.

    Utilize o número após a última barra do URL do passo 5. Não é o ID da campanha nem do dispositivo. Introduza-o sem a extensão .mp4.

    O ID está em falta. Ainda não copie o comando.

    2. Verifique a linha destacada a vermelho e copie o comando completo. Quando é introduzido um ID válido, este é inserido automaticamente no comando e o botão Copiar é ativado.

    Comando para editar e copiar:

    python3 - <<'PY'
    import json
    RESOURCE_ID = 000  # INTRODUZA AQUI O ID DO FICHEIRO
    if RESOURCE_ID <= 0:
        raise SystemExit('Introduza primeiro o ID do ficheiro em 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('Campanha:', c.get('nameCampaign'))
            print('ID da campanha:', c.get('campaignId'))
            print('Visual principal:', c.get('primary'))
            print('Visuais alternativos:', c.get('alternative'))
    if not found:
        print('Ficheiro não encontrado na nova lista. Verifique os registos mais recentes e o ID.')
    PY
    

    Se o ficheiro não for encontrado, poderá ter mudado entretanto. Verifique novamente os registos mais recentes e a nova lista. Se várias campanhas utilizarem o ficheiro, corrigir apenas uma poderá não chegar; verifique todas as correspondências.

  7. Corrija a campanha no portal.

    Abra a campanha identificada pelo nome e ID. Substitua o ficheiro indisponível por um novo ficheiro carregado ou pause temporariamente a campanha e guarde a alteração. Consulte os guias sobre Multimédia e Campanhas.

    Aguarde a receção da lista atualizada e o descarregamento dos respetivos ficheiros. O tempo depende da ligação e do tamanho. Repita as verificações dos passos 3 e 4: após pausar a campanha ou substituir o ficheiro, a nova lista já não deve referir o ficheiro com problemas.

    Se o ficheiro não mudar e mantiver a referência original, a lista atualizada ainda não chegou. Verifique o estado online e se a alteração foi guardada no portal. Reiniciar, por si só, não recupera um ficheiro para o qual o servidor continua a devolver HTTP 404. Se precisar de restabelecer temporariamente os restantes anúncios, continue no passo 8; caso contrário, verifique o resultado no passo 9.

  8. Reparação local temporária com cópia de segurança.

    Procedimento de manutenção: interrompe brevemente a reprodução. Utilize este procedimento apenas depois de confirmar o ficheiro indisponível e a respetiva campanha. O script remove uma campanha inteira da nova lista, não apenas o vídeo. Execute-o no dispositivo correto, num momento em que uma breve interrupção seja aceitável.

    O script verifica todos os ID, para apenas device-runtime.service, cria uma cópia dos dois ficheiros em /storage/playlist-backup-DATUM-CAS, remove a campanha indicada de playlist_new e volta a iniciar o serviço. Não substitui diretamente a lista atual nem elimina ficheiros multimédia. É criada uma cópia antes da escrita; se a edição falhar, o script tenta restaurar a nova lista original. Se ocorrer um erro neste bloco, também tenta reiniciar o serviço, desde que possa terminar; uma falha de energia ou uma terminação forçada não pode ser tratada desta forma.

    Antes da execução, preencha os três campos seguintes:

    • DEVICE_ID: ID numérico do dispositivo do passo 4.
    • CAMPAIGN_ID: ID da campanha do passo 6.
    • RESOURCE_ID: ID do ficheiro indisponível obtido nos registos.

    Não utilize os ID de exemplo, a menos que se trate exatamente desse caso. Os valores vermelhos 000 são uma proteção: a cópia permanece desativada até todos os ID estarem preenchidos e o script inalterado não faz alterações. Tem de permanecer pelo menos outra campanha no dispositivo.

    1. Introduza os três ID antes de copiar

    Cada número identifica um item diferente. Verifique-os com os passos 4 e 6; não utilize automaticamente os valores de exemplo.

    Do passo 4; não o identificador no cabeçalho da consola.

    Do passo 6; não é o ID do ficheiro.

    O mesmo ID do ficheiro verificado no passo 6.

    Introduza os três ID. A cópia do comando está desativada por enquanto.

    2. Verifique os três valores destacados a vermelho e copie o bloco completo. A execução interrompe brevemente a reprodução. O script também verifica se os ID do dispositivo, da campanha e do ficheiro correspondem ao conteúdo da lista.

    Comando para editar e 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('Introduza primeiro os três ID. Não foi alterado 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('O ID do dispositivo não corresponde.')
        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('A campanha ou o ficheiro não corresponde aos ID indicados.')
        data['campaigns'] = [c for c in data['campaigns']
                             if c.get('campaignId') != CAMPAIGN_ID]
        if not data['campaigns']:
            raise RuntimeError('Não restaria nenhuma campanha após a exclusão.')
        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('Cópia de segurança:', backup)
        print('Campanhas mantidas:', len(data['campaigns']))
    except Exception:
        if saved:
            shutil.copy2(backup / 'playlist_new', path)
        raise
    finally:
        subprocess.run(['systemctl', 'start', service], check=True)
    PY
    

    Uma saída bem-sucedida inclui o percurso da cópia e o número de campanhas mantidas. Guarde o percurso para o apoio técnico. Se o script indicar que os ID não correspondem, não remova as verificações: volte ao passo 4 ou 6. Se a escrita, o restauro ou o arranque falhar, envie a saída completa ao apoio técnico; não substitua manualmente a lista atual pela nova.

    Esta reparação temporária afeta apenas este dispositivo. Não altera as definições do servidor. Uma atualização posterior pode voltar a enviar a campanha com problemas. Conclua também a correção no portal do passo 7. Outro ficheiro em falta pode continuar a bloquear a ativação.
  9. Verifique a ativação da lista e a reprodução real.

    Após cerca de um minuto, verifique o serviço e os registos; aguarde mais tempo para ficheiros grandes. Este bloco não faz alterações.

    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
    

    Volte a listar as campanhas com o comando do passo 4. A lista atual deve conter a nova seleção esperada, o serviço deve estar ativo e os registos atuais já não devem repetir o mesmo erro de descarregamento. Tamanhos iguais, por si só, não são prova suficiente.

    Por fim, observe o ecrã físico ou a pré-visualização remota durante um ciclo publicitário completo. Verifique se são apresentadas todas as campanhas previstas nas condições atuais. Ajuste o período de observação para campanhas agendadas ou com intervalos entre reproduções.

  10. Se o problema persistir.

    • Surge outro ID de ficheiro: repita os passos 5 e 6 para o novo ficheiro. O bloqueio anterior pode ter ocultado outro.
    • A nova lista não chegou: verifique o estado online, o dispositivo de destino e a alteração guardada. Uma edição local não comprova que as atualizações do servidor estão a ser entregues corretamente.
    • A lista está ativa, mas continua a faltar um anúncio: verifique as condições de agendamento e outros erros de reprodução. Este procedimento não resolve automaticamente todos os problemas de vídeo ou agendamento.
    • O serviço não está em execução: verifique o estado com o comando seguinte e envie o resultado ao apoio técnico.

    Comando para copiar:

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

    Envie ao fornecedor o ID do dispositivo, a hora local do problema com o fuso horário, os nomes das campanhas esperadas, as duas listas, o erro relevante do registo e o resultado do teste do URL. Se tiver efetuado a reparação local, inclua a saída e o percurso da cópia. Não envie palavras-passe nem credenciais de acesso.

Não encontrou o que procurava?
Contacte o seu fornecedor de software.