mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-18 05:25:40 +09:00
fix(media-proxy): budget native image work by pod memory (#3385)
This commit is contained in:
1 parent
575a5adbef
commit
7d2c51a57f
20 files changed
+663
-133
No files matched your search
@@ -7,7 +7,7 @@ pub(in crate::server) use failure::MediaFailure;
|
||||
pub(in crate::server) use input::{MediaInput, MediaInputLimit, load_media_input};
|
||||
|
||||
use crate::{
|
||||
constants::AssetExtension,
|
||||
constants::{self, AssetExtension},
|
||||
image_quality::ImageQuality,
|
||||
image_transform::AnimationMode,
|
||||
media_process, mime,
|
||||
@@ -16,7 +16,7 @@ use crate::{
|
||||
server::{
|
||||
format_policy::image_extension_from_filename,
|
||||
state::AppState,
|
||||
transform::execution::{run_transform, transform_error_is_timeout},
|
||||
transform::execution::{deadline_instant, run_transform, transform_error_is_timeout},
|
||||
},
|
||||
};
|
||||
use bytes::Bytes;
|
||||
@@ -43,21 +43,39 @@ pub(in crate::server) async fn resolve_metadata(
|
||||
app.media.nsfw().record_declined_scan();
|
||||
NSFWPolicy::Disabled
|
||||
};
|
||||
let json = media_process::metadata_json_with_options(
|
||||
&input.data,
|
||||
&input.filename,
|
||||
media_process::MetadataOptions {
|
||||
placeholder: true,
|
||||
nsfw,
|
||||
},
|
||||
&app.media.limits(),
|
||||
app.media.nsfw(),
|
||||
&app.metrics.transform(),
|
||||
)
|
||||
.await
|
||||
.map_err(|err| MediaFailure::MetadataExtractionFailed {
|
||||
let runtime = app.media.transforms();
|
||||
let options = media_process::MetadataOptions {
|
||||
placeholder: true,
|
||||
nsfw,
|
||||
deadline_ms: runtime.transform_deadline_ms(),
|
||||
};
|
||||
let deadline = deadline_instant(options.deadline_ms);
|
||||
let media_limits = app.media.limits();
|
||||
let transform_metrics = app.metrics.transform();
|
||||
let data = input.data.clone();
|
||||
let cost_data = input.data.clone();
|
||||
let extraction_failed = |err: &dyn std::fmt::Debug| MediaFailure::MetadataExtractionFailed {
|
||||
detail: format!("filename={} err={err:?}", input.filename),
|
||||
})?;
|
||||
};
|
||||
let prepared = runtime
|
||||
.tasks()
|
||||
.run_native(
|
||||
deadline,
|
||||
move || Ok(media_process::metadata_cost(&cost_data, &media_limits)?),
|
||||
move || {
|
||||
Ok(media_process::prepare_metadata(
|
||||
&data,
|
||||
&options,
|
||||
&media_limits,
|
||||
&transform_metrics,
|
||||
)?)
|
||||
},
|
||||
)
|
||||
.await
|
||||
.map_err(|err| extraction_failed(&err))?;
|
||||
let json = media_process::finish_metadata(prepared, app.media.nsfw())
|
||||
.await
|
||||
.map_err(|err| extraction_failed(&err))?;
|
||||
Ok(MetadataOutput {
|
||||
metadata: serde_json::from_str(&json).unwrap_or_else(|_| serde_json::json!({})),
|
||||
data: include_data.then_some(input.data),
|
||||
@@ -74,6 +92,8 @@ async fn rasterize_metadata_svg(
|
||||
input: LoadedMediaInput,
|
||||
) -> Result<LoadedMediaInput, MediaFailure> {
|
||||
let options = media_process::ImageOptions {
|
||||
width: Some(constants::SVG_RASTER_MAX_DIMENSION),
|
||||
height: Some(constants::SVG_RASTER_MAX_DIMENSION),
|
||||
format: OutputFormat::WebP,
|
||||
quality: ImageQuality::Lossless,
|
||||
animation: AnimationMode::Static,
|
||||
|
||||
Reference in new issue
Block a user