Dokumentácia / Riešenie problémov / Zariadenie prehráva iba jednu alebo niektoré kampane

Zariadenie prehráva iba jednu alebo niektoré kampane

Úvod a orientácia

Na obrazovke sa prehráva iba jedna alebo niekoľko kampaní, hoci v detaile zariadenia na karte Zverejnené kampane vidíte aj ďalšie. Nepomohol ani reštart. Tento návod vás prevedie kontrolou nastavení, porovnaním playlistov a hľadaním média, ktoré môže blokovať aktualizáciu obsahu.

Playlist je zoznam kampaní a pravidiel ich prehrávania. Ak sa nepodarí pripraviť niektoré médium nového playlistu, prehrávač môže ďalej používať pôvodnú zostavu. Nie je to však jediná možná príčina: úlohu zohráva aj časový plán, priradenie kampaní, pripojenie či voľné miesto.

Postup kontroly a riešenia

Najprv diagnostika, potom oprava. Kroky 1–6 iba kontrolujú stav. Krok 7 mení kampaň v portáli a krok 8 dočasne zastaví prehrávanie a upraví jeden súbor. Nemažte plošne playlisty, médiá ani databázu.

Postup diagnostiky a opravy

  1. Skontrolujte kampane v portáli.

    Otvorte detail dotknutého zariadenia a kartu Zverejnené kampane. Pri chýbajúcich kampaniach overte priradenie k tomuto zariadeniu, aktívny stav, dátum začiatku a konca aj podmienky prehrávania vrátane dní a času. Porovnajte ich so skutočným časom zariadenia v kroku 3.

    Ak kampaň podľa plánu práve nemá bežať, samo osebe nejde o poruchu. Ak bežať má a reštart nepomohol, pokračujte. Pomôžu aj návody Kampane a Zariadenia.

  2. Otvorte Vzdialenú konzolu.

    Zariadenie musí byť online a komunikovať so serverom. Vzdialená konzola vyžaduje oprávnenie Server Administrator alebo vyššie. Otvorte ju podľa návodu k vzdialenej konzole. Príkaz vložte do vstupného poľa a odošlite tlačidlom ✓. Viacriadkový blok vložte celý vrátane posledného riadka PY.

    Samotný vzdialený náhľad obrazovky nenahrádza prístup ku konzole. Ak je zariadenie offline, najprv použite návod Kontrola pripojenia zariadenia. Nemáte potrebnú rolu? Odovzdajte postup oprávnenému správcovi; prehľad nájdete v časti Používatelia a oprávnenia.

    Príkazy nižšie sú určené pre linuxový prehrávač so službou device-runtime.service a pracovným adresárom /storage. Pythonové bloky potrebujú Python 3; test URL potrebuje curl. Ak konzola hlási neexistujúci príkaz, službu alebo cestu, nepokračujte zmenou súborov a obráťte sa na podporu.
  3. Overte čas, miesto na disku a službu prehrávača.

    Príkaz na skopírovanie:

    date
    df -h / /storage
    systemctl is-active device-runtime.service
    ls -lh --time-style=long-iso /storage/playlist /storage/playlist_new
    
    Čo vidíteČo to znamená a ako pokračovať
    Dátum a časPorovnajte ich s aktuálnym miestnym časom a časovým pásmom. Nesprávny čas môže ovplyvniť výber kampaní aj pripojenie.
    Voľné miesto v stĺpci AvailAk je úložisko plné, postupujte podľa návodu Nedostatok miesta na disku. Skontrolujte aj oddiel pripojený ako /storage.
    activeSlužba beží. To ešte nepotvrdzuje správne prehrávanie ani úspešnú aktualizáciu.
    inactive, failed alebo chýbajúce súboryPokračujte kontrolou denníka v kroku 5. Núdzovú úpravu nepoužívajte, kým neoveríte správnu inštaláciu a príčinu.

    /storage/playlist obsahuje aktuálne prijatú zostavu. /storage/playlist_new obsahuje novo doručenú zostavu, ktorej médiá prehrávač pripravuje pred aktiváciou. Novší čas a iná veľkosť druhého súboru sú dôležitou stopou, nie samostatným dôkazom poruchy. Pri bežnom sťahovaní sa môžu dočasne líšiť.

  4. Porovnajte kampane v oboch playlistoch.

    Nasledujúci blok prečíta oba súbory a vypíše číselné ID zariadenia, počet kampaní, ich ID, názvy a platnosť. Nič nemení. Poznačte si číselné ID zariadenia; v záhlaví konzoly môže byť aj iný identifikátor, ktorý do neskoršieho poľa DEVICE_ID nepatrí.

    Príkaz na skopírovanie:

    python3 - <<'PY'
    import json
    for path in ['/storage/playlist', '/storage/playlist_new']:
        print('\nSÚBOR:', path)
        try:
            with open(path) as f:
                data = json.load(f)
            print('Zariadenie:', 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
    

    Ak nový playlist obsahuje očakávané kampane, ale aktuálny iba starší výber, v ďalšom kroku hľadajte chybu ich prípravy. Ak kampane chýbajú aj v novom súbore, vráťte sa k nastaveniam a doručovaniu zmien z portálu. Chyba čítania JSON môže znamenať neúplný alebo poškodený súbor; bez ďalšieho overenia ho ručne neprepisujte.

  5. Nájdite chybu sťahovania a overte odpoveď servera.

    Zobrazte posledných 120 záznamov služby za uplynulých 20 minút. Hľadajte opakované chyby, URL média a jeho ID. Ak vidíte iba koniec chyby, zvýšte hodnotu -n 120 alebo rozšírte časové obdobie.

    Príkaz na skopírovanie:

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

    Ukážka výpisu – nevkladajte ju do konzoly. Príklad chyby, ktorú sme týmto postupom skutočne vyriešili:

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

    Received 0 bytes znamená, že prehrávač neprijal použiteľný obsah súboru. Samotná správa ešte neurčuje príčinu. V tomto príklade je ID média 1790935600695; pre vlastný prípad si poznačte ID a presnú URL zo svojho výpisu.

    Do zvýrazneného poľa nižšie vložte presnú adresu zo svojho denníka; do príkazu sa doplní automaticky. Úvodzovky ponechajte. Test zahodí stiahnuté dáta a nezmení médiá ani playlisty. Ukážkovú adresu nepoužívajte automaticky pre iné zariadenie.

    Vložte presnú adresu začínajúcu https:// alebo http://. Nekopírujte celú chybovú správu ani cestu /storage/video/…

    URL nie je vyplnená. Kopírovanie príkazu je zatiaľ vypnuté.

    2. Skontrolujte adresu v príkaze a skopírujte celý blok. Adresa sa doplní automaticky.

    Príkaz na úpravu a skopírovanie:

    curl -sS -L --connect-timeout 10 --max-time 30 \
      --range 0-1023 --max-filesize 1048576 \
      -D - -o /dev/null \
      -w '\nHTTP: %{http_code}\nStiahnuté: %{size_download} bajtov\n' \
      'SEM_VLOZTE_URL_MEDIA'
    
    Čo vidíteČo to znamená a ako pokračovať
    HTTP 404Server na požadovanej adrese médium neposkytuje. Nájdite jeho kampaň v kroku 6 a opravte ju v kroku 7.
    HTTP 401 / 403Server odmietol prístup. Overte oprávnenia a konfiguráciu služby s podporou.
    HTTP 5xxChyba servera. Riešte službu poskytujúcu súbory; vymazanie playlistu server neopraví.
    Chyba DNS, pripojenia, timeout alebo TLSPostupujte podľa konkrétnej chyby: sieť, preklad názvov, dostupnosť servera, čas alebo certifikát. Nevypínajte overovanie certifikátu.
    HTTP 200 / 206 a nenulové dátaTest získal dáta. Nepotvrdzuje úplnosť ani prehrateľnosť celého videa; skontrolujte ďalšie chyby v denníku.
    Limit veľkosti curlServer mohol ignorovať požiadavku na prvých 1 024 bajtov. Test je obmedzený na 1 MiB a 30 sekúnd; dosiahnutie limitu samo osebe neznamená chybné médium.
  6. Nájdite kampaň podľa ID média.

    Najprv doplňte ID média. Červeno označené 000 je iba zástupná hodnota. Blok hľadá presnú hodnotu poľa resourceId vrátane alternatívnych vizuálov a vypíše zodpovedajúce kampane. Poznačte si ich názvy a ID. Neupravený blok s hodnotou 000 sa bezpečne ukončí a nič nezmení.

    Použite číslo za poslednou lomkou v URL média z kroku 5. Nejde o ID kampane ani zariadenia. Zadajte ho bez prípony .mp4.

    ID nie je vyplnené. Príkaz zatiaľ nekopírujte.

    2. Skontrolujte červeno zvýraznený riadok a potom skopírujte celý príkaz. Po zadaní platného ID sa hodnota automaticky doplní do príkazu a sprístupní sa tlačidlo Kopírovať.

    Príkaz na úpravu a skopírovanie:

    python3 - <<'PY'
    import json
    RESOURCE_ID = 000  # SEM PATRÍ VAŠE ID MÉDIA
    if RESOURCE_ID <= 0:
        raise SystemExit('Najprv 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 kampane:', c.get('campaignId'))
            print('Hlavný vizuál:', c.get('primary'))
            print('Alternatívne vizuály:', c.get('alternative'))
    if not found:
        print('Médium sa v novom playliste nenašlo. Overte aktuálny denník a ID.')
    PY
    

    Ak sa médium nenájde, súbor sa mohol medzitým zmeniť. Znova skontrolujte aktuálny denník a nový playlist. Ak médium používa viac kampaní, oprava jednej nemusí stačiť; overte všetky nájdené výskyty.

  7. Opravte kampaň v portáli.

    Otvorte nájdenú kampaň podľa názvu a ID. Nedostupné médium nahraďte novým nahraným súborom alebo kampaň dočasne pozastavte a zmenu uložte. Pomôžu návody Médiá a Kampane.

    Počkajte na doručenie upraveného playlistu a stiahnutie jeho médií. Rýchlosť závisí od pripojenia a veľkosti súborov. Zopakujte kontroly z krokov 3 a 4: nový playlist už nesmie odkazovať na chybný súbor, ak ste kampaň pozastavili alebo médium nahradili.

    Ak súbor zostáva rovnaký a stále obsahuje pôvodný odkaz, upravená zostava ešte nedorazila. Overte online stav a uloženie zmeny v portáli. Samotný reštart neobnoví súbor, pre ktorý server stále vracia HTTP 404. Ak potrebujete dočasne obnoviť ostatné reklamy, pokračujte krokom 8; inak overte výsledok v kroku 9.

  8. Núdzová lokálna oprava so zálohou.

    Servisný zásah – krátko preruší prehrávanie. Použite až po potvrdení konkrétneho nedostupného média a jeho kampane. Skript odstráni z nového playlistu celú jednu kampaň, nielen jej video. Spúšťajte ho na správnom zariadení a v čase, keď možno krátko prerušiť zobrazovanie.

    Skript overí všetky ID, zastaví iba device-runtime.service, zazálohuje oba súbory do adresára /storage/playlist-backup-DATUM-CAS, vyradí určenú kampaň z playlist_new a znova spustí službu. Aktuálny playlist priamo neprepisuje a médiá nemaže. Záloha vznikne pred zápisom; pri chybe úpravy sa pokúsi obnoviť pôvodný nový playlist. O opätovné spustenie služby sa pokúsi aj pri chybe v tomto bloku, ak samotný proces dobehne; výpadok napájania alebo násilné ukončenie skriptu sa týmto nedajú ošetriť.

    Pred spustením vyplňte všetky tri polia nižšie:

    • DEVICE_ID: číselné ID zariadenia z kroku 4.
    • CAMPAIGN_ID: ID kampane z kroku 6.
    • RESOURCE_ID: ID nedostupného média z denníka.

    Nepreberajte ID z príkladu, ak neriešite presne tento prípad. Červené hodnoty 000 sú poistkou: bez doplnenia všetkých ID sa kopírovanie nesprístupní a neupravený skript nič nezmení. Na zariadení musí zostať aspoň jedna ďalšia kampaň.

    1. Pred kopírovaním doplňte všetky tri ID

    Každé číslo patrí inému údaju. Overte ich podľa krokov 4 a 6; nepoužívajte automaticky čísla z príkladu.

    Z kroku 4; nie identifikátor v záhlaví konzoly.

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

    Rovnaké ID média, ktoré ste overili v kroku 6.

    Doplňte všetky tri ID. Kopírovanie príkazu je zatiaľ vypnuté.

    2. Skontrolujte tri červeno zvýraznené hodnoty a skopírujte celý blok. Po spustení sa prehrávanie krátko preruší. Skript ešte samostatne overí, či ID zariadenia, kampane a média zodpovedajú obsahu playlistu.

    Príkaz na úpravu a skopírovanie:

    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('Najprv doplňte všetky tri ID. Nič sa nezmenilo.')
    
    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('Nesúhlasí ID zariadenia.')
        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ň alebo médium nezodpovedajú zadaným ID.')
        data['campaigns'] = [c for c in data['campaigns']
                             if c.get('campaignId') != CAMPAIGN_ID]
        if not data['campaigns']:
            raise RuntimeError('Po vyradení by nezostala žiadna 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
    

    Úspešný výpis obsahuje cestu k zálohe a počet ponechaných kampaní. Cestu si uložte pre podporu. Ak skript ohlási nesúlad ID, neodstraňujte kontroly: vráťte sa ku kroku 4 alebo 6. Pri chybe zápisu, obnovy alebo spustenia služby pošlite celý výpis podpore a nový playlist ručne nepresúvajte na miesto aktuálneho.

    Toto je dočasná oprava iba daného zariadenia. Nemení nastavenia na serveri. Ďalšia aktualizácia môže chybnú kampaň znova doručiť. Dokončite preto aj opravu v portáli podľa kroku 7. Aktiváciu môže naďalej blokovať iné chýbajúce médium.
  9. Overte aktiváciu playlistu a skutočné prehrávanie.

    Približne po minúte skontrolujte službu a denník; väčším médiám doprajte na stiahnutie viac času. Tento blok už nič nemení.

    Príkaz na skopírovanie:

    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
    

    Znova vypíšte kampane príkazom z kroku 4. Aktuálny playlist má obsahovať očakávanú novú zostavu, služba má byť aktívna a aktuálny denník už nemá opakovať rovnakú chybu sťahovania. Samotná zhodná veľkosť súborov nie je dostatočný dôkaz.

    Nakoniec sledujte fyzickú obrazovku alebo jej vzdialený náhľad dostatočne dlho, aby prebehol celý cyklus reklám. Overte striedanie všetkých kampaní, ktoré podľa aktuálnych podmienok majú bežať. Pri kampaniach s časovým plánom alebo rozostupmi prehrávania prispôsobte dĺžku kontroly ich nastaveniam.

  10. Čo robiť, ak problém pretrváva.

    • Objavilo sa iné ID média: zopakujte kroky 5 a 6 pre nový súbor. Predchádzajúca prekážka mohla zakrývať ďalšiu.
    • Nový playlist nedorazil: overte online stav, správne cieľové zariadenie a uloženú zmenu kampane. Lokálna úprava nedokazuje funkčné doručovanie zmien zo servera.
    • Playlist sa aktivoval, ale reklama stále chýba: skontrolujte jej časové podmienky a ďalšie chyby prehrávania. Tento postup automaticky nerieši všetky poruchy videa ani plánovania.
    • Služba nebeží: skontrolujte jej stav nasledujúcim príkazom a výsledok pošlite podpore.

    Príkaz na skopírovanie:

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

    Svojmu poskytovateľovi softvéru pošlite ID zariadenia, miestny čas problému vrátane časového pásma, názvy očakávaných kampaní, zoznam kampaní z oboch playlistov, relevantnú chybu z denníka a výsledok testu URL. Ak ste vykonali lokálnu opravu, priložte jej výpis a cestu k zálohe. Neposielajte heslá ani prihlasovacie údaje.

Nenašli ste, čo ste hľadali?
Obráťte sa na svojho poskytovateľa softvéru.