jikan-rs/anime.rs

563 lines
17 KiB
Rust

#[derive(Serialize, Deserialize, Debug)]
pub struct Anime {
pub mal_id: u32,
pub url: String,
pub images: AnimeImages,
pub trailer: TrailerBase,
pub approved: bool,
pub titles: Vec<Title>,
pub title: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title_english: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title_japanese: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub title_synonyms: Vec<String>,
#[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
pub anime_type: Option<AnimeType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub episodes: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<AnimeStatus>,
pub airing: bool,
pub aired: DateRange,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub duration: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rating: Option<AnimeRating>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub score: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scored_by: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rank: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub popularity: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub members: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub favorites: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub synopsis: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub background: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub season: Option<AnimeSeason>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub year: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub broadcast: Option<Broadcast>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub producers: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub licensors: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub studios: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub genres: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub explicit_genres: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub themes: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub demographics: Vec<MalUrl>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeFull {
pub mal_id: u32,
pub url: String,
pub images: AnimeImages,
pub trailer: TrailerBase,
pub approved: bool,
pub titles: Vec<Title>,
pub title: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title_english: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title_japanese: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub title_synonyms: Vec<String>,
#[serde(rename = "type", default, skip_serializing_if = "Option::is_none")]
pub anime_type: Option<AnimeType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub episodes: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<AnimeStatus>,
pub airing: bool,
pub aired: DateRange,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub duration: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rating: Option<AnimeRating>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub score: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scored_by: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rank: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub popularity: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub members: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub favorites: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub synopsis: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub background: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub season: Option<AnimeSeason>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub year: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub broadcast: Option<Broadcast>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub producers: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub licensors: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub studios: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub genres: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub explicit_genres: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub themes: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub demographics: Vec<MalUrl>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub relations: Vec<Relation>,
pub theme: Theme,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub external: Vec<ExternalLink>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub streaming: Vec<ExternalLink>,
}
pub type AnimeCharacters = Vec<AnimeCharacter>;
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeCharacter {
pub character: CharacterMeta,
pub role: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub voice_actors: Vec<VoiceActor>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct CharacterMeta {
pub mal_id: u32,
pub url: String,
pub images: CharacterImages,
pub name: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct VoiceActor {
pub person: PersonMeta,
pub language: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct PersonMeta {
pub mal_id: u32,
pub url: String,
pub images: PeopleImages,
pub name: String,
}
pub type AnimeStaff = Vec<StaffRole>;
#[derive(Serialize, Deserialize, Debug)]
pub struct StaffRole {
pub person: PersonMeta,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub positions: Vec<String>,
}
pub type AnimeEpisodes = Vec<AnimeEpisode>;
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeEpisode {
pub mal_id: u32,
pub url: String,
pub title: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title_japanese: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title_romanji: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub duration: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub aired: Option<String>,
pub filler: bool,
pub recap: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub forum_url: Option<String>,
}
pub type AnimeNews = Vec<AnimeNewsMeta>;
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeNewsMeta {
pub mal_id: u32,
pub url: String,
pub title: String,
pub date: String,
pub author_username: String,
pub author_url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub forum_url: Option<String>,
pub images: CommonImages,
pub comments: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub excerpt: Option<String>,
}
pub type AnimeForumPosts = Vec<AnimeForumPost>;
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeForumPost {
pub mal_id: u32,
pub url: String,
pub title: String,
pub date: Timestamp,
pub author_username: String,
pub author_url: String,
pub comments: u32,
pub last_comment: LastComment,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct LastComment {
pub url: String,
pub author_username: String,
pub author_url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub date: Option<Timestamp>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeVideos {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub promo: Vec<PromoVideo>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub episodes: Vec<EpisodeVideo>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub music_videos: Vec<MusicVideo>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct PromoVideo {
pub title: String,
pub trailer: Trailer,
}
pub type AnimeVideosEpisodes = Vec<EpisodeVideo>;
#[derive(Serialize, Deserialize, Debug)]
pub struct EpisodeVideo {
pub mal_id: u32,
pub url: String,
pub title: String,
pub episode: String,
pub images: CommonImages,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct MusicVideo {
pub title: String,
pub video: Trailer,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub meta: Option<MusicVideoMeta>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct MusicVideoMeta {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub author: Option<String>,
}
pub type AnimePictures = Vec<AnimePicture>;
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimePicture {
pub images: CommonImages,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeStatistics {
pub watching: u32,
pub completed: u32,
pub on_hold: u32,
pub dropped: u32,
pub plan_to_watch: u32,
pub total: u32,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub scores: Vec<Score>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Score {
pub score: u32,
pub votes: u32,
pub percentage: f32,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeMoreInfo {
pub moreinfo: Option<String>,
}
pub type AnimeRecommendations = Vec<AnimeRecommendation>;
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeRecommendation {
pub mal_id: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub entry: Vec<EntryMeta>,
pub content: String,
pub user: UserById,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct EntryMeta {
pub mal_id: u32,
pub url: String,
pub images: AnimeImages,
pub title: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct UserById {
pub url: String,
pub username: String,
}
pub type AnimeUserUpdates = Vec<AnimeUserUpdate>;
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeUserUpdate {
pub user: UserMeta,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub score: Option<u32>,
pub status: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub episodes_seen: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub episodes_total: Option<u32>,
pub date: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct UserMeta {
pub username: String,
pub url: String,
pub images: UserImages,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ImageUrl {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub image_url: Option<String>,
}
pub type AnimeReviews = Vec<AnimeReview>;
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeReview {
pub mal_id: u32,
pub url: String,
#[serde(rename = "type")]
pub review_type: String,
pub reactions: Reactions,
pub date: String,
pub review: String,
pub score: u32,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
pub is_spoiler: bool,
pub is_preliminary: bool,
pub episodes_watched: u32,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Reactions {
pub overall: u32,
pub nice: u32,
pub love_it: u32,
pub funny: u32,
pub confusing: u32,
pub informative: u32,
pub well_written: u32,
pub creative: u32,
}
pub type AnimeRelations = Vec<AnimeRelation>;
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeRelation {
pub relation: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub entry: Vec<MalUrl>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct MalUrl {
pub mal_id: u32,
#[serde(rename = "type")]
pub url_type: String,
pub name: String,
pub url: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeThemes {
pub data: Theme,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Theme {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub openings: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub endings: Vec<String>,
}
pub type AnimeExternal = Vec<ExternalLink>;
pub type AnimeStreaming = Vec<ExternalLink>;
#[derive(Serialize, Deserialize, Debug)]
pub struct ExternalLink {
pub name: String,
pub url: String,
}
pub type AnimeSearchResults = Vec<Anime>;
#[derive(Serialize, Deserialize, Debug)]
pub struct ImageUrls {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub image_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub small_image_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub large_image_url: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct TrailerBase {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub youtube_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub embed_url: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Trailer {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub youtube_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub embed_url: Option<String>,
pub images: TrailerImages,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct DateRange {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub to: Option<String>,
pub prop: DateProp,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct DateProp {
pub from: DatePropDetail,
pub to: DatePropDetail,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub string: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct DatePropDetail {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub day: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub month: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub year: Option<u32>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Broadcast {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub day: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub time: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub string: Option<String>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Title {
#[serde(rename = "type")]
pub title_type: String,
pub title: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct CommonImages {
pub jpg: ImageUrl,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct CharacterImages {
pub jpg: ImageUrl,
pub webp: ImageUrl,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct PeopleImages {
pub jpg: ImageUrl,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct AnimeImages {
pub jpg: ImageUrls,
pub webp: ImageUrls,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct UserImages {
pub jpg: ImageUrl,
pub webp: ImageUrl,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct TrailerImages {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub image_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub small_image_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub medium_image_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub large_image_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub maximum_image_url: Option<String>,
}