diff --git a/src/publish.rs b/src/publish.rs index 8987e25..31bb2ac 100644 --- a/src/publish.rs +++ b/src/publish.rs @@ -2177,27 +2177,38 @@ impl Flow { let Some(primary_name) = primary_name else { return; }; - let plan = if format_registry::format_for_extension(&primary_name) + let image = if format_registry::format_for_extension(&primary_name) == Some(format_registry::FormatId::Ldraw) { - plan_draft_ldraw_bundle(&primary_name, &staged) + let plan = plan_draft_ldraw_bundle(&primary_name, &staged); + let DraftBundlePlan::Complete(bundle) = plan else { + if let DraftBundlePlan::Incomplete(error) = plan { + tracing::debug!(%error, %primary_name, "generated preview pending staged companions"); + } + return; + }; + generate_preview_bundle( + self.client.clone(), + primary_name.clone(), + bundle, + self.upload, + self.image_data_uris, + ) + .await } else { - DraftBundlePlan::Unsupported - }; - let DraftBundlePlan::Complete(bundle) = plan else { - if let DraftBundlePlan::Incomplete(error) = plan { - tracing::debug!(%error, %primary_name, "generated preview pending staged companions"); - } - return; + let Some(resource) = staged.iter().find(|resource| resource.name == primary_name) + else { + return; + }; + generate_preview( + self.client.clone(), + primary_name.clone(), + resource.bytes.clone(), + self.upload, + self.image_data_uris, + ) + .await }; - let image = generate_preview_bundle( - self.client.clone(), - primary_name.clone(), - bundle, - self.upload, - self.image_data_uris, - ) - .await; if *self.preview_generation.read() != generation { tracing::debug!(%primary_name, "discarding stale generated preview"); return; @@ -2553,11 +2564,40 @@ async fn generate_preview_bundle( } } +#[cfg(all(target_family = "wasm", target_os = "unknown"))] +async fn generate_preview( + client: PolymodelClient, + filename: String, + bytes: Vec, + mut upload: Signal, + mut image_data_uris: Signal>, +) -> Option { + let png_bytes = renderer_preview::render_preview_png(&filename, bytes, 1024, 1024) + .await + .ok()?; + let alt = format!("Rendered preview of {filename}"); + upload.set(UploadStatus::Uploading(format!("preview of {filename}"))); + match draft_client::upload_image(&client, &alt, "image/png", png_bytes.clone()).await { + Ok(image) => { + let cid = image.image.blob().r#ref.as_str().to_string(); + image_data_uris + .write() + .insert(cid.into(), data_uri_from_bytes(&png_bytes, "image/png")); + Some(image) + } + Err(error) => { + tracing::warn!(%error, "preview upload failed for {filename}"); + upload.set(UploadStatus::Idle); + None + } + } +} + #[cfg(not(all(target_family = "wasm", target_os = "unknown")))] -async fn generate_preview_bundle( +async fn generate_preview( _client: PolymodelClient, _filename: String, - _bundle: polymodel_renderer_protocol::ModelLoadBundle, + _bytes: Vec, _upload: Signal, _image_data_uris: Signal>, ) -> Option { @@ -2565,10 +2605,10 @@ async fn generate_preview_bundle( } #[cfg(not(all(target_family = "wasm", target_os = "unknown")))] -async fn generate_preview( +async fn generate_preview_bundle( _client: PolymodelClient, _filename: String, - _bytes: Vec, + _bundle: polymodel_renderer_protocol::ModelLoadBundle, _upload: Signal, _image_data_uris: Signal>, ) -> Option {