Commits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Kept originals get a com.avify.keep xattr; later runs filter them out at
collection instead of re-encoding to rediscover the growth.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- serialize video encodes: concurrent SVT-AV1 instances oversubscribe
threads and deadlock in svt_av1_enc_send_picture
- keep original when conversion is not smaller (already-compressed
sources often grow); discard the output and report "kept original"
- never re-encode .av1.mp4 outputs on subsequent runs
- remove partial output file when ffmpeg fails
- progress lines now show orig size → ±% → final size
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Off by default (images-only). With --video, video files are transcoded to
AV1 in an .av1.mp4 container (audio copied) by shelling out to ffmpeg/libaom.
--quality/--speed map to crf/cpu-used. Same keep/trash/move handling as images.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Trashing on successful conversion is now the default behavior instead of
requiring -t/--trash. --move-originals still takes precedence.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Redrawn lines that wrap break the cursor-up erase math and garble
output. Truncate active-zone lines to one row; flushed lines keep
full text since they are never redrawn.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Record per-file errors as FAIL in progress, process remaining files,
exit non-zero with a failure count at the end.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Reads of evicted iCloud Drive files fail with EDEADLK (os error 11).
Trigger brctl download and wait (bounded 60s) before decoding.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The "make heic opt-in" change flipped the default features, so build.sh
was silently installing without HEIC support. Restore it explicitly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy the source file's created, modified, and accessed timestamps onto
the new .avif via std's macOS FileTimesExt. Best-effort — conversion
never fails if timestamps can't be set.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cargo install avify now works everywhere without libheif.
HEIC users opt in with --features heic.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Screenshots renamed from .png to .heic (and similar mislabels) now route
to the correct decoder. Falls back to extension only when sniff can't
identify the content.
- Accept directories as arguments; recursively collect supported images
- Add tga feature to image crate
- Decode JPEG XL via jxl-oxide (RGB/RGBA/Gray/Graya)
Removed mention of applying Lightroom XMP sidecar edits to RAW files.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace scattered is_raw/is_heic/has_alpha predicates with a single
ImageFormat enum + classify() function for cleaner format dispatch.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Bump default encoder speed from 6 to 10 (4x faster, minimal quality loss)
- Use encode_rgb instead of encode_rgba for opaque formats (JPG, BMP, RAW)
- Optimize rav1e/ravif in debug builds (opt-level=3) so cargo run is usable
- Bump version to 0.2.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
basecurve.exposure operates on raw Bayer data before demosaicing,
causing channel imbalance. Moved exposure to the RGB LUT in
apply_tone where it multiplies all channels equally.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Completed files are flushed as permanent output and never redrawn.
Only the active in-progress zone uses cursor-up rewriting, so
scrolling during processing won't cause duplicate lines.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Parses Adobe Camera Raw XMP sidecars and applies basic settings:
exposure, white balance, contrast, highlights/shadows,
whites/blacks, vibrance, saturation, and crop.
Advanced edits (masks, tone curves, lens profiles, etc.) are
silently skipped. README documents supported/unsupported settings.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Yellow for in-progress, green for done, red for failed.
Numbers right-aligned for clean columns.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rayon's par_iter recursively halves the range, so with_min_len(1)
still produces non-sequential starts. Now threads pull from a
shared atomic counter, so files start in order.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary line shows total size savings after all files complete.
Removed background render thread — workers trigger renders directly,
eliminating duplicate/stale line renders.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Uses ANSI escape codes to update lines in-place.
In-progress files show [n/total] name →, completed show → sizeKB.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Standard formats (JPEG, PNG, WebP, etc.) decoded via image crate,
RAW files via imagepipe. Added --outdir to write AVIFs to a
separate directory and --move-originals to relocate source files
after conversion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Decodes camera RAW files (ARW, CR2, NEF, etc.) via imagepipe
and encodes to 10-bit AVIF via ravif/rav1e — all in-memory,
no intermediary files.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- serialize video encodes: concurrent SVT-AV1 instances oversubscribe
threads and deadlock in svt_av1_enc_send_picture
- keep original when conversion is not smaller (already-compressed
sources often grow); discard the output and report "kept original"
- never re-encode .av1.mp4 outputs on subsequent runs
- remove partial output file when ffmpeg fails
- progress lines now show orig size → ±% → final size
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Bump default encoder speed from 6 to 10 (4x faster, minimal quality loss)
- Use encode_rgb instead of encode_rgba for opaque formats (JPG, BMP, RAW)
- Optimize rav1e/ravif in debug builds (opt-level=3) so cargo run is usable
- Bump version to 0.2.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Parses Adobe Camera Raw XMP sidecars and applies basic settings:
exposure, white balance, contrast, highlights/shadows,
whites/blacks, vibrance, saturation, and crop.
Advanced edits (masks, tone curves, lens profiles, etc.) are
silently skipped. README documents supported/unsupported settings.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>