86 lines
2.5 KiB
Python
86 lines
2.5 KiB
Python
from dataclasses import dataclass, field
|
|
from enum import Enum
|
|
from typing import Dict, List, Optional
|
|
|
|
from sublime.server.api_objects import Child
|
|
|
|
|
|
class RepeatType(Enum):
|
|
NO_REPEAT = 0
|
|
REPEAT_QUEUE = 1
|
|
REPEAT_SONG = 2
|
|
|
|
@property
|
|
def icon(self) -> str:
|
|
icon_name = ["repeat-symbolic", "repeat-symbolic", "repeat-song-symbolic"][
|
|
self.value
|
|
]
|
|
return f"media-playlist-{icon_name}"
|
|
|
|
def as_mpris_loop_status(self) -> str:
|
|
return ["None", "Playlist", "Track"][self.value]
|
|
|
|
@staticmethod
|
|
def from_mpris_loop_status(loop_status: str) -> "RepeatType":
|
|
return {
|
|
"None": RepeatType.NO_REPEAT,
|
|
"Track": RepeatType.REPEAT_SONG,
|
|
"Playlist": RepeatType.REPEAT_QUEUE,
|
|
}[loop_status]
|
|
|
|
|
|
@dataclass
|
|
class UIState:
|
|
"""Represents the UI state of the application."""
|
|
|
|
version: int = 1
|
|
playing: bool = False
|
|
current_song_index: int = -1
|
|
play_queue: List[str] = field(default_factory=list)
|
|
old_play_queue: List[str] = field(default_factory=list)
|
|
_volume: Dict[str, float] = field(default_factory=lambda: {"this device": 100.0})
|
|
is_muted: bool = False
|
|
repeat_type: RepeatType = RepeatType.NO_REPEAT
|
|
shuffle_on: bool = False
|
|
song_progress: float = 0
|
|
current_device: str = "this device"
|
|
current_tab: str = "albums"
|
|
selected_album_id: Optional[str] = None
|
|
selected_artist_id: Optional[str] = None
|
|
selected_browse_element_id: Optional[str] = None
|
|
selected_playlist_id: Optional[str] = None
|
|
|
|
# State for Album sort.
|
|
current_album_sort: str = "random"
|
|
current_album_genre: str = "Rock"
|
|
current_album_alphabetical_sort: str = "name"
|
|
current_album_from_year: int = 2010
|
|
current_album_to_year: int = 2020
|
|
|
|
active_playlist_id: Optional[str] = None
|
|
|
|
def migrate(self):
|
|
pass
|
|
|
|
@property
|
|
def current_song(self) -> Optional[Child]:
|
|
from sublime.cache_manager import CacheManager
|
|
|
|
if (
|
|
not self.play_queue
|
|
or self.current_song_index < 0
|
|
or not CacheManager.ready()
|
|
):
|
|
return None
|
|
|
|
current_song_id = self.play_queue[self.current_song_index]
|
|
return CacheManager.get_song_details(current_song_id).result()
|
|
|
|
@property
|
|
def volume(self) -> float:
|
|
return self._volume.get(self.current_device, 100.0)
|
|
|
|
@volume.setter
|
|
def volume(self, value: float):
|
|
self._volume[self.current_device] = value
|