45 lines
1.1 KiB
Rust
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))
|
|
}
|