Документација / Решавање проблеми / Уредот репродуцира само една или дел од кампањите

Уредот репродуцира само една или дел од кампањите

Вовед и основни насоки

Екранот репродуцира само една или неколку кампањи, иако во деталите за уредот во Објавени кампањи се прикажуваат повеќе. Рестартирањето не помогнало. Овој водич Ве води низ проверка на поставките, споредување на листите за репродукција и препознавање медиуми што можеби го блокираат ажурирањето на содржината.

Листа за репродукција е списокот на кампањи и нивните правила за репродукција. Ако плеерот не може да подготви медиумска датотека потребна за нова листа, може да продолжи да ја користи претходната. Други можни причини се распоредот, целните уреди на кампањата, поврзаноста и достапниот простор за складирање.

Проверки и решавање проблеми

Дијагностицирајте го проблемот пред да менувате нешто. Чекорите 1–6 само ја проверуваат тековната состојба. Чекор 7 ја менува кампањата во порталот; чекор 8 накратко ја запира репродукцијата и менува една датотека. Не бришете групно листи за репродукција, медиуми или базата на податоци.

Постапка за дијагностика и поправка

  1. Проверете ги кампањите во порталот.

    Отворете ги деталите за засегнатиот уред и табот Објавени кампањи. За кампањите што недостигаат проверете дали се наменети за овој уред, дали се активни и дали имаат важечки почетни и крајни датуми и услови за репродукција, вклучувајќи денови и часови. Споредете ги со вистинското време на уредот во чекор 3.

    Кампања што не е планирана за репродукција во овој момент не мора да биде неисправна. Ако треба да се репродуцира, а рестартирањето не помогнало, продолжете. Видете ги и водичите за Кампањи и Уреди.

  2. Отворете Далечинска конзола.

    Уредот мора да биде поврзан и да комуницира со серверот. За Далечинска конзола е потребна улогата Server Administrator или повисока. Отворете ја како што е опишано во водичот Далечинска конзола. Залепете ја командата во полето за внесување и испратете ја со ✓. Секој повеќереден блок залепете го целосно, вклучувајќи го последниот ред PY.

    Далечинскиот преглед на екранот не обезбедува пристап до конзола. Ако уредот е без врска, прво следете го водичот за Проверка на поврзаноста на уредот. Ако Вашата улога не обезбедува пристап, побарајте овластен администратор да ги изврши овие чекори. Видете Корисници и дозволи.

    Командите подолу се за плеери засновани на Linux со услугата device-runtime.service и работниот директориум /storage. За Python-блоковите е потребен Python 3; за тестот на URL-адресата е потребен curl. Ако конзолата пријави дека команда, услуга или патека не постои, не продолжувајте со промени на датотеки. Обратете се до поддршката.
  3. Проверете ги времето, просторот на дискот и услугата на плеерот.

    Команда за копирање:

    date
    df -h / /storage
    systemctl is-active device-runtime.service
    ls -lh --time-style=long-iso /storage/playlist /storage/playlist_new
    
    Што гледатеШто значи и што да направите понатаму
    Датум и времеСпоредете ги со тековното локално време и временската зона. Неточно време може да влијае врз изборот на кампањи и поврзаноста.
    Слободен простор во колоната AvailАко просторот е полн, следете го водичот Недоволен простор на дискот. Проверете ја и партицијата монтирана на /storage.
    activeУслугата работи. Ова сѐ уште не потврдува правилна репродукција или успешно ажурирање.
    inactive, failed или датотеки што недостигаатПроверете ги дневниците во чекор 5. Не ја користете привремената поправка додека не ги проверите инсталацијата и причината.

    /storage/playlist ја содржи листата за репродукција што плеерот ја има прифатено во моментот. /storage/playlist_new ја содржи новопримената листа, чии медиуми плеерот ги подготвува пред активирањето. Поновата временска ознака или различната големина е корисна трага, но сама по себе не докажува дефект. Датотеките може привремено да се разликуваат при нормално преземање.

  4. Споредете ги кампањите во двете листи за репродукција.

    Следниот блок ги чита двете датотеки и ги наведува нумеричкото ID на уредот, бројот на кампањи, нивните ID, имиња и датуми на важност. Не менува ништо. Забележете го нумеричкото ID на уредот: заглавието на конзолата може да прикажува друг идентификатор, кој не смее подоцна да се користи во полето DEVICE_ID.

    Команда за копирање:

    python3 - <<'PY'
    import json
    for path in ['/storage/playlist', '/storage/playlist_new']:
        print('\nДАТОТЕКА:', path)
        try:
            with open(path) as f:
                data = json.load(f)
            print('Уред:', data.get('deviceId'))
            campaigns = data.get('campaigns', [])
            print('Број на кампањи:', len(campaigns))
            for c in campaigns:
                print(c.get('campaignId'), c.get('nameCampaign'),
                      'од:', c.get('start'), 'до:', c.get('end'))
        except Exception as e:
            print('ГРЕШКА:', e)
    PY
    

    Ако новата листа ги содржи очекуваните кампањи, а тековната содржи само постар избор, побарајте грешка при подготовката во следниот чекор. Ако кампањите недостигаат и во новата датотека, проверете ги поставките и доставувањето ажурирања од порталот. Грешка при парсирање JSON може да укажува на нецелосна или оштетена датотека; не ја презапишувајте рачно без дополнителни проверки.

  5. Пронајдете ја грешката при преземањето и проверете го одговорот од серверот.

    Прикажете ги последните 120 записи од дневникот на услугата во изминатите 20 минути. Барајте повторливи грешки, URL-адреса на медиумот и неговото ID. Ако го гледате само крајот на грешката, зголемете -n 120 или проширете го временскиот опсег.

    Команда за копирање:

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

    Примерен излез — не го лепете во конзолата. Пример на грешка решена со оваа постапка:

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

    Received 0 bytes значи дека плеерот не примил употреблива содржина на датотеката. Самата порака не објаснува зошто. Во овој пример, ID на медиумот е 1790935600695; за Вашиот случај, забележете ги ID и точната URL-адреса од Вашите дневници.

    Залепете ја точната адреса од Вашите дневници во означеното поле подолу; таа автоматски ќе се вметне во командата. Задржете ги наводниците. Тестот ги отфрла преземените податоци и не менува медиуми или листи за репродукција. Не ја користете автоматски примерната адреса за друг уред.

    Залепете ја точната адреса што започнува со https:// или http://. Не ја лепете целата порака за грешка или патека /storage/video/….

    URL-адресата недостига. Копирањето на командата засега е оневозможено.

    2. Проверете ја адресата во командата, а потоа копирајте го целиот блок. Адресата се вметнува автоматски.

    Команда за уредување и копирање:

    curl -sS -L --connect-timeout 10 --max-time 30 \
      --range 0-1023 --max-filesize 1048576 \
      -D - -o /dev/null \
      -w '\nHTTP: %{http_code}\nПреземени: %{size_download} бајти\n' \
      'PASTE_MEDIA_URL_HERE'
    
    Што гледатеШто значи и што да направите понатаму
    HTTP 404Серверот не го обезбедува медиумот на бараната адреса. Пронајдете ја неговата кампања во чекор 6 и поправете ја во чекор 7.
    HTTP 401 / 403Серверот го одби пристапот. Проверете ги дозволите и конфигурацијата на услугата со поддршката.
    HTTP 5xxСерверска грешка. Истражете ја услугата за датотеки; бришењето на листата за репродукција нема да го поправи серверот.
    Грешка со DNS, врска, временско ограничување или TLSСледете ја конкретната грешка: проверете ги мрежата, разрешувањето имиња, достапноста на серверот, времето или сертификатот. Не ја исклучувајте проверката на сертификатите.
    HTTP 200 / 206 и податоци што не се празниТестот примил податоци. Не потврдува дека целото видео е комплетно или може да се репродуцира; проверете ги дневниците за дополнителни грешки.
    Ограничување на големината во curlСерверот можеби го занемарил барањето за првите 1.024 бајти. Тестот е ограничен на 1 MiB и 30 секунди; достигнувањето ограничување само по себе не значи дека медиумот е неисправен.
  6. Пронајдете ја кампањата според ID на медиумот.

    Прво внесете го ID на медиумот. Црвеното 000 е само заменска вредност. Блокот ја пребарува точната вредност на полето resourceId, вклучувајќи ги алтернативните визуели, и ги наведува соодветните кампањи. Забележете ги нивните имиња и ID. Непроменет блок со вредноста 000 безбедно завршува без да менува ништо.

    Користете го бројот по последната коса црта во URL-адресата на медиумот од чекор 5. Тоа не е ID на кампањата или на уредот. Внесете го без наставката .mp4.

    ID недостига. Сѐ уште не ја копирајте командата.

    2. Проверете го редот означен со црвено, а потоа копирајте ја целата команда. Откако ќе внесете важечко ID, тоа автоматски се вметнува во командата и се овозможува копчето Копирај.

    Команда за уредување и копирање:

    python3 - <<'PY'
    import json
    RESOURCE_ID = 000  # ТУКА МОРА ДА ГО ВНЕСЕТЕ ID НА ВАШИОТ МЕДИУМ
    if RESOURCE_ID <= 0:
        raise SystemExit('Прво внесете го ID на медиумот во 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('Кампања:', c.get('nameCampaign'))
            print('ID на кампањата:', c.get('campaignId'))
            print('Основен визуел:', c.get('primary'))
            print('Алтернативни визуели:', c.get('alternative'))
    if not found:
        print('Медиумот не е најден во новата листа за репродукција. Проверете ги најновите дневници и ID.')
    PY
    

    Ако медиумот не е најден, датотеката можеби во меѓувреме се променила. Повторно проверете ги најновите дневници и новата листа за репродукција. Ако повеќе кампањи го користат медиумот, поправката на само една можеби нема да биде доволна; проверете го секое совпаѓање.

  7. Поправете ја кампањата во порталот.

    Отворете ја кампањата што ја препознавте по име и ID. Заменете го недостапниот медиум со новоприкачена датотека или привремено паузирајте ја кампањата и зачувајте ја промената. Видете ги водичите за Медиуми и Кампањи.

    Почекајте да пристигне ажурираната листа за репродукција и да се преземат нејзините медиуми. Потребното време зависи од поврзаноста и големината на датотеките. Повторете ги проверките во чекорите 3 и 4: новата листа не смее повеќе да упатува на неисправната датотека ако сте ја паузирале кампањата или сте го замениле медиумот.

    Ако датотеката е непроменета и сѐ уште го содржи првичното упатување, ажурираната листа не пристигнала. Проверете ги поврзаноста и дали промената во порталот е зачувана. Самото рестартирање не може да обнови датотека за која серверот и понатаму враќа HTTP 404. Ако треба привремено да ги обновите другите реклами, продолжете со чекор 8; во спротивно проверете го резултатот во чекор 9.

  8. Привремена локална поправка со резервна копија.

    Сервисна постапка — накратко ја прекинува репродукцијата. Користете ја само откако ќе ги потврдите конкретниот недостапен медиум и неговата кампања. Скриптата отстранува цела една кампања од новата листа за репродукција, а не само нејзиното видео. Извршете ја на правилниот уред во време кога е прифатлив краток прекин на репродукцијата.

    Скриптата ги проверува сите ID, ја запира само услугата device-runtime.service, прави резервни копии на двете датотеки во /storage/playlist-backup-DATUM-CAS, ја отстранува наведената кампања од playlist_new и повторно ја стартува услугата. Не ја презапишува директно тековната листа за репродукција и не брише медиуми. Пред запишувањето се прави резервна копија; ако уредувањето не успее, скриптата се обидува да ја врати првичната нова листа. Се обидува и да ја рестартира услугата ако во овој блок се појави грешка, под услов скриптата да може да заврши; прекин на напојување или присилно прекинување не може да се обработи на овој начин.

    Пред извршувањето пополнете ги сите три полиња подолу:

    • DEVICE_ID: нумеричкото ID на уредот од чекор 4.
    • CAMPAIGN_ID: ID на кампањата од чекор 6.
    • RESOURCE_ID: ID на недостапниот медиум од дневниците.

    Не ги користете примерните ID освен ако не работите токму на тој случај. Црвените вредности 000 се заштита: копирањето останува оневозможено додека не се пополнат сите ID, а непроменетата скрипта не менува ништо. На уредот мора да остане најмалку уште една кампања.

    1. Внесете ги сите три ID пред копирањето

    Секој број идентификува различна ставка. Проверете ги според чекорите 4 и 6; не ги користете автоматски примерните вредности.

    Од чекор 4; не е идентификаторот во заглавието на конзолата.

    Од чекор 6; ова не е ID на медиумот.

    Истото ID на медиумот што го проверивте во чекор 6.

    Внесете ги сите три ID. Копирањето на командата засега е оневозможено.

    2. Проверете ги трите вредности означени со црвено, а потоа копирајте го целиот блок. Извршувањето накратко ја прекинува репродукцијата. Скриптата проверува и дали ID на уредот, кампањата и медиумот се совпаѓаат со содржината на листата за репродукција.

    Команда за уредување и копирање:

    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('Прво внесете ги сите три ID. Ништо не е променето.')
    
    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 на уредот не се совпаѓа.')
        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('Кампањата или медиумот не се совпаѓаат со наведените ID.')
        data['campaigns'] = [c for c in data['campaigns']
                             if c.get('campaignId') != CAMPAIGN_ID]
        if not data['campaigns']:
            raise RuntimeError('По исклучувањето не би останала ниту една кампања.')
        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)
        print('Задржани кампањи:', len(data['campaigns']))
    except Exception:
        if saved:
            shutil.copy2(backup / 'playlist_new', path)
        raise
    finally:
        subprocess.run(['systemctl', 'start', service], check=True)
    PY
    

    Успешниот излез ги содржи патеката на резервната копија и бројот на задржани кампањи. Зачувајте ја патеката за поддршката. Ако скриптата пријави несовпаѓање на ID, не ги отстранувајте проверките: вратете се на чекор 4 или 6. Ако запишувањето, обновувањето или стартувањето на услугата не успее, испратете го целиот излез до поддршката; не ја преместувајте рачно новата листа врз тековната.

    Оваа привремена поправка влијае само врз овој уред. Не ги менува поставките на серверот. Подоцнежно ажурирање може повторно да ја достави неисправната кампања. Завршете ја и поправката во порталот во чекор 7. Друг медиум што недостига и понатаму може да го блокира активирањето.
  9. Проверете ги активирањето на листата и вистинската репродукција.

    По околу една минута проверете ги услугата и дневниците; оставете повеќе време за преземање големи медиумски датотеки. Овој блок не менува ништо.

    Команда за копирање:

    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
    

    Повторно наведете ги кампањите со командата од чекор 4. Тековната листа треба да го содржи очекуваниот нов избор, услугата треба да биде активна, а тековните дневници повеќе да не ја повторуваат истата грешка при преземањето. Самото совпаѓање на големините на датотеките не е доволен доказ.

    На крајот набљудувајте го физичкиот екран или неговиот далечински преглед доволно долго за целосен рекламен циклус. Проверете дали се прикажуваат сите кампањи што треба да се репродуцираат според тековните услови. За закажани кампањи или кампањи со интервали меѓу репродукциите, соодветно приспособете го периодот на набљудување.

  10. Ако проблемот продолжи.

    • Се појавува друго ID на медиум: повторете ги чекорите 5 и 6 за новата датотека. Претходната блокада можеби прикривала друга.
    • Новата листа за репродукција не пристигнала: проверете ги поврзаноста, целниот уред и зачуваната промена на кампањата. Локално уредување не докажува дека ажурирањата од серверот се доставуваат правилно.
    • Листата е активна, но реклама сѐ уште недостига: проверете ги нејзините услови за распоред и дополнителните грешки при репродукцијата. Оваа постапка не ја поправа автоматски секоја грешка со видео или распоред.
    • Услугата не работи: проверете го нејзиниот статус со следнава команда и испратете го резултатот до поддршката.

    Команда за копирање:

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

    Испратете му на Вашиот добавувач на софтвер ID на уредот, локално време на проблемот со временската зона, имиња на очекуваните кампањи, двата списока на кампањи, соодветната грешка од дневникот и резултатот од тестот на URL-адресата. Ако сте ја извршиле локалната поправка, додајте ги нејзиниот излез и патеката на резервната копија. Не испраќајте лозинки или податоци за најава.

Не го најдовте тоа што го баравте?
Контактирајте го давателот на софтверот.