use serde::{Deserialize, Serialize}; use serde_json::Value; #[derive(Deserialize, Default, Clone)] pub struct WsPayload { #[serde(default)] pub songid: i64, #[serde(default)] pub title: Option, #[serde(default)] pub artist: Option, #[serde(default)] pub album: Option, #[serde(default)] pub circle: Option, #[serde(default)] pub vocal: Option, #[serde(default)] pub original: Option, #[serde(default)] pub year: Option, #[serde(default)] pub duration: Option, #[serde(default)] pub played: Option, #[serde(default)] pub albumart: Option, } #[derive(Deserialize, Default, Clone)] pub struct ApiInfo { #[serde(rename = "SERVERINFO", default)] pub server_info: ServerInfo, #[serde(rename = "MISC", default)] pub misc: MiscInfo, #[serde(rename = "SONGDATA", default)] pub song_data: ApiSongData, } #[derive(Deserialize, Default, Clone)] pub struct ServerInfo { #[serde(rename = "LISTENERS", default)] pub listeners: u64, } #[derive(Deserialize, Default, Clone)] pub struct MiscInfo { #[serde(rename = "CIRCLELINK", default)] pub circle_link: String, } #[derive(Deserialize, Default, Clone)] pub struct ApiSongData { #[serde(rename = "RATING", default)] pub rating: String, #[serde(rename = "TIMESRATED", default)] pub times_rated: u64, } #[derive(Default, Clone, Debug)] pub struct MpvSong { pub title: String, pub artist: String, } pub fn parse_mpv_media_title(title: &str) -> Option { let trimmed = title.trim(); trimmed .find(" - ") .map(|idx| MpvSong { artist: trimmed[..idx].trim().to_string(), title: trimmed[idx + 3..].trim().to_string() }) } #[derive(Default, Clone)] pub struct SongData { pub id: i64, pub title: String, pub artist: String, pub album: String, pub circle: String, pub circle_link: String, pub vocal: String, pub original: String, pub year: String, pub duration: u64, pub played: u64, pub art_url: String, pub listeners: u64, pub rating: String, pub times_rated: u64, } #[derive(Serialize, Deserialize, Clone)] pub struct LikedSong { pub id: i64, pub title: String, pub artist: String, pub album: String, pub duration: u64, pub timestamp: u64, #[serde(default)] pub circle: String, #[serde(default)] pub vocal: String, #[serde(default)] pub original: String, #[serde(default)] pub year: String, }