use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MonoEvent {
Track {
id: u64,
title: String,
artist: String,
album: String,
album_id: u64,
duration_secs: u64,
track_number: Option<u32>,
release_date: Option<String>,
audio_quality: Option<String>,
cover_id: Option<String>,
},
Album {
id: u64,
title: String,
artist: String,
release_date: Option<String>,
track_count: u32,
duration_secs: Option<u64>,
cover_id: Option<String>,
},
AlbumTrack {
position: u32,
id: u64,
title: String,
artist: String,
duration_secs: u64,
audio_quality: Option<String>,
},
Artist {
id: u64,
name: String,
picture_id: Option<String>,
cover_url: Option<String>,
},
SearchTrack {
rank: u32,
id: u64,
title: String,
artist: String,
album: String,
duration_secs: u64,
audio_quality: Option<String>,
},
SearchAlbum {
rank: u32,
id: u64,
title: String,
artist: String,
track_count: u32,
release_date: Option<String>,
},
SearchArtist {
rank: u32,
id: u64,
name: String,
},
LyricLine {
timestamp_ms: Option<u64>,
text: String,
},
Recommendation {
rank: u32,
id: u64,
title: String,
artist: String,
duration_secs: u64,
},
Cover {
url: String,
size: u32,
},
StreamManifest {
id: u64,
url: String,
mime_type: String,
codecs: String,
quality: String,
bit_depth: Option<u32>,
sample_rate: Option<u32>,
extension: String,
},
DownloadProgress {
path: String,
bytes_downloaded: u64,
total_bytes: Option<u64>,
percent: Option<f32>,
},
DownloadComplete {
path: String,
bytes: u64,
mime_type: String,
},
PlaybackStatus {
status: PlayStatus,
elapsed_secs: Option<f32>,
duration_secs: Option<f32>,
},
NowPlaying {
track_id: Option<u64>,
title: Option<String>,
artist: Option<String>,
album: Option<String>,
status: PlayStatus,
position_secs: f32,
duration_secs: f32,
volume: f32,
preamp: f32,
queue_length: usize,
url: Option<String>,
},
Queue {
tracks: Vec<QueuedTrack>,
current_index: Option<usize>,
},
PlaylistInfo {
name: String,
description: String,
track_count: usize,
created_at: String,
updated_at: String,
},
PlayerAck {
action: String,
message: String,
},
Error {
message: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PlayStatus {
Idle,
Starting,
Buffering,
Playing,
Paused,
Stopped,
Finished,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct QueuedTrack {
pub id: u64,
pub title: String,
pub artist: String,
pub album: String,
pub duration_secs: u64,
pub quality: String,
pub cover_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SearchKind {
Tracks,
Albums,
Artists,
}
impl Default for SearchKind {
fn default() -> Self {
SearchKind::Tracks
}
}