music-assistant-server

2.2 KBPY
__init__.py
2.2 KB74 lines • python
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