new tab
Build And Push Container / build-and-push (push) Successful in 58s

This commit is contained in:
2026-06-30 23:28:51 +02:00
parent d2690dd6e9
commit c5f0249dbf
3 changed files with 189 additions and 55 deletions
+26 -1
View File
@@ -45,7 +45,8 @@ pub(crate) async fn list_images(state: &AppState) -> Result<Vec<ImageView>> {
label: manifest.label,
size: meta.len(),
animated: true,
frame_count: manifest.frames.len(),
frame_count: manifest.source_frame_count.unwrap_or(manifest.frames.len()),
display_frame_count: manifest.frames.len(),
});
} else {
out.push(ImageView {
@@ -55,6 +56,7 @@ pub(crate) async fn list_images(state: &AppState) -> Result<Vec<ImageView>> {
size: meta.len(),
animated: false,
frame_count: 1,
display_frame_count: 1,
});
}
}
@@ -92,6 +94,7 @@ async fn convert_and_store_gif(state: &AppState, file_name: &str, bytes: &[u8])
if frames.is_empty() {
anyhow::bail!("GIF contains no frames");
}
let source_frame_count = frames.len();
let base = make_image_stem(file_name);
let timestamp = Local::now().format("%Y%m%d-%H%M%S");
@@ -132,6 +135,7 @@ async fn convert_and_store_gif(state: &AppState, file_name: &str, bytes: &[u8])
.first()
.map(|frame| frame.name.clone())
.unwrap_or_default(),
source_frame_count: Some(source_frame_count),
frames: stored_frames,
};
let manifest_path = state.image_dir.join(&manifest_name);
@@ -262,6 +266,9 @@ pub(crate) fn load_panel_rgb(image_dir: &PathBuf, image_name: &str) -> Result<Rg
#[cfg(test)]
mod tests {
use image::{Rgb, RgbImage};
use serde_json::json;
use crate::types::GifSetManifest;
use super::{collapse_rendered_frames, MIN_GIF_FRAME_DELAY_MS};
@@ -286,4 +293,22 @@ mod tests {
fn min_gif_frame_delay_supports_50ms_frames() {
assert!(MIN_GIF_FRAME_DELAY_MS <= 50);
}
#[test]
fn gif_manifest_without_source_frame_count_stays_compatible() {
let manifest: GifSetManifest = serde_json::from_value(json!({
"kind": "gif_set",
"version": 1,
"label": "demo.gif",
"preview": ".gifframe-000.jpg",
"frames": [
{ "name": ".gifframe-000.jpg", "delay_ms": 50 },
{ "name": ".gifframe-001.jpg", "delay_ms": 50 }
]
}))
.unwrap();
assert_eq!(manifest.source_frame_count, None);
assert_eq!(manifest.frames.len(), 2);
}
}