Skip to content

Fix chromecast SSL error#636

Open
Den-88 wants to merge 4 commits intoAlexxIT:masterfrom
Den-88:master
Open

Fix chromecast SSL error#636
Den-88 wants to merge 4 commits intoAlexxIT:masterfrom
Den-88:master

Conversation

@Den-88
Copy link
Copy Markdown

@Den-88 Den-88 commented Mar 3, 2025

v3.18.3 Тоже периодически прерывается трансляция на хромкаст. Ловлю такую ошибку логах:

Traceback (most recent call last):
  File "/usr/local/lib/python3.13/site-packages/pychromecast/socket_client.py", line 548, in run
    if self._run_once() == 1:
       ~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.13/site-packages/pychromecast/socket_client.py", line 599, in _run_once
    message = self._read_message()
  File "/usr/local/lib/python3.13/site-packages/pychromecast/socket_client.py", line 836, in _read_message
    payload_info = self._read_bytes_from_socket(4)
  File "/usr/local/lib/python3.13/site-packages/pychromecast/socket_client.py", line 818, in _read_bytes_from_socket
    chunk = self.socket.recv(min(msglen - bytes_recd, 2048))
  File "/usr/local/lib/python3.13/ssl.py", line 1285, in recv
    return self.read(buflen)
           ~~~~~~~~~^^^^^^^^
  File "/usr/local/lib/python3.13/ssl.py", line 1140, in read
    return self._sslobj.read(len)
           ~~~~~~~~~~~~~~~~~^^^^^
ssl.SSLError: [SSL: SSLV3_ALERT_BAD_RECORD_MAC] ssl/tls alert bad record mac (_ssl.c:2638)

Эту проблему удалось победить!

Проявляется периодически... При трансляции на группу колонок проявляется чаще. При трансляции на группу из 5 колонок проблема возникает регулярно.

Причина в том, что нельзя писать и читать из сокета на колонке одновременно. В логах это выглядит так:

2025-03-03 04:01:08.557 ERROR (Thread-17) [pychromecast.socket_client] [Все колонки(192.168.0.172):32064] Error reading from socket: socket connection broken
2025-03-03 04:01:08.558 WARNING (SyncWorker_5) [pychromecast.socket_client] [Все колонки(192.168.0.172):32064] Error writing to socket: [SSL: BAD_LENGTH] bad length (_ssl.c:2483)

Проблему видимо вызывает то, что перед запуском трансляции трека мы перематываем плеер в начальную позицию await self.async_media_seek(0) если синхронизация включена, то хромкаст вслед начинает перематывать в начало, а потом сразу запускаем трансляцию await self.hass.services.async_call("media_player", "play_media", data) в результате сокет не успевает закрыть соединение и возникает ситуация с одновременным чтением и записью.

Но для хромкаста перемотка не нужна, он и так начинает играть сначала.

@AlexxIT
Copy link
Copy Markdown
Owner

AlexxIT commented Mar 3, 2025

Некрасивый код. Лучше вызвать async_media_seek правильного родительского класса. Где нет необходимости временно сбрасывать флаг sync_enabled.

@Den-88
Copy link
Copy Markdown
Author

Den-88 commented Mar 3, 2025

Некрасивый код. Лучше вызвать async_media_seek правильного родительского класса. Где нет необходимости временно сбрасывать флаг sync_enabled.

Поправил.

@AlexxIT AlexxIT self-assigned this Mar 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants