/
/
/
1"""Pandora music provider support for Music Assistant."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING
6
7from music_assistant_models.config_entries import ConfigEntry, ConfigValueType
8from music_assistant_models.enums import ConfigEntryType, ProviderFeature
9from music_assistant_models.errors import SetupFailedError
10
11from music_assistant.constants import CONF_PASSWORD, CONF_USERNAME
12
13from .provider import PandoraProvider
14
15if TYPE_CHECKING:
16 from music_assistant_models.config_entries import ProviderConfig
17 from music_assistant_models.provider import ProviderManifest
18
19 from music_assistant import MusicAssistant
20 from music_assistant.models import ProviderInstanceType
21
22# Supported Features - Pandora is primarily a radio service
23SUPPORTED_FEATURES = {
24 ProviderFeature.BROWSE,
25 ProviderFeature.LIBRARY_RADIOS,
26}
27
28
29async def setup(
30 mass: MusicAssistant, manifest: ProviderManifest, config: ProviderConfig
31) -> ProviderInstanceType:
32 """Initialize provider instance with given configuration."""
33 username = config.get_value(CONF_USERNAME)
34 password = config.get_value(CONF_PASSWORD)
35
36 # Type-safe validation
37 if (
38 not username
39 or not password
40 or not isinstance(username, str)
41 or not isinstance(password, str)
42 or not username.strip()
43 or not password.strip()
44 ):
45 raise SetupFailedError("Username and password are required")
46
47 return PandoraProvider(mass, manifest, config, SUPPORTED_FEATURES)
48
49
50async def get_config_entries(
51 mass: MusicAssistant,
52 instance_id: str | None = None,
53 action: str | None = None,
54 values: dict[str, ConfigValueType] | None = None,
55) -> tuple[ConfigEntry, ...]:
56 """Return configuration entries for this provider."""
57 # ruff: noqa: ARG001
58 return (
59 ConfigEntry(
60 key=CONF_USERNAME,
61 type=ConfigEntryType.STRING,
62 label="Username",
63 description="Your Pandora username or email address",
64 required=True,
65 ),
66 ConfigEntry(
67 key=CONF_PASSWORD,
68 type=ConfigEntryType.SECURE_STRING,
69 label="Password",
70 description="Your Pandora password",
71 required=True,
72 ),
73 )
74