diff --git a/ansible/templates/docker-compose.yml b/ansible/templates/docker-compose.yml index ca20f3ff8..ca7b0383f 100644 --- a/ansible/templates/docker-compose.yml +++ b/ansible/templates/docker-compose.yml @@ -37,7 +37,7 @@ services: restart: always pictrs: - image: asonix/pictrs:amd64-v0.1.0-r9 + image: asonix/pictrs:v0.2.2-r0 user: 991:991 ports: - "127.0.0.1:8537:8080" diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml index ba085855b..b0abb9720 100644 --- a/docker/federation/docker-compose.yml +++ b/docker/federation/docker-compose.yml @@ -23,7 +23,7 @@ services: pictrs: restart: always - image: asonix/pictrs:v0.1.13-r0 + image: asonix/pictrs:v0.2.2-r0 user: 991:991 volumes: - ./volumes/pictrs_alpha:/mnt diff --git a/src/routes/images.rs b/src/routes/images.rs index 2521d0b66..4b5ed9811 100644 --- a/src/routes/images.rs +++ b/src/routes/images.rs @@ -18,10 +18,8 @@ pub fn config(cfg: &mut web::ServiceConfig, rate_limit: &RateLimit) { .wrap(rate_limit.image()) .route(web::post().to(upload)), ) + // This has optional query params: /image/{filename}?format=jpg&thumbnail=256 .service(web::resource("/pictrs/image/{filename}").route(web::get().to(full_res))) - .service( - web::resource("/pictrs/image/thumbnail{size}/{filename}").route(web::get().to(thumbnail)), - ) .service(web::resource("/pictrs/image/delete/{token}/{filename}").route(web::get().to(delete))); } @@ -37,6 +35,12 @@ pub struct Images { files: Option>, } +#[derive(Deserialize)] +pub struct PictrsParams { + format: Option, + thumbnail: Option, +} + async fn upload( req: HttpRequest, body: web::Payload, @@ -59,31 +63,31 @@ async fn upload( async fn full_res( filename: web::Path, + web::Query(params): web::Query, req: HttpRequest, client: web::Data, ) -> Result { - let url = format!( - "{}/image/original/{}", - Settings::get().pictrs_url, - &filename.into_inner() - ); - image(url, req, client).await -} + let name = &filename.into_inner(); -async fn thumbnail( - parts: web::Path<(u64, String)>, - req: HttpRequest, - client: web::Data, -) -> Result { - let (size, file) = parts.into_inner(); + // If there are no query params, the URL is original + let url = if params.format.is_none() && params.thumbnail.is_none() { + format!("{}/image/original/{}", Settings::get().pictrs_url, name,) + } else { + // Use jpg as a default when none is given + let format = params.format.unwrap_or("jpg".to_string()); - let url = format!( - "{}/image/process.{}?src={}&thumbnail={}", - Settings::get().pictrs_url, - "jpg", // this can be changed to png or webp - &file, - size, - ); + let mut url = format!( + "{}/image/process.{}?src={}", + Settings::get().pictrs_url, + format, + name, + ); + + if let Some(size) = params.thumbnail { + url = format!("{}&thumbnail={}", url, size,); + } + url + }; image(url, req, client).await }