/
/
/
1"""Yandex Music provider support for Music Assistant."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING, cast
6
7from music_assistant_models.config_entries import ConfigEntry, ConfigValueOption, ConfigValueType
8from music_assistant_models.enums import ConfigEntryType, ProviderFeature
9
10from .constants import (
11 CONF_ACTION_CLEAR_AUTH,
12 CONF_BASE_URL,
13 CONF_LIKED_TRACKS_MAX_TRACKS,
14 CONF_MY_WAVE_MAX_TRACKS,
15 CONF_QUALITY,
16 CONF_TOKEN,
17 DEFAULT_BASE_URL,
18 QUALITY_BALANCED,
19 QUALITY_EFFICIENT,
20 QUALITY_HIGH,
21 QUALITY_SUPERB,
22)
23from .provider import YandexMusicProvider
24
25if TYPE_CHECKING:
26 from music_assistant_models.config_entries import ProviderConfig
27 from music_assistant_models.provider import ProviderManifest
28
29 from music_assistant.mass import MusicAssistant
30 from music_assistant.models import ProviderInstanceType
31
32SUPPORTED_FEATURES = {
33 ProviderFeature.LIBRARY_ARTISTS,
34 ProviderFeature.LIBRARY_ALBUMS,
35 ProviderFeature.LIBRARY_TRACKS,
36 ProviderFeature.LIBRARY_PLAYLISTS,
37 ProviderFeature.ARTIST_ALBUMS,
38 ProviderFeature.ARTIST_TOPTRACKS,
39 ProviderFeature.SEARCH,
40 ProviderFeature.LIBRARY_ARTISTS_EDIT,
41 ProviderFeature.LIBRARY_ALBUMS_EDIT,
42 ProviderFeature.LIBRARY_TRACKS_EDIT,
43 ProviderFeature.BROWSE,
44 ProviderFeature.SIMILAR_TRACKS,
45 ProviderFeature.RECOMMENDATIONS,
46 ProviderFeature.LYRICS,
47}
48
49
50async def setup(
51 mass: MusicAssistant, manifest: ProviderManifest, config: ProviderConfig
52) -> ProviderInstanceType:
53 """Initialize provider(instance) with given configuration."""
54 return YandexMusicProvider(mass, manifest, config, SUPPORTED_FEATURES)
55
56
57async def get_config_entries(
58 mass: MusicAssistant, # noqa: ARG001
59 instance_id: str | None = None, # noqa: ARG001
60 action: str | None = None,
61 values: dict[str, ConfigValueType] | None = None,
62) -> tuple[ConfigEntry, ...]:
63 """Return Config entries to setup this provider."""
64 if values is None:
65 values = {}
66
67 # Handle clear auth action
68 if action == CONF_ACTION_CLEAR_AUTH:
69 values[CONF_TOKEN] = None
70
71 # Check if user is authenticated
72 is_authenticated = bool(values.get(CONF_TOKEN))
73
74 return (
75 # Authentication
76 ConfigEntry(
77 key=CONF_TOKEN,
78 type=ConfigEntryType.SECURE_STRING,
79 label="Yandex Music Token",
80 description="Enter your Yandex Music OAuth token. "
81 "See the documentation for how to obtain it.",
82 required=True,
83 hidden=is_authenticated,
84 value=cast("str", values.get(CONF_TOKEN)) if values else None,
85 ),
86 ConfigEntry(
87 key=CONF_ACTION_CLEAR_AUTH,
88 type=ConfigEntryType.ACTION,
89 label="Reset authentication",
90 description="Clear the current authentication details.",
91 action=CONF_ACTION_CLEAR_AUTH,
92 hidden=not is_authenticated,
93 ),
94 # Quality
95 ConfigEntry(
96 key=CONF_QUALITY,
97 type=ConfigEntryType.STRING,
98 label="Audio quality",
99 description="Select preferred audio quality.",
100 options=[
101 ConfigValueOption("Efficient (AAC ~64kbps)", QUALITY_EFFICIENT),
102 ConfigValueOption("Balanced (AAC ~192kbps)", QUALITY_BALANCED),
103 ConfigValueOption("High (MP3 ~320kbps)", QUALITY_HIGH),
104 ConfigValueOption("Superb (FLAC Lossless)", QUALITY_SUPERB),
105 ],
106 default_value=QUALITY_BALANCED,
107 ),
108 # My Wave maximum tracks (advanced)
109 ConfigEntry(
110 key=CONF_MY_WAVE_MAX_TRACKS,
111 type=ConfigEntryType.INTEGER,
112 label="My Wave maximum tracks",
113 description="Maximum number of tracks to fetch for My Wave playlist. "
114 "Lower values load faster but provide fewer tracks. Default: 150.",
115 range=(10, 1000),
116 default_value=150,
117 required=False,
118 advanced=True,
119 ),
120 # Liked Tracks maximum tracks (advanced)
121 ConfigEntry(
122 key=CONF_LIKED_TRACKS_MAX_TRACKS,
123 type=ConfigEntryType.INTEGER,
124 label="Liked Tracks maximum tracks",
125 description="Maximum number of tracks to show in Liked Tracks virtual playlist. "
126 "Higher values may significantly increase load time. "
127 "Lower values load faster. Default: 500.",
128 range=(50, 2000),
129 default_value=500,
130 required=False,
131 advanced=True,
132 ),
133 # API Base URL (advanced)
134 ConfigEntry(
135 key=CONF_BASE_URL,
136 type=ConfigEntryType.STRING,
137 label="API Base URL",
138 description="API endpoint base URL. "
139 "Only change if Yandex Music changes their API endpoint. "
140 "Default: https://api.music.yandex.net",
141 default_value=DEFAULT_BASE_URL,
142 required=False,
143 advanced=True,
144 ),
145 )
146