/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin */ use crate::USER_AGENT; use anyhow::{Context, Result}; use jellybase::cache::{async_cache_file, CachePath}; use reqwest::{ header::{HeaderMap, HeaderName, HeaderValue}, redirect::Policy, Client, ClientBuilder, }; use tokio::io::AsyncWriteExt; pub struct WikimediaCommons { client: Client, } impl WikimediaCommons { pub fn new() -> Self { let client = ClientBuilder::new() .default_headers(HeaderMap::from_iter([( HeaderName::from_static("user-agent"), HeaderValue::from_static(USER_AGENT), )])) .redirect(Policy::limited(5)) .build() .unwrap(); Self { client } } pub async fn image_by_filename(&self, filename: String) -> Result { 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 .context("mediawiki image by filename") } }