CONF_PLAYER_DSP,
CONF_PLAYERS,
CONF_PRE_ANNOUNCE_CHIME_URL,
+ SYNCGROUP_PREFIX,
)
from music_assistant.helpers.api import api_command
from music_assistant.helpers.tags import async_parse_tags
pre_announce_url=pre_announce_url,
)
announcement = PlayerMedia(
- uri=self.mass.streams.get_announcement_url(player_id, url, announce_data),
+ uri=self.mass.streams.get_announcement_url(
+ player_id, announce_data=announce_data
+ ),
media_type=MediaType.ANNOUNCEMENT,
title="Announcement",
custom_data=announce_data,
# we simply permanently delete the player config since it is not registered
self.delete_player_config(player_id)
return
+ if player.type == PlayerType.GROUP and player_id.startswith(SYNCGROUP_PREFIX):
+ await self._sync_groups.remove_group_player(player_id)
+ return
if player.type == PlayerType.GROUP:
# Handle group player removal
+ player.provider.check_feature(ProviderFeature.REMOVE_GROUP_PLAYER)
await player.provider.remove_group_player(player_id)
return
player.provider.check_feature(ProviderFeature.REMOVE_PLAYER)
):
await self._handle_member_collisions(member)
if not member.powered and member.power_control != PLAYER_CONTROL_NONE:
- await member.power(True)
+ await self.mass.players.cmd_power(member.player_id, True)
# Set up the sync group with the new leader
await self._handle_leader_transition(new_leader)
elif prev_power and not powered:
self, only_powered=True, active_only=True
):
if member.powered and member.power_control != PLAYER_CONTROL_NONE:
- await member.power(False)
+ await self.mass.players.cmd_power(member.player_id, False)
if not powered:
# Reset to unfiltered static members list when powered off
queue.queue_id, CONF_CROSSFADE_DURATION, 10
)
self.logger.info(
- "Start Queue Flow stream for Queue %s - %s: %s",
- smart_fades_mode,
+ "Start Queue Flow stream for Queue %s - crossfade: %s %s",
queue.display_name,
- f"{standard_crossfade_duration}s"
+ smart_fades_mode,
+ f"({standard_crossfade_duration}s)"
if smart_fades_mode == SmartFadesMode.STANDARD_CROSSFADE
else "",
)
CONF_ENTRY_OUTPUT_CODEC,
CONF_ENTRY_SYNC_ADJUST,
DEFAULT_PCM_FORMAT,
+ VERBOSE_LOG_LEVEL,
create_sample_rates_config_entry,
)
from music_assistant.helpers.ffmpeg import get_ffmpeg_stream
artist=metadata.get("artist"),
image_url=metadata.get("image_url"),
duration=metadata.get("duration"),
- queue_id=metadata.get("queue_id"),
+ source_id=metadata.get("source_id"),
queue_item_id=metadata.get("queue_item_id"),
)
else:
"artist": media.artist,
"image_url": media.image_url,
"duration": media.duration,
- "queue_id": media.source_id,
+ "source_id": media.source_id,
"queue_item_id": media.queue_item_id,
}
if queue := self.mass.player_queues.get(media.source_id):
_, param = event_data.split(" ", 1)
if param.isnumeric():
await self.mass.player_queues.seek(queue.queue_id, int(param))
- self.logger.debug("CLI Event: %s", event_data)
+ self.logger.log(VERBOSE_LOG_LEVEL, "CLI Event: %s", event_data)
def _handle_sync(self) -> None:
"""Synchronize audio of a sync slimplayer."""
icon=determine_recommendation_icon(section["title"]),
)
for recommended_item in section.get("contents", []):
+ if not recommended_item:
+ continue # yeah this seems to happen sometimes ?!
if recommended_item.get("videoId"):
# Probably a track
try: