Документация / Отстраняване на проблеми / Устройството възпроизвежда само една или част от кампаниите

Устройството възпроизвежда само една или част от кампаниите

Въведение и ориентация

Екранът възпроизвежда само една или няколко кампании, въпреки че подробностите на устройството в Публикувани кампании показват повече. Рестартирането не е помогнало. Това ръководство ви води през проверка на настройките, сравняване на плейлистите и откриване на медийни файлове, които може да блокират актуализирането на съдържанието.

Плейлистът е списъкът с кампании и правилата за тяхното възпроизвеждане. Ако плейърът не може да подготви медиен файл, необходим за нов плейлист, той може да продължи да използва предишния. Други възможни причини са графикът, насочването на кампаниите, свързаността и свободното място в хранилището.

Проверки и отстраняване на проблеми

Диагностицирайте проблема, преди да правите промени. Стъпки 1–6 само проверяват текущото състояние. Стъпка 7 променя кампанията в портала; стъпка 8 спира възпроизвеждането за кратко и променя един файл. Не изтривайте плейлисти, медийни файлове или базата данни накуп.

Процедура за диагностика и поправка

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

    Отворете подробностите на засегнатото устройство и раздела Публикувани кампании. За липсващите кампании проверете дали са насочени към това устройство, активни ли са и имат ли валидни начални и крайни дати и условия за възпроизвеждане, включително дни и часове. Сравнете ги с действителното време на устройството в стъпка 3.

    Кампания, която не е планирана за този момент, не е непременно неизправна. Ако трябва да се възпроизвежда и рестартирането не е помогнало, продължете. Вижте също ръководствата за Кампании и Устройства.

  2. Отворете дистанционната конзола.

    Устройството трябва да е онлайн и да комуникира със сървъра. Дистанционната конзола изисква роля на сървърен администратор или по-висока. Отворете я според описанието в ръководството Дистанционна конзола. Поставете командата в полето за въвеждане и я изпратете с ✓. Поставяйте всеки многострочен блок изцяло, включително последния ред 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('\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)
    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}\nDownloaded: %{size_download} bytes\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  # 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.')
    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('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)
    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 адреса. Ако сте извършили локалната поправка, включете резултата ѝ и пътя към резервното копие. Не изпращайте пароли или данни за вход.

Не намерихте това, което търсите?
Свържете се с Вашия доставчик на софтуер.