diff --git a/src/main.rs b/src/main.rs index 3c68652..b8d7753 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,7 +62,10 @@ async fn main() -> std::io::Result<()> { "/api/media/{server_name}/{media_id}/download", web::get().to(api::media::download), ) - // TODO : handle media thumbnail + .route( + "/api/media/{server_name}/{media_id}/thumbnail", + web::get().to(api::media::thumbnail), + ) // TODO : handle space .route( "/api/profile/{user_id}", diff --git a/src/server/api/media.rs b/src/server/api/media.rs index 1b3b7fe..6ea3ac7 100644 --- a/src/server/api/media.rs +++ b/src/server/api/media.rs @@ -2,7 +2,7 @@ use crate::extractors::client_auth::APIClientAuth; use crate::server::HttpResult; use actix_web::{web, HttpResponse}; use ruma::api::client::media; -use ruma::OwnedServerName; +use ruma::{OwnedServerName, UInt}; #[derive(serde::Deserialize)] pub struct MediaInfoInPath { @@ -26,3 +26,32 @@ pub async fn download(auth: APIClientAuth, path: web::Path) -> Ok(http_res.body(res.file)) } + +#[derive(serde::Deserialize)] +pub struct MediaThumbnailQuery { + width: Option, + height: Option, +} + +/// Get a media thumbnail +pub async fn thumbnail( + auth: APIClientAuth, + path: web::Path, + query: web::Query, +) -> HttpResult { + let res = auth + .send_request(media::get_content_thumbnail::v3::Request::new( + path.media_id.clone(), + path.server_name.clone(), + query.width.unwrap_or(UInt::new(500).unwrap()), + query.height.unwrap_or(UInt::new(500).unwrap()), + )) + .await?; + + let mut http_res = HttpResponse::Ok(); + if let Some(content_type) = res.content_type { + http_res.content_type(content_type); + } + + Ok(http_res.body(res.file)) +}