otto 4daca8247c Decouple option codes, fix encode bugs, add test suite
Maintainability:
- Choice options now carry a stable `code` separate from the display
  `label`. The command builder and recipe storage key off codes, so
  relabeling a menu entry no longer silently changes the encode or
  breaks a saved recipe. Format/Audio dispatch is now a clean code
  match instead of `starts_with` on display strings. Old recipes that
  stored labels still load via a label fallback.

Correctness:
- Fade start times now scale by the speed factor already applied in the
  filter chain, so Speed + Fade produces a fade in the right place
  regardless of op order (video and audio).
- Two-pass pass 1 uses the platform null device (NUL on Windows).
- The stderr drain thread is joined before Finished is sent, so the
  failure tail reported to the user is never truncated.

Features / cleanup:
- Accept multiple file arguments on the CLI to open batch mode directly.
- try_recv() instead of recv_timeout(ZERO); drop unused import.

Testing:
- 23 unit tests covering build() arg generation, speed/fade ordering,
  recipe round-trip + old-label fallback, and the pure helpers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 15:47:16 +01:00

lazyff

Screenshot

A friendly terminal UI for FFmpeg. Trim, resize, crop, compress, convert and apply effects to video and audio — without memorizing a single flag.

lazyff always shows the exact ffmpeg command it is about to run, so you can learn FFmpeg as you use it (and copy-paste the command anywhere).

Requirements

  • ffmpeg and ffprobe on your PATH
  • A terminal

Install / run

cargo run --release
# or
cargo install --path .
lazyff              # browse the current directory
lazyff video.mp4    # open a file straight in the editor

lazyff opens a file browser in the current directory. Pick a video or audio file, then stack up edits and press r. Mark several files with Space to edit them all at once (batch mode).

What it can do

Edit Examples
Trim / Cut keep 0:30 → 1:45, instant lossless stream copy
Resize 1080p/720p/480p presets, half size, custom
Crop centered square / 16:9 / 9:16 / 4:3, custom rectangle
Rotate / Flip 90°, 180°, mirror
Speed 0.25x 4x, audio pitch preserved
Color adjust brightness, contrast, saturation
Visual effects grayscale, sepia, blur, sharpen, vignette, denoise, fades
Frame rate 12 60 fps
Compress H.264/H.265 with plain-English quality presets
Fit to size "make it 25 MB" — two-pass encode to a target size
Convert format MP4, MKV, WebM, MOV, GIF (with palette pass), MP3, M4A, WAV
Audio remove track, volume, loudness normalization

Edits combine: add a trim, a resize and a compress, and lazyff builds one ffmpeg command that does all three in a single pass.

Audio files (MP3, FLAC, WAV, ...) only offer the edits that make sense for them — trim, speed, volume/fades, and conversion between audio formats (MP3, M4A, FLAC, WAV, OGG).

Keys

File browser↑↓ move, Enter open, Backspace parent folder, q quit

Editora add edit, Enter change, d delete, J/K reorder, s save recipe, l load recipe, o output name, r run, Esc back to files, q quit

Recipes save your current stack of edits under a name (~/.config/lazyff/recipes.json) so you can re-apply it to any file or batch with two keys.

Forms↑↓ field, ←→ change choice, type into text fields, Enter save, Esc cancel

While encoding you get a progress bar with speed readout; Esc cancels and removes the partial output. Output files are written next to the input as <name>_lazyff.<ext> (rename with o); lazyff refuses to overwrite the input file.

S
Description
No description provided
Readme 131 KiB
Languages
Rust 100%