git/grrs/main
src/models.rs
109 lines3 KB last change raw · history
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<String>,
    #[serde(default)]
    pub artist: Option<String>,
    #[serde(default)]
    pub album: Option<String>,
    #[serde(default)]
    pub circle: Option<String>,
    #[serde(default)]
    pub vocal: Option<String>,
    #[serde(default)]
    pub original: Option<String>,
    #[serde(default)]
    pub year: Option<Value>,
    #[serde(default)]
    pub duration: Option<u64>,
    #[serde(default)]
    pub played: Option<Value>,
    #[serde(default)]
    pub albumart: Option<String>,
}

#[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<MpvSong> {
    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,
}