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
Procedimento de diagnóstico e reparação
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.
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çodevice-runtime.servicee 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.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_newO que é apresentado Significado e passo seguinte Data e hora Compare-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 Avail Se 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,failedou 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/playlistcontém a lista de reprodução atualmente aceite pelo leitor./storage/playlist_newconté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.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) PYSe 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.
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 120ou alargue o intervalo de tempo.Comando para copiar:
sudo journalctl -u device-runtime.service --since "20 minutes ago" --no-pager -n 120 -o catExemplo 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.mp4Received 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 é apresentado Significado e passo seguinte HTTP 404 O servidor não disponibiliza o ficheiro no endereço pedido. Identifique a campanha no passo 6 e corrija-a no passo 7. HTTP 401 / 403 O servidor recusou o acesso. Verifique as permissões e a configuração do serviço com o apoio técnico. HTTP 5xx Erro 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 TLS Siga 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 vazios O 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 curl O 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. 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 camporesourceId, 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.') PYSe 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.
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.
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 deplaylist_newe 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 copiarCada 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) PYUma 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.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 -50Volte 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.
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-pagerEnvie 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.
Temas relacionados e passos seguintes
← Voltar à resolução de problemas
Contacte o seu fornecedor de software.
