use std::io::Write; use log::info; use serde::Deserialize; #[derive(Debug, Clone, Deserialize)] pub struct TmdbQuery { pub page: usize, pub results: Vec, pub total_pages: usize, pub total_results: usize, } #[derive(Debug, Clone, Deserialize)] pub struct TmdbQueryResult { pub adult: bool, pub backdrop_path: String, pub genre_ids: Vec, pub id: u64, pub original_language: String, pub original_title: String, pub overview: String, pub popularity: f64, pub poster_path: String, pub release_date: String, pub title: String, pub video: bool, pub vote_average: f64, pub vote_count: usize, } #[derive(Debug, Clone, Deserialize)] pub struct TmdbDetails { pub adult: bool, pub backdrop_path: Option, pub genres: Vec, pub id: u64, pub original_language: String, pub original_title: String, pub overview: String, pub popularity: f64, pub poster_path: Option, pub release_date: String, pub title: String, pub video: bool, pub vote_average: f64, pub vote_count: usize, pub budget: usize, pub homepage: String, pub imdb_id: String, pub production_companies: Vec, pub revenue: usize, pub tagline: String, } #[derive(Debug, Clone, Deserialize)] pub struct TmdbGenre { pub id: u64, pub name: String, } #[derive(Debug, Clone, Deserialize)] pub struct TmdbProductionCompany { pub id: u64, pub name: String, pub logo_path: Option, } pub fn tmdb_search(query: &str, key: &str) -> anyhow::Result { info!("searching tmdb: {query:?}"); Ok(reqwest::blocking::get(&format!( "https://api.themoviedb.org/3/search/movie?query={}&api_key={key}", query.replace(" ", "+") ))? .json::()?) } pub fn tmdb_details(id: u64, key: &str) -> anyhow::Result { info!("fetching details: {id:?}"); Ok(reqwest::blocking::get(&format!( "https://api.themoviedb.org/3/movie/{id}?api_key={key}" ))? .json()?) } pub fn tmdb_image(path: &str, out: &mut impl Write) -> anyhow::Result<()> { info!("downloading image {path:?}"); let mut res = reqwest::blocking::get(&format!("https://image.tmdb.org/t/p/original{path}"))?; res.copy_to(out)?; Ok(()) }