v0.2.0
Complete rewrite with clean architecture (adapters → services → commands), Protocol-based DI, and comprehensive test coverage.
New Features
- CLI commands:
search,play,update,delete-current,clean-current,import,cue-split,generate-playlists,rename-playlist,rename-folder,waybar - Playback modes:
play --playlist NAME,play --random --count N, or pipe paths via stdin - Playlist generation: auto-generated m3u playlists — per-folder, per-tag,
inbox,collection,no_playlist,all - Incremental playlist updates: diff-based
regenerate()only rewrites changed files and removes stale ones - Track metadata editing: YAD dialog for folder/playlist assignment with
updatecommand - Waybar integration:
waybarcommand outputs current track's folder and playlists as JSON - Shell completions: bash/zsh/fish via
--install-completion - Structured logging:
-v/-vv/-vvvverbosity flags
Bug Fixes
- Fix beets
modify()not persisting flexible attributes — switched tobeet modify -y -msubprocess - Fix
play --randompassing absolute paths to MPD instead of relative URIs - Fix beets queries failing on paths with special characters (commas, colons) — exact path matching in Python
- Fix
beet removeusing non-existent-yflag — corrected to-f - Use
id:instead ofpath:for subprocess-based beet commands to avoid CLI parsing issues
Changes
- Rewritten from monolithic modules to layered architecture with Protocol-based dependency injection
- Switched from Poetry to Hatch + uv, YAML config to Python dataclass, argparse to cyclopts
- Added CI workflow (ruff, basedpyright, pytest) and PyPI publish workflow with git-cliff changelog