/
/
/
1"""Setup flow for the Audiobookshelf provider."""
2
3from __future__ import annotations
4
5from dataclasses import replace
6from typing import TYPE_CHECKING
7
8from music_assistant_models.config_entries import ConfigEntry
9from music_assistant_models.enums import ConfigEntryType
10
11from music_assistant.models.setup_flow import SetupFlowError
12from music_assistant.providers.audiobookshelf.constants import (
13 CONF_API_TOKEN,
14 CONF_OLD_TOKEN,
15 CONF_PASSWORD,
16 CONF_URL,
17 CONF_USERNAME,
18 CONF_VERIFY_SSL,
19)
20
21if TYPE_CHECKING:
22 from music_assistant.models.setup_flow import SetupSession
23
24_ENTRIES = (
25 ConfigEntry(
26 key="label",
27 type=ConfigEntryType.LABEL,
28 ),
29 ConfigEntry(
30 key=CONF_URL,
31 type=ConfigEntryType.STRING,
32 required=True,
33 ),
34 ConfigEntry(
35 key=CONF_USERNAME,
36 type=ConfigEntryType.STRING,
37 required=False,
38 ),
39 ConfigEntry(
40 key=CONF_PASSWORD,
41 type=ConfigEntryType.SECURE_STRING,
42 required=False,
43 ),
44 ConfigEntry(
45 key=CONF_API_TOKEN,
46 type=ConfigEntryType.SECURE_STRING,
47 required=False,
48 ),
49 ConfigEntry(
50 key=CONF_OLD_TOKEN,
51 type=ConfigEntryType.SECURE_STRING,
52 required=False,
53 hidden=True,
54 ),
55 ConfigEntry(
56 key=CONF_VERIFY_SSL,
57 type=ConfigEntryType.BOOLEAN,
58 required=False,
59 advanced=True,
60 default_value=True,
61 ),
62)
63
64
65async def run_setup(session: SetupSession) -> None:
66 """Run the setup flow: collect the connection details and create the provider."""
67 errors: dict[str, str] | None = None
68 setup_data = dict(session.context.setup_data)
69 while True:
70 entries = [
71 replace(entry, value=setup_data.get(entry.key, entry.value)) for entry in _ENTRIES
72 ]
73 submitted = await session.form(entries, step_id="user", errors=errors, last_step=True)
74 setup_data.update(submitted)
75 try:
76 await session.finish(setup_data)
77 return
78 except SetupFlowError as err:
79 errors = {"base": err.translation_key or str(err)}
80