/
/
/
1"""
2Yandex Station Player Provider for Music Assistant.
3
4Play music on Yandex Station smart speakers via local Glagol WebSocket protocol.
5Adapted from AlexxIT/YandexStation (MIT license).
6"""
7
8from __future__ import annotations
9
10from typing import TYPE_CHECKING
11
12from music_assistant_models.errors import LoginFailed
13from ya_passport_auth.ma import BORROW_SOURCE_OWN
14
15from .constants import (
16 CONF_MUSIC_TOKEN,
17 CONF_X_TOKEN,
18 CONF_YM_INSTANCE,
19)
20from .provider import YandexStationProvider
21
22if TYPE_CHECKING:
23 from music_assistant_models.config_entries import ProviderConfig
24 from music_assistant_models.enums import ProviderFeature
25 from music_assistant_models.provider import ProviderManifest
26
27 from music_assistant.mass import MusicAssistant
28 from music_assistant.models import ProviderInstanceType
29
30SUPPORTED_FEATURES: set[ProviderFeature] = set()
31
32
33async def setup(
34 mass: MusicAssistant, manifest: ProviderManifest, config: ProviderConfig
35) -> ProviderInstanceType:
36 """Initialize provider(instance) with given configuration."""
37 provider = YandexStationProvider(mass, manifest, config, SUPPORTED_FEATURES)
38 # Credentials come from the setup flow (borrow a linked Yandex Music instance or
39 # this provider's own login). Fail fast when neither is present.
40 ym_instance = provider.get_setup_value(CONF_YM_INSTANCE)
41 borrowing = bool(ym_instance) and ym_instance != BORROW_SOURCE_OWN
42 if (
43 not borrowing
44 and not provider.get_setup_value(CONF_MUSIC_TOKEN)
45 and not provider.get_setup_value(CONF_X_TOKEN)
46 ):
47 msg = "Authentication required. Please login with your Yandex credentials."
48 raise LoginFailed(msg)
49 return provider
50