AlexxIT / YandexStation

Управление Яндекс.Станцией и другими устройствами умного дома с Алисой из Home Assistant
https://t.me/AlexxIT_SmartHome
MIT License
1.27k stars 119 forks source link

В режиме караоке при трансляции по Chromecast трансляция в определенный момент прерывается #495

Closed x-iLex-x closed 2 months ago

x-iLex-x commented 2 months ago

При тестировании функции заметил данную проблему, в момент когда один трек заканчивается и начинается другой, либо когда вручную перелистываешь трек трансляция останавливается и остается пустой черный экран. При этом, если спустя пару секунд снова выполнить скрипт на запуск трансляции - то она появится.

В журнале следующая ошибка:

Регистратор: aiohttp.server
Источник: /usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py:421
Первое сообщение: 12:37:34 (1 сообщений)
Последнее сообщение: 12:37:34

Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_app.py", line 543, in _handle
    resp = await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_middlewares.py", line 114, in impl
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 92, in security_filter_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 83, in forwarded_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 26, in request_context_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 88, in ban_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 236, in auth_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 32, in headers_middleware
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 73, in handle
    result = await handler(request, **request.match_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 823, in get
    return await self.handle(request, camera)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/camera/__init__.py", line 863, in handle
    stream = await camera.handle_async_mjpeg_stream(request)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/yandex_station/camera.py", line 73, in handle_async_mjpeg_stream
    if cover := await self.get_cover():
                ^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/yandex_station/camera.py", line 158, in get_cover
    self.cover = draw_cover(entity.media_title, entity.media_artist, image)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/yandex_station/core/image.py", line 65, in draw_cover
    draw_text(ctx, artist, (0, HEIGHT2 + 25, WIDTH - 450, HEIGHT2), "mt", "grey", font)
  File "/config/custom_components/yandex_station/core/image.py", line 26, in draw_text
    lines = re.findall(r"(.{1,%d})(?:\s|$)" % line_width, text)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/re/__init__.py", line 217, in findall
    return _compile(pattern, flags).findall(string)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: expected string or bytes-like object, got 'NoneType'

UPD: Бывает, что трансляция зависает на одном месте и спустя какое то время прекращается, при этом, без каких-либо ошибок в журнале. Сущность camera. при этом переходит в состояние idle.

AlexxIT commented 2 months ago

Вероятно это какое-то радио. Или другая песня с пустым Артистом

x-iLex-x commented 2 months ago

Вероятно это какое-то радио. Или другая песня с пустым Артистом

В данном случае играла подборка "Плейлист дня".

AlexxIT commented 2 months ago

Желательно посмотреть атрибуты медиа плеера в момент проблемы. Но в любом случае я добавлю поддержку пустого Артиста

x-iLex-x commented 2 months ago

Желательно посмотреть атрибуты медиа плеера в момент проблемы. Но в любом случае я добавлю поддержку пустого Артиста

Попробую отловить проблему и прислать атрибуты

AlexxIT commented 2 months ago

https://github.com/AlexxIT/YandexStation/releases/tag/v3.15.1

x-iLex-x commented 2 months ago

https://github.com/AlexxIT/YandexStation/releases/tag/v3.15.1

Проблема, вызывающая ошибку в лог исчезла. Проблема с зависанием и самовольным уходом сущности camera. в состояние idle сохранилась.

Буду тестировать дальше.

AlexxIT commented 2 months ago

idle означает, что клиентов больше нет. Если б оно падало по вине интеграции - это было бы видно в логе

x-iLex-x commented 2 months ago

idle означает, что клиентов больше нет. Если б оно падало по вине интеграции - это было бы видно в логе

Да, разобрался. Это из за особенности хромкаста: когда идет трансляция, сущность хромкаста остается в состоянии paused. А хромкаст при длительной паузе автоматом отрубается.

Думаю, если бы при трансляции сущности camera. состояние хромкаста было бы отлично от paused, то трансляция бы не прекращалась со временем.

AlexxIT commented 2 months ago

Да. В моих тестах хромкаст тоже засыпал. Возможно особенность mjpeg. Он думает, что отображает статическую картинку