/
/
/
1"""Constants for the Yandex Ynison plugin."""
2
3from __future__ import annotations
4
5from typing import Final
6
7from ya_passport_auth.ma import BORROW_SOURCE_OWN
8
9# Ynison WebSocket endpoints
10YNISON_REDIRECT_URL: Final[str] = (
11 "wss://ynison.music.yandex.ru/redirector.YnisonRedirectService/GetRedirectToYnison"
12)
13YNISON_STATE_PATH: Final[str] = "/ynison_state.YnisonStateService/PutYnisonState"
14
15# Origin header required by Ynison
16YNISON_ORIGIN: Final[str] = "https://music.yandex.ru"
17
18# Configuration keys
19CONF_TOKEN: Final[str] = "token"
20CONF_X_TOKEN: Final[str] = "x_token"
21CONF_ACCOUNT_LOGIN: Final[str] = "account_login"
22CONF_REMEMBER_SESSION: Final[str] = "remember_session"
23CONF_YM_INSTANCE: Final[str] = "ym_instance"
24CONF_MASS_PLAYER_ID: Final[str] = "mass_player_id"
25CONF_ALLOW_PLAYER_SWITCH: Final[str] = "allow_player_switch"
26CONF_DEVICE_ID: Final[str] = "device_id"
27CONF_OUTPUT_SAMPLE_RATE: Final[str] = "output_sample_rate"
28CONF_OUTPUT_BIT_DEPTH: Final[str] = "output_bit_depth"
29
30# Action keys (own-mode QR auth flow)
31CONF_ACTION_AUTH_QR: Final[str] = "auth_qr"
32CONF_ACTION_CLEAR_AUTH: Final[str] = "clear_auth"
33
34# Special value for "auto" config options
35OUTPUT_AUTO: Final[str] = "auto"
36
37# Sentinel value for CONF_YM_INSTANCE â use own manually entered token
38# Sentinel for "use own credentials" â canonical value lives in the shared
39# auth layer (same literal the plugin has always persisted).
40YM_INSTANCE_OWN: Final[str] = BORROW_SOURCE_OWN
41
42# yandex_music provider config keys (read via provider.config.get_value)
43YANDEX_MUSIC_CONF_QUALITY: Final[str] = "quality"
44YANDEX_MUSIC_CONF_TOKEN: Final[str] = "token"
45YANDEX_MUSIC_CONF_X_TOKEN: Final[str] = "x_token"
46YANDEX_MUSIC_LOSSLESS_QUALITIES: Final[frozenset[str]] = frozenset({"superb", "lossless"})
47
48# Defaults
49DEFAULT_DISPLAY_NAME: Final[str] = "Music Assistant"
50DEFAULT_APP_NAME: Final[str] = "Music Assistant"
51DEFAULT_APP_VERSION: Final[str] = "1.0.0"
52
53# Device types (from Ynison protobuf DeviceType enum)
54DEVICE_TYPE_WEB: Final[str] = "WEB"
55
56# Reconnect settings â indexed by attempt number; attempts past the tuple
57# saturate at the last entry (so reconnect continues forever at 60 s intervals).
58RECONNECT_DELAYS: Final[tuple[float, ...]] = (5.0, 10.0, 30.0, 60.0)
59
60# WebSocket timeouts
61WS_CONNECT_TIMEOUT: Final[float] = 15.0
62WS_HEARTBEAT: Final[float] = 30.0
63
64# Ynison error codes that require immediate reconnection
65YNISON_ERROR_REBALANCED: Final[str] = "300100001"
66YNISON_ERROR_NOT_SERVED: Final[str] = "300100002"
67YNISON_RECONNECT_ERROR_CODES: Final[frozenset[str]] = frozenset(
68 {
69 YNISON_ERROR_REBALANCED,
70 YNISON_ERROR_NOT_SERVED,
71 }
72)
73