YandexStation icon indicating copy to clipboard operation
YandexStation copied to clipboard

Исправления функционала стриминга музыки

Open Laxilef opened this issue 2 years ago • 5 comments

Приветствую.

  1. Некоторые саундбары не умеют устанавливать конкретную громкость, только выше/ниже. Отсюда вытекает проблема, что при обращении к колонке во время стриминга звук не мьютится. Решение:
                    # если музыка играет - глушим колонку Яндекса
                    source = self.sync_sources[self._attr_source]
                    if self.sync_mute is True:
                        # включаем громкость колонки, когда с ней разговариваем
                        if state["aliceState"] != "IDLE":
                            self.sync_mute = False
                            self.hass.create_task(self.async_mute_volume(False))
                            
                            if source.get("sync_volume") is False:
                                data = {
                                    "is_volume_muted": True,
                                    "entity_id": source["entity_id"],
                                }
                                self.hass.create_task(self.hass.services.async_call("media_player", "volume_mute", data))
                            
                    else:
                        # выключаем громкость колонки, когда с ней не
                        # разговариваем
                        if state["aliceState"] == "IDLE":
                            self.sync_mute = True
                            self.hass.create_task(self.async_mute_volume(True))
                            
                            if source.get("sync_volume") is False:
                                data = {
                                    "is_volume_muted": False,
                                    "entity_id": source["entity_id"],
                                }
                                self.hass.create_task(self.hass.services.async_call("media_player", "volume_mute", data))

Условие актуально в том случае, если sync_volume=false, что не должно повлиять на обычную работу.

  1. Добавил extra параметры, чтобы при стриминге через хромкаст отображалась обложка и название:
    async def _sync_play_media(self, player_state: dict):
        self.debug(f"Sync state: play_media")

        url = await get_mp3(self.quasar.session, player_state)
        if not url:
            return

        await self.async_media_seek(0)

        source = self.sync_sources[self._attr_source]
        data = {
            "media_content_id": utils.StreamingView.get_url(
                self.hass, self._attr_unique_id, url
            ),
            "media_content_type": source.get("media_content_type", "music"),
            "entity_id": source["entity_id"],
            "extra": {
                "thumb": self._attr_media_image_url,
                "title": self._attr_media_artist + " - " + self._attr_media_title,
            },
        }
        await self.hass.services.async_call("media_player", "play_media", data)
  1. Возможность перемотки из HA:
    async def async_media_seek(self, position):
        if self.local_state:
            await self.glagol.send({"command": "rewind", "position": position})
            
        source = self.sync_sources[self._attr_source]
        data = {
            "entity_id": source["entity_id"],
            "seek_position": position,
        }
        await self.hass.services.async_call("media_player", "media_seek", data)

Возможно есть более изящные решения, не специалист :)

Laxilef avatar Mar 12 '23 12:03 Laxilef

Замечено, что не всегда происходит фактическая смена трека после окончания текущего и/или при переключении next/prev. Решение - проверять state id даже в случае, если сейчас что-то воспроизводится:

            if self.sync_state:
                # синхронизируем статус, если выбран такой режим
                if self.sync_state != stat:
                    # синхронизируем статус, если он не совпадает
                    if stat == STATE_PLAYING:
                        if self.sync_id != pstate["id"]:
                            # запускаем новую песню, если ID изменился
                            self.hass.create_task(self._sync_play_media(pstate))
                            self.sync_id = pstate["id"]
                        else:
                            # продолжаем играть, если ID не изменился
                            self.async_sync_state("media_play")

                    else:
                        # останавливаем, если ничего не играет
                        self.async_sync_state("media_pause")

                    self.sync_state = stat

                if self.sync_state == STATE_PLAYING:
                    if self.sync_id != pstate["id"]:
                        # запускаем новую песню, если ID изменился
                        self.hass.create_task(self._sync_play_media(pstate))
                        self.sync_id = pstate["id"]
                    
                    if vlvl and self.sync_volume != vlvl:
                        self.sync_mute = None
                        self.sync_volume = vlvl
                        self.async_sync_state("volume_set", volume_level=vlvl)

Laxilef avatar Mar 12 '23 22:03 Laxilef

  1. Функции мьютить внешний плеер при общении с Алисой в принципе не было. Мьютилась сама колонка с Алисой во время стриминга. А при общении с ней - размьючивалась.
  2. Спасибо. Полезно.
  3. Перемотки у внешнего плеера может не быть, тогда ХА будет ругаться. Нужно добавлять проверку на наличие функции, что и без того усложнит код больше, чем профит от самой функции.
  4. Верно. В Яндексе поменяли статусы. Поправлено в последней мастер версии

AlexxIT avatar Nov 06 '23 11:11 AlexxIT

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

AlexxIT avatar Nov 06 '23 15:11 AlexxIT

1. Функции мьютить внешний плеер при общении с Алисой в принципе не было. Мьютилась сама колонка с Алисой во время стриминга. А при общении с ней - размьючивалась.

У себя замечал, что колонка не всегда нормально распознавала голос, когда музыка стримилась на внешнее устройство, т.к. колонка рядом с акустикой. Поэтому предложил мьютить и внешнее устройство, т.е. поведение схожее с самой колонкой: когда общаемся, глушим музыку.

Если sync_volume=true, то у меня при обращении к колонке меняется уровень громкости на одну единицу, т.к. громкость устройства нельзя установить в какое-то определенное значение, только выше/ниже. М.б. добавить какой-то параметр для таких устройств?

3. Перемотки у внешнего плеера может не быть, тогда ХА будет ругаться. Нужно добавлять проверку на наличие функции, что и без того усложнит код больше, чем профит от самой функции.

Можем добавить проверку через supported_features, там есть seek. На самом деле функция удобна при управлении воспроизведением из ХА.

4. Верно. В Яндексе поменяли статусы. Поправлено в последней мастер версии

Спасибо! Теперь работает отлично :)

Laxilef avatar Nov 07 '23 19:11 Laxilef

4. Верно. В Яндексе поменяли статусы. Поправлено в последней мастер версии

HA 2023.12.1 YS v3.12.5 Стриминг по прежнему через 1 трек играет. Пробобвал мастер ветку YS поведение не меняется.

sbvitok avatar Dec 09 '23 13:12 sbvitok