Dokumentace / Řešení problémů / Zařízení přehrává pouze jednu nebo některé kampaně

Zařízení přehrává pouze jednu nebo některé kampaně

Úvod a orientace

Na obrazovce se přehrává pouze jedna nebo několik kampaní, přestože v detailu zařízení v záložce Zveřejněné kampaně vidíte další. Ani restart nepomohl. Tento návod vás provede kontrolou nastavení, porovnáním playlistů a hledáním média, které může blokovat aktualizaci obsahu.

Playlist je seznam kampaní a pravidel jejich přehrávání. Pokud se nepodaří připravit některé médium nového playlistu, přehrávač může dál používat původní sestavu. Nejde však o jedinou možnou příčinu: roli hraje také časový plán, přiřazení kampaní, připojení nebo volné místo.

Postup kontroly a řešení

Nejdříve diagnostika, potom oprava. Kroky 1–6 pouze kontrolují stav. Krok 7 mění kampaň v portálu a krok 8 dočasně zastaví přehrávání a upraví jeden soubor. Nemažte plošně playlisty, média ani databázi.

Postup diagnostiky a opravy

  1. Zkontrolujte kampaně v portálu.

    Otevřete detail dotčeného zařízení a záložku Zveřejněné kampaně. U chybějících kampaní ověřte přiřazení k tomuto zařízení, aktivní stav, datum začátku a konce i podmínky přehrávání včetně dnů a času. Porovnejte je se skutečným časem zařízení v kroku 3.

    Pokud kampaň podle plánu právě běžet nemá, nejde samo o sobě o poruchu. Pokud běžet má a restart nepomohl, pokračujte. Pomohou také návody Kampaně a Zařízení.

  2. Otevřete Vzdálenou konzoli.

    Zařízení musí být online a komunikovat se serverem. Vzdálená konzola vyžaduje oprávnění Server Administrator nebo vyšší. Otevřete ji podle návodu ke vzdálené konzoli. Příkaz vložte do vstupního pole a odešlete tlačítkem ✓. Víceřádkový blok vkládejte celý včetně posledního řádku PY.

    Samotný vzdálený náhled obrazovky nenahrazuje přístup ke konzole. Pokud je zařízení offline, nejprve použijte návod Kontrola připojení zařízení. Nemáte potřebnou roli? Předejte postup oprávněnému správci; přehled je v části Uživatelé a oprávnění.

    Příkazy níže jsou pro linuxový přehrávač se službou device-runtime.service a pracovním adresářem /storage. Pythonové bloky potřebují Python 3; test URL potřebuje curl. Pokud konzola hlásí neexistující příkaz, službu nebo cestu, nepokračujte změnou souborů a obraťte se na podporu.
  3. Ověřte čas, místo na disku a službu přehrávače.

    Příkaz ke zkopírování:

    date
    df -h / /storage
    systemctl is-active device-runtime.service
    ls -lh --time-style=long-iso /storage/playlist /storage/playlist_new
    
    Co vidíteCo to znamená a jak pokračovat
    Datum a časPorovnejte je s aktuálním místním časem a časovým pásmem. Nesprávný čas může ovlivnit výběr kampaní i spojení.
    Volné místo ve sloupci AvailPři zaplněném úložišti postupujte podle návodu Nedostatek místa na disku. Zkontrolujte i oddíl připojený jako /storage.
    activeSlužba běží. To ještě nepotvrzuje správné přehrávání ani úspěšnou aktualizaci.
    inactive, failed nebo chybějící souboryPokračujte kontrolou deníku v kroku 5. Nouzovou úpravu nepoužívejte, dokud neověříte správnou instalaci a příčinu.

    /storage/playlist obsahuje aktuálně přijatou sestavu. /storage/playlist_new obsahuje nově doručenou sestavu, jejíž média přehrávač připravuje před aktivací. Novější čas a jiná velikost druhého souboru jsou důležitou stopou, nikoli samostatným důkazem závady. Při běžném stahování se mohou dočasně lišit.

  4. Porovnejte kampaně v obou playlistech.

    Následující blok přečte oba soubory a vypíše číselné ID zařízení, počet kampaní, jejich ID, názvy a platnost. Nic nemění. Poznamenejte si číselné ID zařízení; v konzole může být v záhlaví také jiný identifikátor, který do pozdějšího pole DEVICE_ID nepatří.

    Příkaz ke zkopírování:

    python3 - <<'PY'
    import json
    for path in ['/storage/playlist', '/storage/playlist_new']:
        print('\nSOUBOR:', path)
        try:
            with open(path) as f:
                data = json.load(f)
            print('Zařízení:', data.get('deviceId'))
            campaigns = data.get('campaigns', [])
            print('Počet kampaní:', len(campaigns))
            for c in campaigns:
                print(c.get('campaignId'), c.get('nameCampaign'),
                      'od:', c.get('start'), 'do:', c.get('end'))
        except Exception as e:
            print('CHYBA:', e)
    PY
    

    Pokud nový playlist obsahuje očekávané kampaně, ale aktuální pouze starší výběr, hledejte v dalším kroku chybu jejich přípravy. Pokud kampaně chybějí i v novém souboru, vraťte se k nastavení a doručení změn z portálu. Chyba čtení JSON může znamenat neúplný nebo poškozený soubor; nepřepisujte jej ručně bez dalšího ověření.

  5. Najděte chybu stahování a ověřte odpověď serveru.

    Zobrazte posledních 120 záznamů služby z uplynulých 20 minut. Hledejte opakované chyby, URL média a jeho ID. Pokud vidíte jen konec chyby, zvětšete hodnotu -n 120 nebo časové období.

    Příkaz ke zkopírování:

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

    Ukázka výpisu – nevkládejte ji do konzole. Příklad chyby, kterou jsme tímto postupem skutečně vyřešili:

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

    Received 0 bytes znamená, že přehrávač nepřijal použitelný obsah souboru. Samotná zpráva ještě neurčuje, proč. V tomto příkladu je ID média 1790935600695; pro vlastní případ si zapište ID a přesnou URL ze svého výpisu.

    Do zvýrazněného pole níže vložte přesnou adresu ze svého deníku; do příkazu se doplní automaticky. Uvozovky ponechte. Test zahodí stažená data a nezmění média ani playlisty. Ukázkovou adresu nepoužívejte automaticky pro jiné zařízení.

    Vložte přesnou adresu začínající https:// nebo http://. Nekopírujte celou zprávu chyby ani cestu /storage/video/…

    URL není vyplněná. Kopírování příkazu je zatím vypnuté.

    2. Zkontrolujte adresu v příkazu a zkopírujte celý blok. Adresa se doplní automaticky.

    Příkaz k úpravě a zkopírování:

    curl -sS -L --connect-timeout 10 --max-time 30 \
      --range 0-1023 --max-filesize 1048576 \
      -D - -o /dev/null \
      -w '\nHTTP: %{http_code}\nStaženo: %{size_download} bajtů\n' \
      'SEM_VLOZTE_URL_Z_DENIKU'
    
    Co vidíteCo to znamená a jak pokračovat
    HTTP 404Server na požadované adrese médium neposkytuje. Najděte jeho kampaň v kroku 6 a opravte ji v kroku 7.
    HTTP 401 / 403Server odmítl přístup. Ověřte oprávnění a konfiguraci služby s podporou.
    HTTP 5xxChyba na serveru. Řešte službu poskytující soubory; mazání playlistu není opravou serveru.
    Chyba DNS, spojení, timeout nebo TLSPostupujte podle konkrétní chyby: síť, překlad názvů, dostupnost serveru, čas nebo certifikát. Nevypínejte ověřování certifikátu.
    HTTP 200 / 206 a nenulová dataTest získal data. Nepotvrzuje úplnost ani přehratelnost celého videa; zkontrolujte další chyby v deníku.
    Limit velikosti curlServer mohl ignorovat požadavek na prvních 1 024 bajtů. Test je omezen na 1 MiB a 30 sekund; dosažení tohoto limitu samo neznamená vadné médium.
  6. Najděte kampaň podle ID média.

    Nejdříve doplňte ID média. Červeně označené 000 je pouze zástupná hodnota. Blok hledá přesnou hodnotu pole resourceId, včetně alternativních vizuálů, a vypíše odpovídající kampaně. Zapište si jejich názvy a ID. Neupravený blok s hodnotou 000 se bezpečně ukončí a nic nezmění.

    Použijte číslo za posledním lomítkem v URL média z kroku 5. Nejde o ID kampaně ani zařízení. Zadejte ho bez přípony .mp4.

    ID není vyplněné. Příkaz zatím nekopírujte.

    2. Zkontrolujte červeně zvýrazněný řádek a potom zkopírujte celý příkaz. Po zadání platného ID se hodnota v příkazu doplní automaticky a tlačítko Kopírovat se zpřístupní.

    Příkaz k úpravě a zkopírování:

    python3 - <<'PY'
    import json
    RESOURCE_ID = 000  # ZDE MUSÍ BÝT VAŠE ID MÉDIA
    if RESOURCE_ID <= 0:
        raise SystemExit('Nejprve doplňte ID média do 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('Kampaň:', c.get('nameCampaign'))
            print('ID kampaně:', c.get('campaignId'))
            print('Hlavní vizuál:', c.get('primary'))
            print('Alternativní vizuály:', c.get('alternative'))
    if not found:
        print('Médium se v novém playlistu nenašlo. Ověřte aktuální deník a ID.')
    PY
    

    Pokud se médium nenajde, soubor se mohl mezitím změnit. Zopakujte kontrolu aktuálního deníku a nového playlistu. Pokud ho používá více kampaní, oprava jediné nemusí stačit; ověřte všechny nalezené výskyty.

  7. Opravte kampaň v portálu.

    Otevřete nalezenou kampaň podle názvu a ID. Nedostupné médium nahraďte nově nahraným souborem, případně kampaň dočasně pozastavte, a změnu uložte. Orientujte se podle návodů Média a Kampaně.

    Počkejte na doručení upraveného playlistu a stažení jeho médií. Rychlost závisí na připojení a velikosti souborů. Znovu spusťte kontroly z kroků 3 a 4: nový playlist už nesmí odkazovat na vadný soubor, pokud jste kampaň pozastavili nebo médium nahradili.

    Pokud soubor zůstává stejný a stále obsahuje původní odkaz, upravená sestava zatím nedorazila. Ověřte online stav a uložení změny v portálu. Samotný restart nemůže obnovit soubor, pro který server dál vrací HTTP 404. Pokud potřebujete dočasně obnovit ostatní reklamy, pokračujte krokem 8; jinak ověřte výsledek v kroku 9.

  8. Nouzová lokální oprava se zálohou.

    Servisní zásah – krátce přeruší přehrávání. Použijte až po potvrzení konkrétního nedostupného média a jeho kampaně. Skript odstraní z nového playlistu celou jednu kampaň, nikoli pouze její video. Používejte jej na správném zařízení a v době, kdy lze krátce přerušit zobrazování.

    Skript ověří všechna ID, zastaví pouze device-runtime.service, zazálohuje oba soubory do adresáře /storage/playlist-backup-DATUM-CAS, vyřadí určenou kampaň z playlist_new a znovu spustí službu. Aktuální playlist přímo nepřepisuje a média nemaže. Záloha vzniká před zápisem; při chybě úpravy se pokusí obnovit původní nový playlist. Opětovné spuštění služby se provede i při chybě v tomto bloku, pokud samotný proces doběhne; výpadek napájení nebo násilné ukončení skriptu nelze tímto ošetřit.

    Před spuštěním vyplňte všechna tři pole níže:

    • DEVICE_ID: číselné ID zařízení z kroku 4.
    • CAMPAIGN_ID: ID kampaně z kroku 6.
    • RESOURCE_ID: ID nedostupného média z deníku.

    Nepřebírejte ID z příkladu, pokud neřešíte přesně tento případ. Červené hodnoty 000 jsou pojistkou: bez doplnění všech ID se kopírování nezpřístupní a neupravený skript nic nezmění. Na zařízení musí zůstat alespoň jedna další kampaň.

    1. Doplňte všechna tři ID před kopírováním

    Každé číslo patří jinému údaji. Zkontrolujte je podle kroků 4 a 6; nepoužívejte automaticky čísla z příkladu.

    Z kroku 4; ne identifikátor v záhlaví konzole.

    Z výsledku kroku 6; nejde o ID média.

    Stejné ID média, které jste ověřili v kroku 6.

    Doplňte všechna tři ID. Kopírování příkazu je zatím vypnuté.

    2. Zkontrolujte tři červeně zvýrazněné hodnoty a zkopírujte celý blok. Po spuštění se přehrávání krátce přeruší. Skript ještě samostatně ověří, že ID zařízení, kampaně a média odpovídají obsahu playlistu.

    Příkaz k úpravě a zkopírování:

    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('Nejprve doplňte všechna tři ID. Nic se nezměnilo.')
    
    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('Nesouhlasí ID zařízení.')
        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('Kampaň nebo médium neodpovídají zadaným ID.')
        data['campaigns'] = [c for c in data['campaigns']
                             if c.get('campaignId') != CAMPAIGN_ID]
        if not data['campaigns']:
            raise RuntimeError('Po vyřazení by nezůstala žádná kampaň.')
        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('Záloha:', backup)
        print('Počet ponechaných kampaní:', len(data['campaigns']))
    except Exception:
        if saved:
            shutil.copy2(backup / 'playlist_new', path)
        raise
    finally:
        subprocess.run(['systemctl', 'start', service], check=True)
    PY
    

    Úspěšný výpis obsahuje cestu k záloze a počet ponechaných kampaní. Cestu si uložte pro podporu. Pokud skript ohlásí nesoulad ID, neopravujte ho odstraněním kontrol: vraťte se ke kroku 4 nebo 6. Pokud dojde k chybě zápisu, obnovy či spuštění služby, předejte celý výpis podpoře a nepřesouvejte ručně nový playlist na místo aktuálního.

    Toto je dočasná oprava pouze daného zařízení. Nemění nastavení na serveru. Další aktualizace může vadnou kampaň znovu doručit. Dokončete proto také opravu v portálu podle kroku 7. Pokud některé jiné médium také chybí, může aktivaci dále blokovat ono.
  9. Ověřte aktivaci playlistu a skutečné přehrávání.

    Po přibližně minutě zkontrolujte službu a deník; při větších médiích dopřejte stahování více času. Tento blok už nic nemění.

    Příkaz ke zkopírování:

    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
    

    Znovu vypište kampaně příkazem z kroku 4. Aktuální playlist má obsahovat očekávanou novou sestavu, služba má být aktivní a aktuální deník nemá opakovat stejnou chybu stahování. Samotná shodná velikost souborů není dostatečný důkaz.

    Nakonec sledujte fyzickou obrazovku nebo její vzdálený náhled dostatečně dlouho, aby proběhl celý cyklus reklam. Ověřte střídání všech kampaní, které podle aktuálních podmínek mají běžet. U kampaní s časovým plánem nebo rozestupy přehrání přizpůsobte délku kontroly jejich nastavení.

  10. Co dělat, pokud problém trvá.

    • Objevilo se jiné ID média: zopakujte kroky 5 a 6 pro nový soubor. Předchozí překážka mohla zakrývat další.
    • Nový playlist nedorazil: ověřte online stav, správné cílové zařízení a uloženou změnu kampaně. Lokální úprava nedokazuje funkční doručování změn ze serveru.
    • Playlist se aktivoval, ale reklama stále chybí: zkontrolujte její časové podmínky a další chyby přehrávání. Tento postup neřeší automaticky všechny poruchy videa nebo plánování.
    • Služba neběží: zkontrolujte její stav následujícím příkazem a předejte výsledek podpoře.

    Příkaz ke zkopírování:

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

    Svému poskytovateli softwaru pošlete ID zařízení, místní čas problému včetně časového pásma, názvy očekávaných kampaní, seznam kampaní z obou playlistů, relevantní chybu z deníku a výsledek testu URL. Pokud jste provedli lokální opravu, přiložte její výpis a cestu k záloze. Neposílejte hesla ani přihlašovací údaje.

Nenašli jste, co jste hledali?
Obraťte se na svého poskytovatele softwaru.