iMessage Exporter 4.1.0: Chaparral Yucca contains the following fixes and improvements:
- New Features
- Rendering Engine
- Migrate HTML and TXT exporters to an Askama-based template engine
- Hard cutover: previous string-builder code path is fully removed
- 20 HTML templates and 22 TXT templates created
- Per-format logic split between typed Rust view models and Askama template files
- Shared rendering primitives consolidated so export types consume identical message structures
- New view-model / driver layer is format-agnostic
- Migrate HTML and TXT exporters to an Askama-based template engine
- Interactive iOS backup decryption password input via #730 (contributed by @jmcp)
- Using an encrypted iOS backup without
-xnow prompts interactively -xstill supported for non-TTY contexts
- Using an encrypted iOS backup without
- Rendering Engine
- Bug Fixes
- Disable progress bar when run headless for #738
- Support both automatic TTY detection and manual suppression via
--no-progress
- Support both automatic TTY detection and manual suppression via
- Fix sticker attachments not incrementing the attachment index
- Fix double-indentation on replies in TXT output
- Fix SharePlay's embedded "Ended" line not receiving the per-line reply indent
- Fix several balloon spacing inconsistencies:
- Leading whitespace before
ldtextinfind_my/apple_pay - Trailing colon when
ldtextis absent - Stray whitespace when
app_nameis omitted
- Leading whitespace before
- Fix
format_urlrendering blank lines whenprimary/title/summaryare empty strings - URL messages with a missing payload row are now rendered through the standard URL renderer
- Normalize announcement wording across export types
- Fix broken sticker conversion on Windows
- Fix 1-indexed
ffmpegHEICS conversion assembly - Fix sticker offset reconstruction gaps
- Error logs no longer clobber the progress bar
- Disable progress bar when run headless for #738
- Enhancements
ffmpegprocessing warning now fires for animated stickers in addition to videos- Per-frame
ffmpegloop replaced with a singleffmpeginvocation that consumes both image sequences and appliesalphamergeacross them - Resolve self/recipient names through a single resolver so announcements and edits treat the local user identically
- File-not-found errors now identify the missing path and resolution mode
- Add context to edited message parse errors
- API Changes
-
Breaking
- Remove
Message::started_sharing_location()andMessage::stopped_sharing_location()in favor ofMessage::shared_location_kind() EditedEvent.textis nowString- Remove
Table::extract. UseTable::rowsorTable::rowinstead.
Migration details (click to expand)
Multi-row iteration:
// Before let rows = stmt.query_map(params, |row| Ok(Message::from_row(row)))?; for row in rows { let msg = Message::extract(row)?; // ... } // After for msg in Message::rows(&mut stmt, params)? { let msg = msg?; // ... }Single-row fetch:
// Before let msg = Message::extract(stmt.query_row(params, |row| Ok(Message::from_row(row))))?; // After let msg = Message::row(&mut stmt, params)?; - Remove
-
Ergonomic
- Add
StickerDecorationenum andAttachment::get_sticker_decoration()- Consolidates
get_sticker_source/get_sticker_source_application_name/get_sticker_effectdispatch into a single call returning a format-agnostic decoration
- Consolidates
- Add
impl Display for Expressive<'_> - Derive
Clone + CopyonBubbleEffect,ScreenEffect, andExpressive<'a> - Derive
DefaultonURLMessage<'a> - Unify the exporter's
MessageFormattertrait under a singleRuntimeErrorreturn typeformat_app,format_tapback, andformat_message_intoall returnResult<_, RuntimeError>RuntimeErrorgains aMessageErrorvariant +From<MessageError>impl so?composes end-to-endRuntimeErrornow implementsstd::error::Errorwithsource()- Every
.map_err(...)wrapper site in the exporter crate eliminated
- Add
-
- Security
- HTML escaping is now applied uniformly at template render time via a new
ChatEscaper format_attributesnow sanitizes HTML text on the no-attributes short-circuit
- HTML escaping is now applied uniformly at template render time via a new
- Miscellaneous
- Reorganize exporter resources
- Reduce allocations:
- Attribute formatting now uses a single pre-allocated buffer with opens pushed in reverse and closes in forward order
- Several
Stringtag fields replaced with typed booleans - Redundant clones removed across the shared layer
- Significant new test coverage
- Remove dead and artificial tests covering code paths no longer reachable in the new architecture
- Make unit tests run on PRs
- Clippy cleanups
- Bump dependencies
- Build with latest
rustc