feat: alignment on media thumbnail encoding

This commit is contained in:
2026-05-01 18:46:02 +02:00
parent 436485683e
commit be439f929f
2 changed files with 17 additions and 11 deletions

View File

@@ -47,11 +47,11 @@ Goal: align bDS2 with old bDS behavior. Use the Allium specs as the contract onl
- Spec: adds `proposal_ttl_cli = 8.hours`. - Spec: adds `proposal_ttl_cli = 8.hours`.
- Action: remove the CLI-specific TTL from `specs/mcp.allium` or mark it explicitly future/non-current. - Action: remove the CLI-specific TTL from `specs/mcp.allium` or mark it explicitly future/non-current.
## P1: Media Thumbnail Encoding ## P1: Media Thumbnail Encoding (done)
- Old bDS: small/medium/large WebP quality 80; AI JPEG quality 85. - Old bDS: small/medium/large WebP quality 80; AI JPEG quality 85.
- bDS2 now: matches old bDS. - bDS2 now: matches old bDS.
- Spec: says encoder default quality. - Spec: now specifies WebP quality 80 and AI JPEG quality 85.
- Action: tend `specs/media_processing.allium` to specify WebP quality 80 and AI JPEG quality 85. - Action: tend `specs/media_processing.allium` to specify WebP quality 80 and AI JPEG quality 85.
## P2: Media Import Event Shape ## P2: Media Import Event Shape

View File

@@ -91,8 +91,10 @@ config {
thumbnail_medium_width: Integer = 400 thumbnail_medium_width: Integer = 400
thumbnail_large_width: Integer = 800 thumbnail_large_width: Integer = 800
thumbnail_ai_size: Integer = 448 -- 448x448 square crop, JPEG thumbnail_ai_size: Integer = 448 -- 448x448 square crop, JPEG
thumbnail_format: String = "webp" -- All sizes except AI (encoder default quality) thumbnail_format: String = "webp" -- All sizes except AI
thumbnail_quality: Integer = 80 -- WebP quality for small/medium/large
thumbnail_ai_format: String = "jpeg" -- AI thumbnail only thumbnail_ai_format: String = "jpeg" -- AI thumbnail only
thumbnail_ai_quality: Integer = 85 -- JPEG quality for AI thumbnail
} }
rule GenerateThumbnails { rule GenerateThumbnails {
@@ -103,25 +105,29 @@ rule GenerateThumbnails {
source: media.file_path, source: media.file_path,
destination: media.thumbnails.small, destination: media.thumbnails.small,
width: config.thumbnail_small_width, width: config.thumbnail_small_width,
format: config.thumbnail_format format: config.thumbnail_format,
quality: config.thumbnail_quality
) )
ensures: ThumbnailGenerated( ensures: ThumbnailGenerated(
source: media.file_path, source: media.file_path,
destination: media.thumbnails.medium, destination: media.thumbnails.medium,
width: config.thumbnail_medium_width, width: config.thumbnail_medium_width,
format: config.thumbnail_format format: config.thumbnail_format,
quality: config.thumbnail_quality
) )
ensures: ThumbnailGenerated( ensures: ThumbnailGenerated(
source: media.file_path, source: media.file_path,
destination: media.thumbnails.large, destination: media.thumbnails.large,
width: config.thumbnail_large_width, width: config.thumbnail_large_width,
format: config.thumbnail_format format: config.thumbnail_format,
quality: config.thumbnail_quality
) )
ensures: ThumbnailGenerated( ensures: ThumbnailGenerated(
source: media.file_path, source: media.file_path,
destination: media.thumbnails.ai, destination: media.thumbnails.ai,
size: config.thumbnail_ai_size, size: config.thumbnail_ai_size,
format: config.thumbnail_ai_format format: config.thumbnail_ai_format,
quality: config.thumbnail_ai_quality
) )
} }
@@ -131,8 +137,8 @@ value ThumbnailGeneration {
-- 2. Apply EXIF orientation correction (rotation, flip) so thumbnails display correctly -- 2. Apply EXIF orientation correction (rotation, flip) so thumbnails display correctly
-- 3. Resize: small/medium/large preserve aspect ratio (width-constrained) -- 3. Resize: small/medium/large preserve aspect ratio (width-constrained)
-- AI thumbnail is a 448x448 center crop (letterboxed on black background) -- AI thumbnail is a 448x448 center crop (letterboxed on black background)
-- 4. Encode as WebP (encoder default quality) for small/medium/large -- 4. Encode as WebP quality 80 for small/medium/large
-- Encode as JPEG for AI thumbnail -- Encode as JPEG quality 85 for AI thumbnail
-- 5. Write to bucketed thumbnail path: thumbnails/{id[0:2]}/{id}-{size}.{ext} -- 5. Write to bucketed thumbnail path: thumbnails/{id[0:2]}/{id}-{size}.{ext}
-- --
-- No _source copy is made. Thumbnails regenerated from the original binary. -- No _source copy is made. Thumbnails regenerated from the original binary.
@@ -167,8 +173,8 @@ value ImageProcessing {
} }
-- Processing rules: -- Processing rules:
-- 1. All thumbnails (except AI) are encoded as WebP (encoder default quality) -- 1. All thumbnails (except AI) are encoded as WebP quality 80
-- 2. AI thumbnail is encoded as JPEG (for vision model compatibility) -- 2. AI thumbnail is encoded as JPEG quality 85 (for vision model compatibility)
-- 3. Original format is preserved for full-size assets (no conversion) -- 3. Original format is preserved for full-size assets (no conversion)
-- 4. EXIF data is not stripped (thumbnails are re-encoded, so EXIF is naturally absent) -- 4. EXIF data is not stripped (thumbnails are re-encoded, so EXIF is naturally absent)
} }