563 lines
17 KiB
Rust
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>,
|
|
}
|