Исправления функционала стриминга музыки
Приветствую.
- Некоторые саундбары не умеют устанавливать конкретную громкость, только выше/ниже. Отсюда вытекает проблема, что при обращении к колонке во время стриминга звук не мьютится. Решение:
# если музыка играет - глушим колонку Яндекса
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, что не должно повлиять на обычную работу.
- Добавил 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)
- Возможность перемотки из 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)
Возможно есть более изящные решения, не специалист :)
Замечено, что не всегда происходит фактическая смена трека после окончания текущего и/или при переключении 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)
- Функции мьютить внешний плеер при общении с Алисой в принципе не было. Мьютилась сама колонка с Алисой во время стриминга. А при общении с ней - размьючивалась.
- Спасибо. Полезно.
- Перемотки у внешнего плеера может не быть, тогда ХА будет ругаться. Нужно добавлять проверку на наличие функции, что и без того усложнит код больше, чем профит от самой функции.
- Верно. В Яндексе поменяли статусы. Поправлено в последней мастер версии
https://github.com/AlexxIT/YandexStation/releases/tag/v3.12.5
1. Функции мьютить внешний плеер при общении с Алисой в принципе не было. Мьютилась сама колонка с Алисой во время стриминга. А при общении с ней - размьючивалась.
У себя замечал, что колонка не всегда нормально распознавала голос, когда музыка стримилась на внешнее устройство, т.к. колонка рядом с акустикой. Поэтому предложил мьютить и внешнее устройство, т.е. поведение схожее с самой колонкой: когда общаемся, глушим музыку.
Если sync_volume=true, то у меня при обращении к колонке меняется уровень громкости на одну единицу, т.к. громкость устройства нельзя установить в какое-то определенное значение, только выше/ниже. М.б. добавить какой-то параметр для таких устройств?
3. Перемотки у внешнего плеера может не быть, тогда ХА будет ругаться. Нужно добавлять проверку на наличие функции, что и без того усложнит код больше, чем профит от самой функции.
Можем добавить проверку через supported_features, там есть seek. На самом деле функция удобна при управлении воспроизведением из ХА.
4. Верно. В Яндексе поменяли статусы. Поправлено в последней мастер версии
Спасибо! Теперь работает отлично :)
4. Верно. В Яндексе поменяли статусы. Поправлено в последней мастер версии
HA 2023.12.1 YS v3.12.5 Стриминг по прежнему через 1 трек играет. Пробобвал мастер ветку YS поведение не меняется.