The device plays only one or some campaigns
Introduction and orientation
The screen plays only one or a few campaigns, even though the device details under Published campaigns show more. Restarting has not helped. This guide takes you through checking settings, comparing playlists and identifying media that may be blocking a content update.
Playlist is the list of campaigns and their playback rules. If the player cannot prepare a media file required by a new playlist, it may keep using the previous playlist. Other possible causes include scheduling, campaign targeting, connectivity and available storage.
Checks and troubleshooting
Diagnosis and repair procedure
Check the campaigns in the portal.
Open the affected device’s details and the Published campaigns tab. For missing campaigns, check that they target this device, are active, and have valid start and end dates and playback conditions, including days and times. Compare these with the device’s actual time in step 3.
A campaign that is not scheduled to run at this time is not necessarily faulty. If it should be playing and restarting did not help, continue. See also the guides to Campaigns and Devices.
Open Remote Console.
The device must be online and communicating with the server. Remote Console requires the Server Administrator role or higher. Open it as described in the Remote Console guide. Paste the command into the input field and submit it using ✓. Paste each multiline block in full, including the final line
PY.A remote screen preview does not provide console access. If the device is offline, first follow the guide to Checking device connectivity. If your role does not provide access, ask an authorised administrator to carry out these steps. See Users and permissions.
The commands below are for Linux-based players with thedevice-runtime.serviceservice 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.Check the time, disk space and player service.
Command to copy:
date df -h / /storage systemctl is-active device-runtime.service ls -lh --time-style=long-iso /storage/playlist /storage/playlist_newWhat you see What it means and what to do next Date and time Compare these with the current local time and time zone. An incorrect time may affect campaign selection and connectivity. Free space in the Avail column If storage is full, follow the guide to Insufficient disk space. Also check the partition mounted at /storage. activeThe service is running. This does not yet confirm correct playback or a successful update. inactive,failedor missing filesCheck the logs in step 5. Do not use the temporary repair until you have verified the installation and the cause. /storage/playlistcontains the playlist currently accepted by the player./storage/playlist_newcontains the newly received playlist, whose media the player prepares before activation. A newer timestamp or a different size is a useful clue, but does not prove a fault on its own. The files may differ temporarily during normal downloading.Compare the campaigns in both playlists.
The following block reads both files and lists the numeric device ID, campaign count, campaign IDs, names and validity dates. It does not change anything. Note the numeric device ID: the console header may show a different identifier, which must not be used in the DEVICE_ID field later.
Command to copy:
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) PYIf the new playlist contains the expected campaigns but the current one only contains an older selection, look for a preparation error in the next step. If the campaigns are missing from the new file too, check the settings and delivery of portal updates. A JSON parsing error may indicate an incomplete or damaged file; do not overwrite it manually without further checks.
Find the download error and check the server response.
Display the last 120 service log entries from the past 20 minutes. Look for recurring errors, the media URL and its ID. If you can only see the end of an error, increase
-n 120or extend the time range.Command to copy:
sudo journalctl -u device-runtime.service --since "20 minutes ago" --no-pager -n 120 -o catSample output — do not paste it into the console. An example of an error resolved using this procedure:
https://files.screensoft.org/api/video/H265/1790935600695 java.lang.IllegalStateException: Received 0 bytes ... /storage/video/1790935600695.mp4Received 0 bytes means the player did not receive usable file content. This message alone does not explain why. In this example, the media ID is
1790935600695; for your own case, note the ID and exact URL from your logs.Paste the exact address from your logs into the highlighted field below; it will be inserted into the command automatically. Keep the quotation marks. The test discards downloaded data and does not change media or playlists. Do not automatically use the example address for another device.
Paste the exact address starting with https:// or http://. Do not paste the entire error message or a /storage/video/… path.
The URL is missing. Copying the command is disabled for now.
2. Check the address in the command, then copy the entire block. The address is inserted automatically.
Command to edit and copy:
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'What you see What it means and what to do next HTTP 404 The server does not provide the media at the requested address. Identify its campaign in step 6 and fix it in step 7. HTTP 401 / 403 The server denied access. Check permissions and service configuration with support. HTTP 5xx A server error. Investigate the file service; deleting the playlist will not fix the server. DNS, connection, timeout or TLS error Follow the specific error: check networking, name resolution, server availability, the time or the certificate. Do not disable certificate verification. HTTP 200 / 206 and non-empty data The test received data. It does not confirm that the full video is complete or playable; check the logs for further errors. curl size limit The server may have ignored the request for the first 1,024 bytes. The test is limited to 1 MiB and 30 seconds; reaching a limit does not itself mean the media is faulty. Find the campaign by media ID.
Enter the media ID first. The red
000is only a placeholder. The block searches for the exact value of theresourceIdfield, including alternative visuals, and lists matching campaigns. Note their names and IDs. An unchanged block with the value 000 exits safely without changing anything.Use the number after the final slash in the media URL from step 5. This is not the campaign ID or device ID. Enter it without the .mp4 extension.
The ID is missing. Do not copy the command yet.
2. Check the line highlighted in red, then copy the entire command. Once you enter a valid ID, it is inserted into the command automatically and the Copy button is enabled.
Command to edit and copy:
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.') PYIf no media is found, the file may have changed in the meantime. Check the latest logs and new playlist again. If several campaigns use this media, fixing just one may not be enough; check every match.
Fix the campaign in the portal.
Open the campaign you identified by name and ID. Replace the unavailable media with a newly uploaded file, or temporarily pause the campaign, and save the change. See the guides to Media and Campaigns.
Wait for the updated playlist to arrive and its media to download. The time required depends on connectivity and file size. Repeat the checks in steps 3 and 4: the new playlist must no longer reference the faulty file if you have paused the campaign or replaced the media.
If the file is unchanged and still contains the original reference, the updated playlist has not arrived yet. Check online status and that the portal change was saved. Restarting alone cannot restore a file for which the server still returns HTTP 404. If you need to restore the other adverts temporarily, continue to step 8; otherwise, verify the result in step 9.
Temporary local repair with a backup.
Service procedure — briefly interrupts playback. Use this only after confirming the specific unavailable media and its campaign. The script removes one entire campaign from the new playlist, not just its video. Run it on the correct device at a time when a brief playback interruption is acceptable.The script verifies all IDs, stops only
device-runtime.service, backs up both files to/storage/playlist-backup-DATUM-CAS, removes the specified campaign fromplaylist_newand 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.Before running it, complete all three fields below:
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.
Do not use the example IDs unless you are dealing with that exact case. The red 000 values are a safeguard: copying stays disabled until all IDs are filled in, and the unchanged script makes no changes. At least one other campaign must remain on the device.
1. Enter all three IDs before copyingEach number identifies a different item. Check them against steps 4 and 6; do not automatically use the example values.
From step 4; not the identifier in the console header.
From step 6; this is not the media ID.
The same media ID you checked in step 6.
Enter all three IDs. Copying the command is disabled for now.
2. Check the three values highlighted in red, then copy the entire block. Running this briefly interrupts playback. The script also checks that the device, campaign and media IDs match the playlist contents.
Command to edit and copy:
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) PYSuccessful output includes the backup path and the number of campaigns retained. Keep the path for support. If the script reports mismatched IDs, do not remove the checks: return to step 4 or 6. If writing, restoration or service startup fails, send the full output to support; do not manually move the new playlist over the current one.
This temporary repair only affects this device. It does not change server settings. A later update may deliver the faulty campaign again. Complete the portal repair in step 7 as well. Another missing media file may still block activation.Verify playlist activation and actual playback.
After about a minute, check the service and logs; allow more time for large media downloads. This block makes no changes.
Command to copy:
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 -50List the campaigns again using the command in step 4. The current playlist should contain the expected new selection, the service should be active, and current logs should no longer repeat the same download error. Matching file sizes alone are not sufficient proof.
Finally, watch physical screen or its remote preview long enough for a complete advert cycle. Verify that all campaigns due to run under their current conditions are shown. For scheduled campaigns or campaigns with intervals between plays, adjust the observation period accordingly.
If the problem persists.
- A different media ID appears: repeat steps 5 and 6 for the new file. The previous blockage may have hidden another one.
- The new playlist has not arrived: check online status, the target device and the saved campaign change. A local edit does not prove that server updates are being delivered correctly.
- The playlist is active, but an advert is still missing: check its scheduling conditions and further playback errors. This procedure does not automatically fix every video or scheduling fault.
- The service is not running: check its status with the following command and send the result to support.
Command to copy:
sudo systemctl status device-runtime.service --no-pagerSend your software provider the device ID, the local time of the problem including the time zone, expected campaign names, both campaign lists, the relevant log error and the URL test result. If you performed the local repair, include its output and backup path. Do not send passwords or login credentials.
Related topics and next steps
Contact your software provider.
