aboutsummaryrefslogtreecommitdiff
path: root/import/src/wikimedia_commons.rs
diff options
context:
space:
mode:
Diffstat (limited to 'import/src/wikimedia_commons.rs')
-rw-r--r--import/src/wikimedia_commons.rs29
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
+ }
}