feat: add animated WebP encoding and decoding support#103
Open
xfalcox wants to merge 1 commit into
Open
Conversation
32d64bd to
cd7bf5c
Compare
Encoder:
- encodeAnimated(frames, options) accepts array of {imageData, duration}
and produces animated WebP with infinite loop via WebPAnimEncoder API
- Links against libwebpmux for muxing frames into container
Decoder:
- decode(buffer) now handles both static and animated WebP (falls back
to demux API for animated files, returning first composited frame)
- decodeAnimated(buffer) returns array of {imageData, duration} frames
with proper alpha blending and disposal method handling
- isAnimated(buffer) returns boolean
- Links against libwebpdemux for demuxing animated WebP
Also upgrades EMSDK from 2.0.34 to 3.1.57 to fix terser minifier crash.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
cd7bf5c to
060566b
Compare
Owner
This was referenced Mar 31, 2026
xfalcox
added a commit
to discourse/jSquash
that referenced
this pull request
May 7, 2026
xfalcox
added a commit
to discourse/discourse
that referenced
this pull request
May 11, 2026
## Summary - Extends client-side image optimization to convert **JXL → JPEG**, **HEIC → JPEG**, and **animated GIF → animated WEBP** using jSquash WASM packages before upload - Transparent JXL/HEIC images are converted to **WEBP** instead of JPEG, so transparency is preserved (WEBP compresses much better than PNG for this case) - Gated as an **upcoming change** via `composer_media_optimization_image_convert_enabled` (experimental, `feature,all_members`, opt-in per group through the upcoming changes admin UI) - Sends raw file bytes to Web Worker for formats browsers can't decode natively (JXL, HEIC), with new `"convert"` and `"convertAnimated"` worker message types - Adds JXL to `authorized_extensions` and `supported_images`; adds HEIC/HEIF to `supported_images` for consistency - Skips GIF→WEBP when output is larger than input - Falls back to filename when MIME type is missing (browsers may not recognize JXL/HEIC) ### Note on jSquash packages This depends on Discourse-scoped forks of the jSquash packages (`@discourse/jxl`, `@discourse/heic`, `@discourse/webp`, `@discourse/gif`, `@discourse/jpeg`, `@discourse/resize`). The following upstream PRs would let us move back to the canonical `@jsquash/*` packages, but the upstream maintainer is currently unresponsive: - jamsinclair/jSquash#101 (`@jsquash/heic`) - jamsinclair/jSquash#103 (`@jsquash/webp` animated support) - jamsinclair/jSquash#104 (`@jsquash/gif`) --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Encoder:
Decoder:
Also upgrades EMSDK from 2.0.34 to 3.1.57 to fix terser minifier crash.