feat(library): genre sliders, artist links, and navigation utils
- music landing: diverse per-genre album sliders (online counts / offline wide-probe fallback) and home-screen library shortcuts - add ArtistLinks component and shared navigation/genreDiversity utils - player/playback-mode refinements across Rust and frontend
This commit is contained in:
+79
-2
@@ -1276,6 +1276,11 @@ async convertPercentToVolume(percent: number) : Promise<number> {
|
||||
/** user-defined events **/
|
||||
|
||||
|
||||
export const events = __makeEvents__<{
|
||||
playerStatusEvent: PlayerStatusEvent
|
||||
}>({
|
||||
playerStatusEvent: "player-status-event"
|
||||
})
|
||||
|
||||
/** user-defined constants **/
|
||||
|
||||
@@ -1471,7 +1476,13 @@ export type DownloadsResponse = { downloads: DownloadInfo[]; stats: DownloadStat
|
||||
/**
|
||||
* Genre
|
||||
*/
|
||||
export type Genre = { id: string; name: string }
|
||||
export type Genre = { id: string; name: string;
|
||||
/**
|
||||
* Number of albums tagged with this genre, when the backend can supply it
|
||||
* (online only). Lets the frontend rank/pick genres without probing each
|
||||
* one. `None` when unknown (e.g. offline).
|
||||
*/
|
||||
albumCount: number | null }
|
||||
/**
|
||||
* Request to get an image URL (with caching)
|
||||
*/
|
||||
@@ -1610,7 +1621,12 @@ export type PlayTracksContext = { type: "playlist"; playlistId: string; playlist
|
||||
/**
|
||||
* Request to play tracks by ID (backend fetches metadata)
|
||||
*/
|
||||
export type PlayTracksRequest = { trackIds: string[]; startIndex: number; shuffle: boolean; context: PlayTracksContext }
|
||||
export type PlayTracksRequest = { trackIds: string[]; startIndex: number; shuffle: boolean; context: PlayTracksContext;
|
||||
/**
|
||||
* Position (seconds) to resume the starting track from. Used when taking
|
||||
* over playback from a remote session so we don't restart from 0.
|
||||
*/
|
||||
startPosition?: number | null }
|
||||
/**
|
||||
* Playback information
|
||||
*/
|
||||
@@ -1791,6 +1807,67 @@ mergedIsPlaying: boolean;
|
||||
* Volume from either local player or remote session (0-1 normalized)
|
||||
*/
|
||||
mergedVolume: number }
|
||||
/**
|
||||
* Events emitted by the player backend to the frontend via Tauri events.
|
||||
*
|
||||
* These are distinct from `PlayerEvent` in state.rs, which handles internal
|
||||
* state machine transitions.
|
||||
*
|
||||
* TRACES: UR-005, UR-019, UR-023, UR-026 | DR-001, DR-028, DR-047
|
||||
*/
|
||||
export type PlayerStatusEvent =
|
||||
/**
|
||||
* Playback position updated (emitted periodically during playback)
|
||||
*/
|
||||
{ type: "position_update"; position: number; duration: number } |
|
||||
/**
|
||||
* Player state changed
|
||||
*/
|
||||
{ type: "state_changed"; state: string; media_id: string | null } |
|
||||
/**
|
||||
* Media has finished loading and is ready to play
|
||||
*/
|
||||
{ type: "media_loaded"; duration: number } |
|
||||
/**
|
||||
* Playback has ended naturally (reached end of media)
|
||||
*/
|
||||
{ type: "playback_ended" } |
|
||||
/**
|
||||
* Buffering state changed
|
||||
*/
|
||||
{ type: "buffering"; percent: number } |
|
||||
/**
|
||||
* An error occurred during playback
|
||||
*/
|
||||
{ type: "error"; message: string; recoverable: boolean } |
|
||||
/**
|
||||
* Volume changed
|
||||
*/
|
||||
{ type: "volume_changed"; volume: number; muted: boolean } |
|
||||
/**
|
||||
* Sleep timer state changed
|
||||
*/
|
||||
{ type: "sleep_timer_changed"; mode: SleepTimerMode; remaining_seconds: number } |
|
||||
/**
|
||||
* Show next episode popup with countdown
|
||||
*/
|
||||
{ type: "show_next_episode_popup"; current_episode: MediaItem; next_episode: MediaItem; countdown_seconds: number; auto_advance: boolean } |
|
||||
/**
|
||||
* Countdown tick (emitted every second during autoplay countdown)
|
||||
*/
|
||||
{ type: "countdown_tick"; remaining_seconds: number } |
|
||||
/**
|
||||
* Queue changed (items added, removed, reordered, or playback mode changed)
|
||||
*/
|
||||
{ type: "queue_changed"; items: PlayerMediaItem[]; current_index: number | null; shuffle: boolean; repeat: RepeatMode; has_next: boolean; has_previous: boolean } |
|
||||
/**
|
||||
* Media session changed (activity context changed: Audio/Movie/TvShow/Idle)
|
||||
*/
|
||||
{ type: "session_changed"; session: MediaSessionType } |
|
||||
/**
|
||||
* Remote sessions updated (for cast/remote control UI)
|
||||
*/
|
||||
{ type: "sessions_updated"; sessions: SessionInfo[] }
|
||||
/**
|
||||
* Result of creating a playlist
|
||||
*
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
// and adds frontend-only unions/helpers that have no backend equivalent.
|
||||
|
||||
export type {
|
||||
ArtistItem,
|
||||
AuthResult,
|
||||
Genre,
|
||||
GetItemsOptions,
|
||||
|
||||
Reference in New Issue
Block a user