1
Fork 0
shimmeringmoon/src/bin/server/routes/jacket.rs

45 lines
1.1 KiB
Rust

use std::io::Cursor;
use axum::extract::{Path, State};
use axum::http::{header, HeaderName, StatusCode};
use crate::{context::AppContext, error::AppError};
pub async fn get_jacket_image(
State(state): State<AppContext>,
Path(filename): Path<String>,
) -> Result<([(HeaderName, String); 2], Vec<u8>), AppError> {
let chart_id = filename
.strip_suffix(".png")
.unwrap_or(&filename)
.parse::<u32>()
.map_err(|e| AppError::new(e.into(), StatusCode::NOT_FOUND))?;
let (_song, chart) = state
.ctx
.song_cache
.lookup_chart(chart_id)
.map_err(|e| AppError::new(e, StatusCode::NOT_FOUND))?;
let headers = [
(header::CONTENT_TYPE, "image/png".to_owned()),
(
header::HeaderName::from_static("pngrok-skip-browser-warning"),
"-".to_owned(),
),
// (
// header::CONTENT_DISPOSITION,
// format!("attachment; filename=\"chart_{}.jpg\"", chart_id),
// ),
];
let mut buffer = Vec::new();
let mut cursor = Cursor::new(&mut buffer);
chart
.cached_jacket
.unwrap()
.bitmap
.write_to(&mut cursor, image::ImageFormat::Png)?;
Ok((headers, buffer))
}