/
/
/
1"""Grouping handler."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING
6
7from pywam.lib import api_call
8
9from music_assistant.providers.samsung_wam.features.base import (
10 WamPlayerFeatureBase,
11 handle_pywam_errors,
12 retry_command,
13)
14
15if TYPE_CHECKING:
16 from music_assistant.providers.samsung_wam.player import WamPlayer
17
18
19class GroupingHandler(WamPlayerFeatureBase):
20 """Encapsulates all grouping commands sent to a speaker."""
21
22 @retry_command()
23 @handle_pywam_errors
24 async def form_group(self, group_children: list[WamPlayer], group_name: str) -> None:
25 """
26 Instruct the speaker to form a group with specified members.
27
28 :param group_children: A list of WamPlayer instances to join.
29 :param group_name: The name to apply to the newly formed group.
30 """
31 child_players = [{"ip": p.ip_address, "mac": p.player_id} for p in group_children]
32
33 group_command = api_call.set_multispk_group_mainspk(
34 name=group_name,
35 spknum=len(child_players) + 1,
36 audiosourcemacaddr=self.player.player_id,
37 audiosourcename=self.player.name,
38 subspeakers=child_players,
39 )
40 await self.speaker.client.request(group_command)
41
42 @retry_command()
43 @handle_pywam_errors
44 async def leave_group(self) -> None:
45 """Instruct the speaker to leave its current group."""
46 await self.speaker.client.request(api_call.set_ungroup())
47