/
/
1"""Setup flow for the AirPlay Receiver plugin."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING, Any
6
7from music_assistant_models.config_entries import ConfigEntry
8from music_assistant_models.enums import ConfigEntryType
9
10from music_assistant.constants import CONF_ENTRY_WARN_PREVIEW
11from music_assistant.helpers.config_entries import create_player_selector
12from music_assistant.models.setup_flow import SetupFlowError
13
14from . import (
15 CONF_AIRPLAY_NAME,
16 CONF_MASS_PLAYER_ID,
17 DEFAULT_AIRPLAY_NAME,
18 PLAYER_ID_AUTO,
19)
20
21if TYPE_CHECKING:
22 from music_assistant.models.setup_flow import SetupSession
23
24
25async def run_setup(session: SetupSession) -> None:
26 """
27 Configure the target player and advertised AirPlay receiver name.
28
29 :param session: The setup session driving the flow.
30 """
31 setup_data = dict(session.context.setup_data)
32 errors: dict[str, str] | None = None
33 while True:
34 prefill: dict[str, Any] = {**session.context.values, **setup_data}
35 airplay_name = str(prefill.get(CONF_AIRPLAY_NAME) or DEFAULT_AIRPLAY_NAME)
36 values = await session.form(
37 [
38 CONF_ENTRY_WARN_PREVIEW,
39 create_player_selector(
40 session.mass,
41 CONF_MASS_PLAYER_ID,
42 prefill.get(CONF_MASS_PLAYER_ID),
43 PLAYER_ID_AUTO,
44 ),
45 ConfigEntry(
46 key=CONF_AIRPLAY_NAME,
47 type=ConfigEntryType.STRING,
48 required=True,
49 default_value=airplay_name,
50 value=airplay_name,
51 ),
52 ],
53 step_id="user",
54 errors=errors,
55 last_step=True,
56 )
57 setup_data.update(values)
58 try:
59 await session.finish(setup_data)
60 return
61 except SetupFlowError as err:
62 errors = {"base": err.translation_key or str(err)}
63