What's New in v2.9.0-beta
Features
Lyrics Screen
- View lyrics for the currently playing track
- Reads embedded lyrics from track metadata via Music Assistant
- Falls back to LRCLIB for tracks without embedded lyrics
- Synced lyrics with auto-scroll that follows playback
- Swipe down to close lyrics panel
Sleep Timer
- Preset durations: 15, 30, 45, 60 minutes
- Option to finish current track before stopping
- Countdown display in queue panel header
- Auto-stops playback when timer expires
Player Selector Overlay
- Replaced "Play On" popups with unified player selector
- Quickly switch playback between devices
- Access from mini player or expanded player
Queue Improvements
- Swipe right on queue item to move to Play Next
- Swipe left to remove from queue
- Tap track to skip directly to it
Bug Fixes
- Fixed progress bar freeze when server sends stale position data
- Fixed volume precision toggle not affecting player selector overlay
- Multiple notification and UI fixes
Performance
- Fixed memory leaks in pending API requests (capped at 100)
- Fixed ImageStream listener leaks in expandable player
- Added LRU cache eviction for metadata caches (bounded sizes)
- Database batch operations (~10x faster sync)
- Async cancellation on player switch prevents stale UI updates
- Added MediaItem equality operators for proper collection handling
Code Quality
- Extracted duration formatting utility (removed 3 duplicate implementations)
- Added design tokens for consistent spacing