Dokumentacija / Rješavanje problema / Uređaj prikazuje samo jednu ili neke kampanje

Uređaj prikazuje samo jednu ili neke kampanje

Uvod i orijentacija

Na zaslonu se prikazuje samo jedna ili nekoliko kampanja, iako u pojedinostima uređaja na kartici Objavljene kampanje vidite i druge. Ni ponovno pokretanje nije pomoglo. Ovaj vas vodič vodi kroz provjeru postavki, usporedbu popisa za reprodukciju i pronalaženje medija koji možda blokira ažuriranje sadržaja.

Popis za reprodukciju sadrži kampanje i pravila njihove reprodukcije. Ako uređaj ne uspije pripremiti neku medijsku datoteku za novi popis, može nastaviti koristiti prethodni. No postoje i drugi mogući uzroci: raspored, dodjela kampanja, veza ili slobodan prostor.

Provjera i rješavanje problema

Najprije utvrdite uzrok, zatim otklonite problem. Koraci 1–6 samo provjeravaju stanje. Korak 7 mijenja kampanju na portalu, a korak 8 privremeno zaustavlja reprodukciju i mijenja jednu datoteku. Nemojte skupno brisati popise za reprodukciju, medije ili bazu podataka.

Postupak dijagnostike i popravka

  1. Provjerite kampanje na portalu.

    Otvorite pojedinosti zahvaćenog uređaja i karticu Objavljene kampanje. Za kampanje koje se ne prikazuju provjerite jesu li dodijeljene tom uređaju i aktivne te imaju li odgovarajući datum početka i završetka i uvjete reprodukcije, uključujući dane i vrijeme. Usporedite ih sa stvarnim vremenom na uređaju u koraku 3.

    Ako kampanja prema rasporedu trenutačno ne treba biti prikazana, to samo po sebi nije kvar. Ako bi se trebala prikazivati, a ponovno pokretanje nije pomoglo, nastavite. Pogledajte i vodiče Kampanje i Uređaji.

  2. Otvorite udaljenu konzolu.

    Uređaj mora biti online i komunicirati s poslužiteljem. Udaljena konzola zahtijeva ovlasti Server Administrator ili više. Otvorite je prema vodiču Udaljena konzola. Zalijepite naredbu u polje za unos i pošaljite je gumbom ✓. Višeredni blok zalijepite u cijelosti, uključujući završni redak PY.

    Sam udaljeni pregled zaslona ne omogućuje pristup konzoli. Ako uređaj nije na mreži, najprije slijedite vodič Provjera veze uređaja. Nemate potrebnu ulogu? Proslijedite postupak ovlaštenom administratoru; pregled je u odjeljku Korisnici i ovlasti.

    Naredbe u nastavku namijenjene su Linux uređajima sa reproduktorom, servisom device-runtime.service i radnim direktorijem /storage. Python blokovi zahtijevaju Python 3, a test URL-a zahtijeva curl. Ako konzola prijavi da naredba, servis ili putanja ne postoji, nemojte mijenjati datoteke. Obratite se podršci.
  3. Provjerite vrijeme, prostor na disku i servis za reprodukciju.

    Naredba za kopiranje:

    date
    df -h / /storage
    systemctl is-active device-runtime.service
    ls -lh --time-style=long-iso /storage/playlist /storage/playlist_new
    
    Što viditeŠto to znači i kako nastaviti
    Datum i vrijemeUsporedite ih s trenutačnim lokalnim vremenom i vremenskom zonom. Netočno vrijeme može utjecati na odabir kampanja i povezivanje.
    Slobodan prostor u stupcu AvailAko je prostor popunjen, slijedite vodič Nedovoljno prostora na disku. Provjerite i particiju montiranu na /storage.
    activeServis je pokrenut. To još ne potvrđuje ispravnu reprodukciju ni uspješno ažuriranje.
    inactive, failed ili datoteke koje nedostajuNastavite provjerom zapisnika u koraku 5. Nemojte primjenjivati privremeni popravak dok ne provjerite instalaciju i uzrok.

    /storage/playlist sadrži trenutačno prihvaćeni popis za reprodukciju. /storage/playlist_new sadrži novoprimljeni popis čije medije uređaj priprema prije aktivacije. Novija vremenska oznaka i druga veličina datoteke važan su trag, ali sami po sebi nisu dokaz kvara. Tijekom uobičajenog preuzimanja datoteke se mogu privremeno razlikovati.

  4. Usporedite kampanje na oba popisa za reprodukciju.

    Sljedeći blok čita obje datoteke i ispisuje brojčani ID uređaja, broj kampanja, njihove ID-jeve, nazive i razdoblje valjanosti. Ništa ne mijenja. Zabilježite brojčani ID uređaja: u zaglavlju konzole može biti drugi identifikator koji kasnije ne smijete unijeti u polje DEVICE_ID.

    Naredba za kopiranje:

    python3 - <<'PY'
    import json
    for path in ['/storage/playlist', '/storage/playlist_new']:
        print('\nDATOTEKA:', path)
        try:
            with open(path) as f:
                data = json.load(f)
            print('Uređaj:', data.get('deviceId'))
            campaigns = data.get('campaigns', [])
            print('Broj kampanja:', 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('POGREŠKA:', e)
    PY
    

    Ako novi popis sadrži očekivane kampanje, a trenutačni samo stariji izbor, u sljedećem koraku potražite pogrešku pri pripremi medija. Ako kampanje nedostaju i u novoj datoteci, provjerite postavke i dostavu promjena s portala. Pogreška pri čitanju JSON-a može upućivati na nepotpunu ili oštećenu datoteku; nemojte je ručno prepisivati bez dodatne provjere.

  5. Pronađite pogrešku preuzimanja i provjerite odgovor poslužitelja.

    Prikažite posljednjih 120 zapisa servisa iz proteklih 20 minuta. Potražite pogreške koje se ponavljaju, URL medija i njegov ID. Ako vidite samo kraj pogreške, povećajte vrijednost -n 120 ili proširite vremenski raspon.

    Naredba za kopiranje:

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

    Primjer ispisa – nemojte ga lijepiti u konzolu. Primjer pogreške koju smo ovim postupkom uspješno riješili:

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

    Received 0 bytes znači da uređaj nije primio upotrebljiv sadržaj datoteke. Sama poruka još ne otkriva uzrok. U ovom primjeru ID medija je 1790935600695; za svoj slučaj zabilježite ID i točan URL iz vlastitog zapisnika.

    U istaknuto polje u nastavku zalijepite točnu adresu iz zapisnika; automatski će se umetnuti u naredbu. Ostavite navodnike. Test odbacuje preuzete podatke i ne mijenja medije ni popise za reprodukciju. Nemojte automatski koristiti adresu iz primjera za drugi uređaj.

    Unesite točnu adresu koja počinje s https:// ili http://. Nemojte kopirati cijelu poruku pogreške ni putanju /storage/video/…

    URL nije unesen. Kopiranje naredbe zasad je onemogućeno.

    2. Provjerite adresu u naredbi pa kopirajte cijeli blok. Adresa se umeće automatski.

    Naredba za prilagodbu i kopiranje:

    curl -sS -L --connect-timeout 10 --max-time 30 \
      --range 0-1023 --max-filesize 1048576 \
      -D - -o /dev/null \
      -w '\nHTTP: %{http_code}\nPreuzeto: %{size_download} bajtova\n' \
      'OVDJE_UNESITE_URL_MEDIJA'
    
    Što viditeŠto to znači i kako nastaviti
    HTTP 404Poslužitelj ne pruža medij na traženoj adresi. Pronađite njegovu kampanju u koraku 6 i ispravite je u koraku 7.
    HTTP 401 / 403Poslužitelj je odbio pristup. S podrškom provjerite ovlasti i konfiguraciju servisa.
    HTTP 5xxPogreška poslužitelja. Provjerite servis koji pruža datoteke; brisanje popisa za reprodukciju neće popraviti poslužitelj.
    Pogreška DNS-a, veze, isteka vremena ili TLS-aPostupite prema konkretnoj pogrešci: provjerite mrežu, razrješavanje naziva, dostupnost poslužitelja, vrijeme ili certifikat. Nemojte isključivati provjeru certifikata.
    HTTP 200 / 206 i primljeni podaciTest je primio podatke. To ne potvrđuje da je cijeli video potpun ili da se može reproducirati; provjerite ima li drugih pogrešaka u zapisniku.
    Ograničenje veličine u curluPoslužitelj je možda zanemario zahtjev za prvih 1 024 bajta. Test je ograničen na 1 MiB i 30 sekundi; dosegnuto ograničenje samo po sebi ne znači da je medij neispravan.
  6. Pronađite kampanju prema ID-ju medija.

    Najprije unesite ID medija. Crveno označena vrijednost 000 samo je zamjenska vrijednost. Blok traži točnu vrijednost polja resourceId, uključujući alternativne vizuale, i ispisuje odgovarajuće kampanje. Zabilježite njihove nazive i ID-jeve. Neizmijenjeni blok s vrijednošću 000 sigurno se prekida i ništa ne mijenja.

    Upotrijebite broj nakon posljednje kose crte u URL-u medija iz koraka 5. To nije ID kampanje ni uređaja. Unesite ga bez nastavka .mp4.

    ID nije unesen. Nemojte još kopirati naredbu.

    2. Provjerite crveno istaknuti redak pa kopirajte cijelu naredbu. Nakon unosa valjanog ID-ja vrijednost se automatski umeće u naredbu i omogućuje se gumb Kopiraj.

    Naredba za prilagodbu i kopiranje:

    python3 - <<'PY'
    import json
    RESOURCE_ID = 000  # OVDJE MORA BITI VAŠ ID MEDIJA
    if RESOURCE_ID <= 0:
        raise SystemExit('Najprije unesite ID medija u 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('Kampanja:', c.get('nameCampaign'))
            print('ID kampanje:', c.get('campaignId'))
            print('Glavni vizual:', c.get('primary'))
            print('Alternativni vizuali:', c.get('alternative'))
    if not found:
        print('Medij nije pronađen na novom popisu. Provjerite najnoviji zapisnik i ID.')
    PY
    

    Ako medij nije pronađen, datoteka se možda u međuvremenu promijenila. Ponovno provjerite najnoviji zapisnik i novi popis za reprodukciju. Ako medij koristi više kampanja, ispravak samo jedne možda neće biti dovoljan; provjerite sve rezultate.

  7. Ispravite kampanju na portalu.

    Otvorite pronađenu kampanju prema nazivu i ID-ju. Nedostupni medij zamijenite novom učitanom datotekom ili privremeno pauzirajte kampanju i spremite promjenu. Pogledajte vodiče Mediji i Kampanje.

    Pričekajte dostavu ažuriranog popisa za reprodukciju i preuzimanje njegovih medija. Potrebno vrijeme ovisi o vezi i veličini datoteka. Ponovite provjere iz koraka 3 i 4: novi popis više ne smije upućivati na neispravnu datoteku ako ste pauzirali kampanju ili zamijenili medij.

    Ako je datoteka ostala ista i još sadrži izvorni odabir, ažurirani popis još nije stigao. Provjerite je li uređaj na mreži i je li promjena spremljena na portalu. Samo ponovno pokretanje ne može obnoviti datoteku za koju poslužitelj i dalje vraća HTTP 404. Ako trebate privremeno vratiti ostale oglase, nastavite na korak 8; inače provjerite rezultat u koraku 9.

  8. Privremeni lokalni popravak sa sigurnosnom kopijom.

    Servisni zahvat – kratko prekida reprodukciju. Primijenite ga tek nakon potvrde konkretnog nedostupnog medija i njegove kampanje. Skripta uklanja cijelu jednu kampanju s novog popisa, a ne samo njezin video. Pokrenite je na pravom uređaju i u vrijeme kada je prihvatljiv kratak prekid prikazivanja.

    Skripta provjerava sve ID-jeve, zaustavlja samo device-runtime.service, izrađuje sigurnosnu kopiju obiju datoteka u direktoriju /storage/playlist-backup-DATUM-CAS, uklanja navedenu kampanju iz playlist_new i ponovno pokreće servis. Ne prepisuje izravno trenutačni popis i ne briše medije. Sigurnosna kopija nastaje prije zapisivanja; ako izmjena ne uspije, skripta pokušava vratiti izvornu novu datoteku. Pokušava ponovno pokrenuti servis i pri pogrešci unutar ovog bloka, ako se izvršavanje skripte može dovršiti; nestanak napajanja ili prisilni prekid skripte time se ne mogu obraditi.

    Prije pokretanja ispunite sva tri polja u nastavku:

    • DEVICE_ID: brojčani ID uređaja iz koraka 4.
    • CAMPAIGN_ID: ID kampanje iz koraka 6.
    • RESOURCE_ID: ID nedostupnog medija iz zapisnika.

    Nemojte preuzimati ID-jeve iz primjera ako ne rješavate upravo taj slučaj. Crvene vrijednosti 000 služe kao zaštita: kopiranje ostaje onemogućeno dok ne unesete sve ID-jeve, a neizmijenjena skripta ništa ne mijenja. Na uređaju mora ostati barem još jedna kampanja.

    1. Unesite sva tri ID-ja prije kopiranja

    Svaki broj označava drugi podatak. Provjerite ih prema koracima 4 i 6; nemojte automatski koristiti brojeve iz primjera.

    Iz koraka 4; nije identifikator iz zaglavlja konzole.

    Iz rezultata koraka 6; nije ID medija.

    Isti ID medija koji ste provjerili u koraku 6.

    Unesite sva tri ID-ja. Kopiranje naredbe zasad je onemogućeno.

    2. Provjerite tri crveno istaknute vrijednosti pa kopirajte cijeli blok. Pokretanje kratko prekida reprodukciju. Skripta dodatno provjerava odgovaraju li ID-jevi uređaja, kampanje i medija sadržaju popisa za reprodukciju.

    Naredba za prilagodbu i kopiranje:

    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('Najprije unesite sva tri ID-ja. Ništa nije promijenjeno.')
    
    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('ID uređaja se ne podudara.')
        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('Kampanja ili medij ne odgovaraju unesenim ID-jevima.')
        data['campaigns'] = [c for c in data['campaigns']
                             if c.get('campaignId') != CAMPAIGN_ID]
        if not data['campaigns']:
            raise RuntimeError('Nakon isključivanja ne bi ostala nijedna kampanja.')
        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('Sigurnosna kopija:', backup)
        print('Broj preostalih kampanja:', len(data['campaigns']))
    except Exception:
        if saved:
            shutil.copy2(backup / 'playlist_new', path)
        raise
    finally:
        subprocess.run(['systemctl', 'start', service], check=True)
    PY
    

    Uspješan ispis sadrži putanju sigurnosne kopije i broj preostalih kampanja. Spremite putanju za podršku. Ako skripta prijavi nepodudaranje ID-jeva, nemojte uklanjati provjere: vratite se na korak 4 ili 6. Ako zapisivanje, vraćanje datoteke ili pokretanje servisa ne uspije, pošaljite cijeli ispis podršci; nemojte ručno premještati novi popis preko trenutačnog.

    Ovaj privremeni popravak vrijedi samo za taj uređaj. Ne mijenja postavke na poslužitelju. Sljedeće ažuriranje može ponovno dostaviti neispravnu kampanju. Zato dovršite i ispravak na portalu prema koraku 7. Aktivaciju može i dalje blokirati neki drugi medij koji nedostaje.
  9. Provjerite aktivaciju popisa i stvarnu reprodukciju.

    Nakon otprilike jedne minute provjerite servis i zapisnik; za veće medije pričekajte dulje. Ovaj blok ništa ne mijenja.

    Naredba za kopiranje:

    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
    

    Ponovno ispišite kampanje naredbom iz koraka 4. Trenutačni popis treba sadržavati očekivani novi izbor, servis treba biti aktivan, a aktualni zapisnik ne bi trebao ponavljati istu pogrešku preuzimanja. Sama jednaka veličina datoteka nije dovoljan dokaz.

    Na kraju promatrajte zaslon uređaja ili njegov udaljeni pregled dovoljno dugo da prođe cijeli ciklus oglasa. Provjerite prikazuju li se sve kampanje koje prema trenutačnim uvjetima trebaju biti aktivne. Za kampanje s rasporedom ili razmacima između prikazivanja prilagodite trajanje provjere njihovim postavkama.

  10. Što učiniti ako problem i dalje postoji.

    • Pojavio se drugi ID medija: ponovite korake 5 i 6 za novu datoteku. Prethodna je prepreka možda prikrivala drugu.
    • Novi popis za reprodukciju nije stigao: provjerite je li uređaj na mreži, je li odabran pravi ciljni uređaj i je li promjena kampanje spremljena. Lokalna izmjena ne dokazuje ispravnu dostavu promjena s poslužitelja.
    • Popis je aktiviran, ali oglas i dalje nedostaje: provjerite njegove vremenske uvjete i druge pogreške reprodukcije. Ovaj postupak ne rješava automatski svaki kvar videa ili rasporeda.
    • Servis nije pokrenut: provjerite njegovo stanje sljedećom naredbom i pošaljite rezultat podršci.

    Naredba za kopiranje:

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

    Svojem pružatelju softvera pošaljite ID uređaja, lokalno vrijeme problema s vremenskom zonom, nazive očekivanih kampanja, oba popisa kampanja, relevantnu pogrešku iz zapisnika i rezultat testa URL-a. Ako ste primijenili lokalni popravak, priložite njegov ispis i putanju sigurnosne kopije. Nemojte slati lozinke ni podatke za prijavu.

Niste pronašli ono što ste tražili?
Obratite se svojem pružatelju softvera.