use crate::models::{Album, Artist, DeezerArray, DeezerObject, Track, User};
use crate::Result;
#[warn(missing_docs)]
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Playlist {
pub id: u64,
pub title: String,
pub description: String,
#[serde(rename = "duration")]
pub duration_in_seconds: u64,
#[serde(rename = "public")]
pub is_public: bool,
pub is_loved_track: bool,
#[serde(rename = "collaborative")]
pub is_collaborative: bool,
#[serde(default)]
pub rating: Option<u64>,
pub nb_tracks: u64,
#[serde(default)]
pub unseen_track_count: Option<u64>,
pub fans: u64,
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,
pub checksum: String,
pub creator: PlaylistUser,
pub tracks: DeezerArray<PlaylistTrack>,
}
impl DeezerObject for Playlist {
fn get_api_url(id: u64) -> String {
format!("playlist/{}", id)
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct PlaylistUser {
pub id: u64,
pub name: String,
}
impl PlaylistUser {
pub async fn get_full(&self) -> Result<User> {
let user = User::get(self.id).await?.unwrap();
Ok(user)
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct PlaylistTrack {
pub id: u64,
pub readable: bool,
pub title: String,
pub title_short: String,
pub title_version: Option<String>,
#[serde(default)]
pub unseen: bool,
pub link: String,
#[serde(rename = "duration")]
pub duration_in_seconds: u64,
pub rank: u64,
#[serde(rename = "explicit_lyrics")]
pub has_explicit_lyrics: bool,
#[serde(default)]
pub preview_url: String,
#[serde(rename = "time_add")]
pub added_on: u64,
pub artist: PlaylistTrackArtist,
pub album: PlaylistTrackAlbum,
}
impl PlaylistTrack {
pub async fn get_full(&self) -> Result<Track> {
let track = Track::get(self.id).await?.unwrap();
Ok(track)
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct PlaylistTrackArtist {
pub id: u64,
pub name: String,
pub link: String,
}
impl PlaylistTrackArtist {
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 PlaylistTrackAlbum {
pub id: u64,
pub title: String,
pub cover: String,
pub cover_small: String,
pub cover_medium: String,
pub cover_big: String,
pub cover_xl: String,
}
impl PlaylistTrackAlbum {
pub async fn get_full(&self) -> Result<Album> {
let album = Album::get(self.id).await?.unwrap();
Ok(album)
}
}