no preview assets anymore
This commit is contained in:
@@ -29,10 +29,9 @@ use super::{
|
||||
|
||||
pub const THUMBNAIL_WIDTH: u32 = 512;
|
||||
pub const THUMBNAIL_HEIGHT: u32 = 512;
|
||||
const PREVIEW_WIDTH: u32 = THUMBNAIL_WIDTH * 4;
|
||||
const PREVIEW_HEIGHT: u32 = THUMBNAIL_HEIGHT * 4;
|
||||
const RENDER_WIDTH: u32 = THUMBNAIL_WIDTH * 4;
|
||||
const RENDER_HEIGHT: u32 = THUMBNAIL_HEIGHT * 4;
|
||||
pub const THUMBNAIL_ASSET_TYPE: &str = "thumbnail";
|
||||
pub const PREVIEW_ASSET_TYPE: &str = "preview";
|
||||
|
||||
pub struct GenerateThumbnailsTask {
|
||||
force: bool,
|
||||
@@ -59,8 +58,7 @@ impl Task<DocumentVersionTaskContext> for GenerateThumbnailsTask {
|
||||
}
|
||||
|
||||
let bytes = ctx.buffered_object().await?;
|
||||
let generation =
|
||||
generate_preview_and_thumbnail(&context.document, bytes).map_err(TaskError::fail)?;
|
||||
let generation = generate_thumbnails(&context.document, bytes).map_err(TaskError::fail)?;
|
||||
|
||||
if let Some(page_count) = generation.page_count {
|
||||
let state = ctx.state().clone();
|
||||
@@ -80,19 +78,10 @@ impl Task<DocumentVersionTaskContext> for GenerateThumbnailsTask {
|
||||
.map_err(|err| TaskError::retry(Duration::from_secs(30), err))?;
|
||||
}
|
||||
|
||||
remove_existing_assets(ctx, &context).await;
|
||||
remove_existing_thumbnail_assets(ctx, &context).await;
|
||||
|
||||
let preview_asset_id = Uuid::new_v4();
|
||||
let thumbnail_asset_id = Uuid::new_v4();
|
||||
|
||||
let preview_objects = upload_generated_objects(
|
||||
ctx,
|
||||
&context,
|
||||
PREVIEW_ASSET_TYPE,
|
||||
preview_asset_id,
|
||||
&generation.preview,
|
||||
)
|
||||
.await?;
|
||||
let thumbnail_objects = upload_generated_objects(
|
||||
ctx,
|
||||
&context,
|
||||
@@ -102,18 +91,11 @@ impl Task<DocumentVersionTaskContext> for GenerateThumbnailsTask {
|
||||
)
|
||||
.await?;
|
||||
|
||||
let asset_persistences = vec![
|
||||
AssetPersistence {
|
||||
asset_type: PREVIEW_ASSET_TYPE,
|
||||
asset_id: preview_asset_id,
|
||||
objects: preview_objects,
|
||||
},
|
||||
AssetPersistence {
|
||||
asset_type: THUMBNAIL_ASSET_TYPE,
|
||||
asset_id: thumbnail_asset_id,
|
||||
objects: thumbnail_objects,
|
||||
},
|
||||
];
|
||||
let asset_persistences = vec![AssetPersistence {
|
||||
asset_type: THUMBNAIL_ASSET_TYPE,
|
||||
asset_id: thumbnail_asset_id,
|
||||
objects: thumbnail_objects,
|
||||
}];
|
||||
|
||||
let state = ctx.state().clone();
|
||||
let tenant_id = context.document.tenant_id;
|
||||
@@ -150,8 +132,6 @@ async fn build_thumbnail_context(
|
||||
version,
|
||||
existing_thumbnail: None,
|
||||
existing_thumbnail_objects: Vec::new(),
|
||||
existing_preview: None,
|
||||
existing_preview_objects: Vec::new(),
|
||||
skip: true,
|
||||
tenant_id,
|
||||
});
|
||||
@@ -162,45 +142,30 @@ async fn build_thumbnail_context(
|
||||
.get(THUMBNAIL_ASSET_TYPE)
|
||||
.map(|entry| (Some(entry.asset.clone()), entry.objects.clone()))
|
||||
.unwrap_or((None, Vec::new()));
|
||||
let (existing_preview, existing_preview_objects) = assets
|
||||
.get(PREVIEW_ASSET_TYPE)
|
||||
.map(|entry| (Some(entry.asset.clone()), entry.objects.clone()))
|
||||
.unwrap_or((None, Vec::new()));
|
||||
|
||||
let expected_cardinality = expected_asset_cardinality(&document, &version);
|
||||
let preview_cardinality = existing_preview
|
||||
.as_ref()
|
||||
.and_then(|asset| asset.cardinality)
|
||||
.unwrap_or_else(|| existing_preview_objects.len() as i32);
|
||||
let thumbnail_cardinality = existing_thumbnail
|
||||
.as_ref()
|
||||
.and_then(|asset| asset.cardinality)
|
||||
.unwrap_or_else(|| existing_thumbnail_objects.len() as i32);
|
||||
let needs_regeneration = preview_cardinality < expected_cardinality
|
||||
|| thumbnail_cardinality < expected_cardinality
|
||||
|| (existing_preview_objects.len() as i32) < expected_cardinality
|
||||
let needs_regeneration = thumbnail_cardinality < expected_cardinality
|
||||
|| (existing_thumbnail_objects.len() as i32) < expected_cardinality;
|
||||
|
||||
let skip =
|
||||
existing_thumbnail.is_some() && existing_preview.is_some() && !force && !needs_regeneration;
|
||||
let skip = existing_thumbnail.is_some() && !force && !needs_regeneration;
|
||||
|
||||
Ok(ThumbnailContext {
|
||||
document,
|
||||
version,
|
||||
existing_thumbnail,
|
||||
existing_thumbnail_objects,
|
||||
existing_preview,
|
||||
existing_preview_objects,
|
||||
skip,
|
||||
tenant_id,
|
||||
})
|
||||
}
|
||||
|
||||
async fn remove_existing_assets(ctx: &DocumentVersionTaskContext, context: &ThumbnailContext) {
|
||||
if let Some(existing_preview) = &context.existing_preview {
|
||||
delete_asset_with_objects(ctx, existing_preview, &context.existing_preview_objects).await;
|
||||
}
|
||||
|
||||
async fn remove_existing_thumbnail_assets(
|
||||
ctx: &DocumentVersionTaskContext,
|
||||
context: &ThumbnailContext,
|
||||
) {
|
||||
if let Some(existing_thumbnail) = &context.existing_thumbnail {
|
||||
delete_asset_with_objects(ctx, existing_thumbnail, &context.existing_thumbnail_objects)
|
||||
.await;
|
||||
@@ -300,8 +265,6 @@ struct ThumbnailContext {
|
||||
version: DocumentVersion,
|
||||
existing_thumbnail: Option<DocumentAsset>,
|
||||
existing_thumbnail_objects: Vec<DocumentAssetObject>,
|
||||
existing_preview: Option<DocumentAsset>,
|
||||
existing_preview_objects: Vec<DocumentAssetObject>,
|
||||
skip: bool,
|
||||
tenant_id: Uuid,
|
||||
}
|
||||
@@ -318,7 +281,6 @@ struct GeneratedAsset {
|
||||
|
||||
struct GeneratedAssets {
|
||||
thumbnail: GeneratedAsset,
|
||||
preview: GeneratedAsset,
|
||||
page_count: Option<u32>,
|
||||
}
|
||||
|
||||
@@ -335,61 +297,49 @@ struct AssetPersistence {
|
||||
objects: Vec<AssetObjectPersistence>,
|
||||
}
|
||||
|
||||
fn generate_preview_and_thumbnail(
|
||||
document: &Document,
|
||||
bytes: &[u8],
|
||||
) -> Result<GeneratedAssets, String> {
|
||||
fn generate_thumbnails(document: &Document, bytes: &[u8]) -> Result<GeneratedAssets, String> {
|
||||
if document_is_pdf(document) {
|
||||
let pdf_assets = generate_pdf_assets(bytes)?;
|
||||
Ok(GeneratedAssets {
|
||||
preview: pdf_assets.preview,
|
||||
thumbnail: pdf_assets.thumbnail,
|
||||
page_count: Some(pdf_assets.page_count),
|
||||
})
|
||||
} else {
|
||||
let (preview, thumbnail) = generate_image_assets(bytes)?;
|
||||
let thumbnail = generate_image_assets(bytes)?;
|
||||
Ok(GeneratedAssets {
|
||||
preview,
|
||||
thumbnail,
|
||||
page_count: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fn generate_image_assets(bytes: &[u8]) -> Result<(GeneratedAsset, GeneratedAsset), String> {
|
||||
fn generate_image_assets(bytes: &[u8]) -> Result<GeneratedAsset, String> {
|
||||
let reader = ImageReader::new(Cursor::new(bytes))
|
||||
.with_guessed_format()
|
||||
.map_err(|err| err.to_string())?;
|
||||
let image = reader.decode().map_err(|err| err.to_string())?;
|
||||
|
||||
let preview_image = if image.width() > PREVIEW_WIDTH || image.height() > PREVIEW_HEIGHT {
|
||||
image.thumbnail(PREVIEW_WIDTH, PREVIEW_HEIGHT)
|
||||
let render_image = if image.width() > RENDER_WIDTH || image.height() > RENDER_HEIGHT {
|
||||
image.thumbnail(RENDER_WIDTH, RENDER_HEIGHT)
|
||||
} else {
|
||||
image.clone()
|
||||
};
|
||||
|
||||
let thumbnail_image =
|
||||
if preview_image.width() > THUMBNAIL_WIDTH || preview_image.height() > THUMBNAIL_HEIGHT {
|
||||
preview_image.thumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT)
|
||||
if render_image.width() > THUMBNAIL_WIDTH || render_image.height() > THUMBNAIL_HEIGHT {
|
||||
render_image.thumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT)
|
||||
} else {
|
||||
preview_image.clone()
|
||||
render_image.clone()
|
||||
};
|
||||
|
||||
let preview = encode_dynamic_image(preview_image)?;
|
||||
let thumbnail = encode_dynamic_image(thumbnail_image)?;
|
||||
|
||||
Ok((
|
||||
GeneratedAsset {
|
||||
objects: vec![preview],
|
||||
},
|
||||
GeneratedAsset {
|
||||
objects: vec![thumbnail],
|
||||
},
|
||||
))
|
||||
Ok(GeneratedAsset {
|
||||
objects: vec![thumbnail],
|
||||
})
|
||||
}
|
||||
|
||||
struct PdfGeneratedAssets {
|
||||
preview: GeneratedAsset,
|
||||
thumbnail: GeneratedAsset,
|
||||
page_count: u32,
|
||||
}
|
||||
@@ -406,12 +356,11 @@ fn generate_pdf_assets(bytes: &[u8]) -> Result<PdfGeneratedAssets, String> {
|
||||
let total_pages = pages.len() as usize;
|
||||
|
||||
let render_config = PdfRenderConfig::new()
|
||||
.set_target_width(PREVIEW_WIDTH as i32)
|
||||
.set_maximum_height(PREVIEW_HEIGHT as i32)
|
||||
.set_target_width(RENDER_WIDTH as i32)
|
||||
.set_maximum_height(RENDER_HEIGHT as i32)
|
||||
.render_form_data(true)
|
||||
.rotate_if_landscape(PdfPageRenderRotation::None, true);
|
||||
|
||||
let mut preview_objects: Vec<GeneratedImage> = Vec::with_capacity(total_pages);
|
||||
let mut thumbnail_objects: Vec<GeneratedImage> = Vec::with_capacity(total_pages);
|
||||
|
||||
for page_index in 0..total_pages {
|
||||
@@ -423,18 +372,16 @@ fn generate_pdf_assets(bytes: &[u8]) -> Result<PdfGeneratedAssets, String> {
|
||||
.render_with_config(&render_config)
|
||||
.map_err(|err| format!("render pdf page {page_index}: {err}"))?;
|
||||
|
||||
let preview_buffer = bitmap.as_image().to_rgb8();
|
||||
let preview_image = image::DynamicImage::ImageRgb8(preview_buffer);
|
||||
let render_buffer = bitmap.as_image().to_rgb8();
|
||||
let render_image = image::DynamicImage::ImageRgb8(render_buffer);
|
||||
|
||||
let thumbnail_image = if preview_image.width() > THUMBNAIL_WIDTH
|
||||
|| preview_image.height() > THUMBNAIL_HEIGHT
|
||||
{
|
||||
preview_image.thumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT)
|
||||
} else {
|
||||
preview_image.clone()
|
||||
};
|
||||
let thumbnail_image =
|
||||
if render_image.width() > THUMBNAIL_WIDTH || render_image.height() > THUMBNAIL_HEIGHT {
|
||||
render_image.thumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT)
|
||||
} else {
|
||||
render_image.clone()
|
||||
};
|
||||
|
||||
preview_objects.push(encode_dynamic_image(preview_image)?);
|
||||
thumbnail_objects.push(encode_dynamic_image(thumbnail_image)?);
|
||||
}
|
||||
|
||||
@@ -443,9 +390,6 @@ fn generate_pdf_assets(bytes: &[u8]) -> Result<PdfGeneratedAssets, String> {
|
||||
.map_err(|_| "page count exceeds supported range".to_string())?;
|
||||
|
||||
Ok(PdfGeneratedAssets {
|
||||
preview: GeneratedAsset {
|
||||
objects: preview_objects,
|
||||
},
|
||||
thumbnail: GeneratedAsset {
|
||||
objects: thumbnail_objects,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user