use crate::{API_URL, Extended, anime::AnimeGenre, movie::MovieGenre, show::TvGenre};
pub struct FindByFilePayload {
pub file: String,
pub part: Option<u8>,
}
pub const FIND_BY_FILE_URL: &str = "https://api.simkl.com/search/file";
#[derive(Default, Debug, Clone, PartialEq)]
pub struct IdLookup {
pub simkl: Option<u32>,
pub hulu: Option<u32>,
pub netflix: Option<u32>,
pub mal: Option<u32>,
pub tvdb: Option<u32>,
pub tmdb: Option<u32>,
pub imdb: Option<String>,
pub anidb: Option<u32>,
pub crunchyroll: Option<u32>,
pub anilist: Option<u32>,
pub kitsu: Option<u32>,
pub livechart: Option<u32>,
pub anisearch: Option<u32>,
pub animeplanet: Option<u32>,
pub traktslug: Option<String>,
pub letterboxd: Option<String>,
pub r#type: Option<String>,
pub title: Option<String>,
pub year: Option<u16>,
}
pub fn get_search_by_id_request(payload: IdLookup, client_id: String) -> String {
let mut result = String::from(API_URL);
result.push_str("/search/id?client_id=");
result.push_str(&client_id);
if let Some(id) = payload.simkl {
result.push_str("&simkl=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.hulu {
result.push_str("&hulu=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.netflix {
result.push_str("&netflix=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.mal {
result.push_str("&mal=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.tvdb {
result.push_str("&tvdb=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.tmdb {
result.push_str("&tmdb=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.imdb {
result.push_str("&imdb=");
result.push_str(&id);
}
if let Some(id) = payload.anidb {
result.push_str("&anidb=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.crunchyroll {
result.push_str("&crunchyroll=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.anilist {
result.push_str("&anilist=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.kitsu {
result.push_str("&kitsu=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.livechart {
result.push_str("&livechart=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.anisearch {
result.push_str("&anisearch=");
result.push_str(&id.to_string());
}
if let Some(id) = payload.animeplanet {
result.push_str("&animeplanet=");
result.push_str(&id.to_string());
}
if let Some(ref slug) = payload.traktslug {
result.push_str("&traktslug=");
result.push_str(slug);
}
if let Some(ref slug) = payload.letterboxd {
result.push_str("&letterboxd=");
result.push_str(slug);
}
if let Some(t) = payload.r#type {
result.push_str("&type=");
result.push_str(&t);
}
if let Some(t) = payload.title {
result.push_str("&title=");
result.push_str(&t);
}
if let Some(y) = payload.year {
result.push_str("&year=");
result.push_str(&y.to_string());
}
result
}
pub fn get_search_request(
r#type: Option<String>,
_extended: Option<Extended>,
client_id: String,
q: String,
) -> String {
let mut result = String::from(API_URL);
result.push_str("/search/");
if let Some(ref t) = r#type {
result.push_str(t);
}
result.push_str("?client_id=");
result.push_str(&client_id);
result.push_str("&q=");
result.push_str(&q);
result
}
pub struct FindRandomPayload {
pub service: String,
pub r#type: crate::MediaType, pub movie_genre: MovieGenre,
pub tv_genre: TvGenre,
pub anime_genre: AnimeGenre,
pub rating_from: u8,
pub rating_to: u8,
pub rank_limit: u32,
pub year_from: Option<u16>,
pub year_to: Option<u16>,
pub limit: u16,
}
impl FindRandomPayload {
pub fn to_url_param(&self) -> String {
let mut result = String::new();
result.push_str("&service=");
result.push_str(&self.service);
result.push_str("&type=");
result.push_str(match self.r#type {
crate::MediaType::Movie => "movie",
crate::MediaType::Show => "tv",
crate::MediaType::Anime => "anime",
crate::MediaType::Episode => "tv",
});
result.push_str("&genre=");
result.push_str(match self.r#type {
crate::MediaType::Movie => self.movie_genre.as_str(),
crate::MediaType::Anime => self.anime_genre.as_str(),
crate::MediaType::Show | crate::MediaType::Episode => self.tv_genre.as_str(),
});
if let Some(y) = self.year_from {
result.push_str("&year_from=");
result.push_str(&y.to_string());
}
if let Some(y) = self.year_to {
result.push_str("&year_to=");
result.push_str(&y.to_string());
}
result.push_str("&rating_from=");
result.push_str(&self.rating_from.to_string());
result.push_str("&rating_to=");
result.push_str(&self.rating_to.to_string());
result.push_str("&rank_limit=");
result.push_str(&self.rank_limit.to_string());
result.push_str("&limit=");
result.push_str(&self.limit.to_string());
result
}
}
pub fn get_find_random_request(payload: FindRandomPayload, client_id: String) -> String {
let mut result = String::from(API_URL);
result.push_str("/search/random/?client_id=");
result.push_str(&client_id);
result.push_str(&payload.to_url_param());
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_id_request() {
let payload = IdLookup {
simkl: Some(123),
..Default::default()
};
let client_id = String::from("azerty123456");
assert_eq!(
get_search_by_id_request(payload.clone(), client_id),
"https://api.simkl.com/search/id?client_id=azerty123456&simkl=123"
);
}
}