#[warn(missing_docs)]
use serde::{Deserialize, Serialize};
use crate::models::{Album, Artist, ContributorArtist, DeezerObject};
use crate::Result;
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Track {
pub id: u64,
pub readable: bool,
pub title: String,
pub title_short: String,
pub title_version: String,
#[serde(default)]
pub unseen: Option<bool>,
pub isrc: String,
pub link: String,
#[serde(rename = "share")]
pub share_link: String,
#[serde(rename = "duration")]
pub duration_in_seconds: u64,
#[serde(rename = "track_position")]
pub track_position_in_album: u64,
#[serde(rename = "disk_number")]
pub album_disk_number: u64,
pub rank: u64,
pub release_date: String,
#[serde(rename = "explicit_lyrics")]
pub has_explicit_lyrics: bool,
#[serde(default)]
pub preview_url: Option<String>,
pub bpm: f32,
pub gain: f32,
pub available_countries: Vec<String>,
#[serde(rename = "alternative")]
#[serde(default)]
pub alternative_track_id: Option<u64>,
pub contributors: Vec<ContributorArtist>,
pub artist: TrackArtist,
pub album: TrackAlbum,
}
impl DeezerObject for Track {
fn get_api_url(id: u64) -> String {
format!("track/{}", id)
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct TrackArtist {
pub id: u64,
pub name: String,
pub link: String,
#[serde(rename = "share")]
pub share_link: String,
pub picture: String,
pub picture_small: String,
pub picture_medium: String,
pub picture_big: String,
pub picture_xl: String,
#[serde(default)]
pub nb_album: Option<u64>,
#[serde(default)]
pub nb_fan: Option<u64>,
#[serde(rename = "radio")]
pub has_radio: bool,
pub tracklist: String,
}
impl TrackArtist {
pub async fn get_full(&self) -> Result<Artist> {
let artist = Artist::get(self.id).await?.unwrap();
Ok(artist)
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct TrackAlbum {
pub id: u64,
pub title: String,
pub link: String,
pub cover: String,
pub cover_small: String,
pub cover_medium: String,
pub cover_big: String,
pub cover_xl: String,
pub release_date: String,
}
impl TrackAlbum {
pub async fn get_full(&self) -> Result<Album> {
let album = Album::get(self.id).await?.unwrap();
Ok(album)
}
}