Skip to content

Instantly share code, notes, and snippets.

@ronanyeah
Created April 4, 2020 07:36
Show Gist options
  • Save ronanyeah/a2d3aa484049b336bd77e15231146003 to your computer and use it in GitHub Desktop.
Save ronanyeah/a2d3aa484049b336bd77e15231146003 to your computer and use it in GitHub Desktop.
TMDb scrape
use std::fs::File;
use std::io::prelude::*;
use std::io::BufReader;
const API_KEY: &str = "☘️";
#[derive(serde::Deserialize)]
struct Res {
results: Vec<MovieDb>,
}
#[derive(serde::Deserialize)]
struct Movie {
id: String,
img: String,
title: String,
}
#[derive(serde::Deserialize)]
struct MovieDb {
popularity: f32,
vote_count: i32,
vote_average: f32,
release_date: Option<String>,
original_language: String,
genre_ids: Vec<i32>,
poster_path: Option<String>,
overview: String,
}
#[derive(serde::Serialize)]
struct Data {
id: String,
img: String,
title: String,
popularity: f32,
vote_count: i32,
vote_average: f32,
release_date: Option<String>,
original_language: String,
genre_ids: Vec<i32>,
poster_path: Option<String>,
overview: String,
}
async fn fetch(client: &reqwest::Client, movie: &Movie) -> Option<Data> {
let query = percent_encoding::percent_encode(
movie.title.as_bytes(),
percent_encoding::NON_ALPHANUMERIC,
);
let res = client
.get(&format!("https://api.themoviedb.org/3/search/movie?api_key={}&language=en-US&page=1&include_adult=false&query={}", API_KEY, query))
.send()
.await;
let foo: Res = res
.expect(&format!("bad request: {}", &movie.title))
.json()
.await
.expect(&format!("bad decode: {}", &movie.title));
let bar = foo.results.get(0);
if bar.is_none() {
println!("{}", movie.title);
}
bar.map(|db| Data {
id: movie.id.clone(),
title: movie.title.clone(),
img: movie.img.clone(),
popularity: db.popularity,
vote_count: db.vote_count,
vote_average: db.vote_average,
release_date: db.release_date.clone(),
original_language: db.original_language.clone(),
genre_ids: db.genre_ids.clone(),
poster_path: db.poster_path.clone(),
overview: db.overview.clone(),
})
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::new();
let file = File::open("./res.json")?;
let reader = BufReader::new(file);
let movies: Vec<Movie> = serde_json::from_reader(reader)?;
let res = futures::future::join_all(movies.iter().map(|m| fetch(&client, m))).await;
let mut new_file = File::create("./data.json")?;
new_file.write_all(serde_json::to_string(&res)?.as_bytes())?;
Ok(())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment