diff options
Diffstat (limited to 'import/src/wikimedia_commons.rs')
-rw-r--r-- | import/src/wikimedia_commons.rs | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/import/src/wikimedia_commons.rs b/import/src/wikimedia_commons.rs index 081aa5a..e0f647e 100644 --- a/import/src/wikimedia_commons.rs +++ b/import/src/wikimedia_commons.rs @@ -5,13 +5,16 @@ */ use crate::USER_AGENT; +use anyhow::Result; +use jellybase::cache::{async_cache_file, CachePath}; use reqwest::{ header::{HeaderMap, HeaderName, HeaderValue}, redirect::Policy, Client, ClientBuilder, }; +use tokio::io::AsyncWriteExt; -struct WikimediaCommons { +pub struct WikimediaCommons { client: Client, } impl WikimediaCommons { @@ -26,4 +29,28 @@ impl WikimediaCommons { .unwrap(); Self { client } } + + pub async fn image_by_filename(&self, filename: String) -> Result<CachePath> { + async_cache_file( + "api-wikimedia-commons-image", + filename.clone(), + |mut file| async move { + let mut res = self + .client + .get(format!( + "https://commons.wikimedia.org/wiki/Special:FilePath/{}", + filename.replace(" ", "_") + )) + .send() + .await? + .error_for_status()?; + + while let Some(chunk) = res.chunk().await? { + file.write_all(&chunk).await?; + } + Ok(()) + }, + ) + .await + } } |