/
/
/
1"""Setup flow for the SMB filesystem 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, ConfigValueOption
9from music_assistant_models.enums import ConfigEntryType
10
11from music_assistant.constants import CONF_PASSWORD, CONF_USERNAME
12from music_assistant.models.setup_flow import SetupFlowError
13from music_assistant.providers.filesystem_local.constants import CONF_ENTRY_CONTENT_TYPE
14from music_assistant.providers.filesystem_smb import (
15 CONF_HOST,
16 CONF_SHARE,
17 CONF_SMB_VERSION,
18 CONF_SUBFOLDER,
19)
20
21if TYPE_CHECKING:
22 from music_assistant.models.setup_flow import SetupSession
23
24_ENTRIES = (
25 CONF_ENTRY_CONTENT_TYPE,
26 ConfigEntry(key=CONF_HOST, type=ConfigEntryType.STRING, required=True),
27 ConfigEntry(key=CONF_SHARE, type=ConfigEntryType.STRING, required=True),
28 ConfigEntry(
29 key=CONF_USERNAME, type=ConfigEntryType.STRING, required=False, default_value="guest"
30 ),
31 ConfigEntry(
32 key=CONF_PASSWORD, type=ConfigEntryType.SECURE_STRING, required=False, default_value=None
33 ),
34 ConfigEntry(key=CONF_SUBFOLDER, type=ConfigEntryType.STRING, required=False, default_value=""),
35 ConfigEntry(
36 key=CONF_SMB_VERSION,
37 type=ConfigEntryType.STRING,
38 required=False,
39 advanced=True,
40 default_value="3.0",
41 options=[
42 ConfigValueOption(""),
43 ConfigValueOption("1.0"),
44 ConfigValueOption("2.0"),
45 ConfigValueOption("2.1"),
46 ConfigValueOption("3.0"),
47 ConfigValueOption("3.1.1"),
48 ],
49 ),
50)
51
52
53async def run_setup(session: SetupSession) -> None:
54 """Run the setup flow: collect the SMB connection details and create the provider."""
55 errors: dict[str, str] | None = None
56 setup_data = dict(session.context.setup_data)
57 while True:
58 entries = [
59 replace(entry, value=setup_data.get(entry.key, entry.value)) for entry in _ENTRIES
60 ]
61 submitted = await session.form(entries, step_id="user", errors=errors, last_step=True)
62 setup_data.update(submitted)
63 try:
64 await session.finish(setup_data)
65 return
66 except SetupFlowError as err:
67 errors = {"base": err.translation_key or str(err)}
68