import argparse
import logging
import os
-import platform
-import webbrowser
from aiorun import run
from music_assistant.mass import MusicAssistant
mass = MusicAssistant(data_dir)
- # run UI in browser on windows and macos only
- if platform.system() in ["Windows", "Darwin"]:
- webbrowser.open(mass.web.internal_url)
-
def on_shutdown(loop):
logger.info("shutdown requested!")
loop.run_until_complete(mass.async_stop())
def __repr__(self):
"""Print class."""
- return f"{OrderedDict}({self.items()})"
+ return f"{OrderedDict}({self.to_dict()})"
- def items(self) -> dict:
+ def to_dict(self) -> dict:
"""Return entire config as dict."""
result = OrderedDict()
for entry in self.get_config_entries():
from dataclasses import dataclass, field
from enum import Enum
-from typing import Any, List, Optional, Tuple
+from typing import Any, List, Tuple
from mashumaro import DataClassDictMixin
entry_key: str
entry_type: ConfigEntryType
- default_value: Optional[Any] = None
+ default_value: Any = None
values: List[Any] = field(default_factory=list) # select from list of values
range: Tuple[Any] = () # select values within range
- description_key: Optional[str] = None # key in the translations file
- help_key: Optional[str] = None # key in the translations file
+ description_key: str = None # key in the translations file
+ help_key: str = None # key in the translations file
multi_value: bool = False # allow multiple values from the list
depends_on: str = "" # needs to be set before this setting shows up in frontend
hidden: bool = False # hide from UI
- value: Optional[Any] = None # set by the configuration manager
+ value: Any = None # set by the configuration manager
store_hashed: bool = False # value will be hashed, non reversible
from dataclasses import dataclass, field
from enum import Enum
-from typing import Any, List, Optional
+from typing import Any, List
from mashumaro import DataClassDictMixin
from music_assistant.utils import CustomIntEnum
provider: str
item_id: str
- quality: Optional[TrackQuality] = TrackQuality.UNKNOWN
- details: Optional[str] = None
+ quality: TrackQuality = TrackQuality.UNKNOWN
+ details: str = None
class ExternalId(Enum):
media_type: MediaType = MediaType.Album
version: str = ""
year: int = 0
- artist: Optional[Artist] = None
+ artist: Artist = None
labels: List[str] = field(default_factory=list)
album_type: AlbumType = AlbumType.Album
duration: int = 0
version: str = ""
artists: List[Artist] = field(default_factory=list)
- album: Optional[Album] = None
+ album: Album = None
disc_number: int = 1
track_number: int = 1
from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
-from typing import Any, List, Optional
+from typing import Any, List
from mashumaro import DataClassDictMixin
from music_assistant.models.config_entry import ConfigEntry
class DeviceInfo(DataClassDictMixin):
"""Model for a player's deviceinfo."""
- model: Optional[str] = ""
- address: Optional[str] = ""
- manufacturer: Optional[str] = ""
+ model: str = ""
+ address: str = ""
+ manufacturer: str = ""
class PlayerFeature(CustomIntEnum):
type: PlayerControlType = PlayerControlType.UNKNOWN
id: str = ""
name: str = ""
- state: Optional[Any] = None
+ state: Any = None
set_state: Any = None
"shuffle_enabled": self.shuffle_enabled,
"repeat_enabled": self.repeat_enabled,
"crossfade_enabled": self.crossfade_enabled,
- "items": len(self.items),
+ "items": len(self._items),
"cur_item_id": self.cur_item_id,
"cur_index": self.cur_index,
"next_index": self.next_index,
from dataclasses import dataclass
from enum import Enum
-from typing import Any, Optional
+from typing import Any
from mashumaro import DataClassDictMixin
sample_rate: int
bit_depth: int
player_id: str = ""
- details: Optional[Any] = None
- seconds_played: int = None
+ details: Any = None
+ seconds_played: int = 0
+ sox_options: str = None