use serde::Deserialize;
use spotify_rs_macros::docs;
use super::*;
#[derive(Clone, Debug, Deserialize, PartialEq)]
#[docs]
pub struct Audiobook {
pub authors: Vec<Author>,
#[serde(default)]
pub available_markets: Vec<String>,
pub copyrights: Vec<Copyright>,
pub description: String,
pub html_description: String,
pub edition: String,
pub explicit: bool,
pub external_urls: ExternalUrls,
pub href: String,
pub id: String,
pub images: Vec<Image>,
pub languages: Vec<String>,
pub media_type: String,
pub name: String,
pub narrators: Vec<Narrator>,
pub publisher: String,
pub r#type: String,
pub uri: String,
pub total_chapters: u32,
pub chapters: Page<SimplifiedChapter>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
#[docs(name = "audiobook")]
pub struct SimplifiedAudiobook {
pub authors: Vec<Author>,
#[serde(default)]
pub available_markets: Vec<String>,
pub copyrights: Vec<Copyright>,
pub description: String,
pub html_description: String,
pub edition: String,
pub explicit: bool,
pub external_urls: ExternalUrls,
pub href: String,
pub id: String,
pub images: Vec<Image>,
pub languages: Vec<String>,
pub media_type: String,
pub name: String,
pub narrators: Vec<Narrator>,
pub publisher: String,
pub r#type: String,
pub uri: String,
pub total_chapters: Option<u32>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub(crate) struct Audiobooks {
pub(crate) audiobooks: Vec<Option<Audiobook>>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
#[docs]
pub struct Chapter {
pub audio_preview_url: Option<String>,
#[serde(default)]
pub available_markets: Vec<String>,
pub chapter_number: u32,
pub description: String,
pub html_description: String,
pub duration_ms: u32,
pub explicit: bool,
pub external_urls: ExternalUrls,
pub href: String,
pub id: String,
pub images: Vec<Image>,
pub is_playable: Option<bool>,
pub languages: Vec<String>,
pub name: String,
pub release_date: String,
pub release_date_precision: DatePrecision,
pub resume_point: Option<ResumePoint>,
pub r#type: String,
pub uri: String,
pub restrictions: Option<Restriction>,
pub audiobook: SimplifiedAudiobook,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
#[docs(name = "chapter")]
pub struct SimplifiedChapter {
pub audio_preview_url: Option<String>,
#[serde(default)]
pub available_markets: Vec<String>,
pub chapter_number: u32,
pub description: String,
pub html_description: String,
pub duration_ms: u32,
pub explicit: bool,
pub external_urls: ExternalUrls,
pub href: String,
pub id: String,
pub images: Vec<Image>,
pub is_playable: Option<bool>,
pub languages: Vec<String>,
pub name: String,
pub release_date: String,
pub release_date_precision: DatePrecision,
pub resume_point: Option<ResumePoint>,
pub r#type: String,
pub uri: String,
pub restrictions: Option<Restriction>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub(crate) struct Chapters {
pub(crate) chapters: Vec<Option<Chapter>>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Author {
pub name: String,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct Narrator {
pub name: String,
}
impl Audiobook {
pub fn author_names(&self) -> Vec<String> {
self.authors.iter().map(|a| a.name.clone()).collect()
}
pub fn narrator_names(&self) -> Vec<String> {
self.narrators.iter().map(|n| n.name.clone()).collect()
}
}
impl SimplifiedAudiobook {
pub fn author_names(&self) -> Vec<String> {
self.authors.iter().map(|a| a.name.clone()).collect()
}
pub fn narrator_names(&self) -> Vec<String> {
self.narrators.iter().map(|n| n.name.clone()).collect()
}
}