use serde::{Serialize, Deserialize};
use crate::album::Album;
use crate::annotation::Referent;
use crate::user::{User, UserMetadata};
use crate::{Body, Date};
#[derive(Serialize, Deserialize, Debug)]
pub struct Song {
pub annotation_count: u32,
pub api_path: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub apple_music_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub apple_music_player_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comment_count: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_header_image_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_song_art_image_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<Body>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_preview: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub embed_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub facebook_share_message_without_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub featured_video: Option<bool>,
pub full_title: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_instagram_reel_annotations: Option<bool>,
pub header_image_thumbnail_url: String,
pub header_image_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub hidden: Option<bool>,
pub id: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub instrumental: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_music: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lyrics: Option<Body>,
pub lyrics_owner_id: u32,
pub lyrics_state: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub lyrics_updated_at: Option<u64>,
pub path: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub pending_lyrics_edits_count: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub published: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pusher_channel: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub release_date_components: Option<Date>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pyongs_count: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recording_location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub release_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub release_date_for_display: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub share_url: Option<String>,
pub song_art_image_thumbnail_url: String,
pub song_art_image_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub soundcloud_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spotify_uuid: Option<String>,
pub stats: SongStatus,
pub title: String,
pub title_with_featured: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub tracking_paths: Option<TrackingPaths>,
#[serde(skip_serializing_if = "Option::is_none")]
pub twitter_share_message: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub twitter_share_message_without_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_by_human_at: Option<u64>,
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub viewable_by_roles: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub youtube_start: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub youtube_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_user_metadata: Option<UserMetadata>,
pub primary_artist: Artist,
#[serde(skip_serializing_if = "Option::is_none")]
pub album: Option<Album>,
#[serde(skip_serializing_if = "Option::is_none")]
pub albums: Option<Vec<Album>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_performances: Option<Vec<SongPerformance>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_annotation: Option<Referent>,
#[serde(skip_serializing_if = "Option::is_none")]
pub featured_artists: Option<Vec<Artist>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub media: Option<Vec<SongMedia>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub producer_artists: Option<Vec<Artist>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub song_relationships: Option<Vec<SongRelationship>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verified_annotations_by: Option<Vec<User>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verified_contributors: Option<Vec<SongContributor>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verified_lyrics_by: Option<Vec<User>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub writer_artists: Option<Vec<Artist>>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct TrackingPaths {
pub aggregate: String,
pub concurrent: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct SongContributor {
pub contributions: Vec<String>,
pub artist: Artist,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<User>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct SongRelationship {
pub relationship_type: String,
pub songs: Vec<Option<Song>>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct SongPerformance {
pub label: String,
pub artists: Vec<Artist>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct SongMedia {
#[serde(skip_serializing_if = "Option::is_none")]
pub native_uri: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attribution: Option<String>,
pub provider: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub start: Option<u32>,
#[serde(rename = "type")]
pub media_type: String,
pub url: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct SongStatus {
#[serde(skip_serializing_if = "Option::is_none")]
pub accepted_annotations: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contributors: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub iq_earners: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transcribers: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verified_annotations: Option<u32>,
pub unreviewed_annotations: u32,
pub hot: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub pageviews: Option<u32>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Artist {
pub api_path: String,
pub header_image_url: String,
pub id: u32,
pub image_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub index_character: Option<char>,
pub is_meme_verified: bool,
pub is_verified: bool,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub slug: Option<String>,
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub iq: Option<u32>,
}