SpotiFLAC v3.5.1
What's New
Performance
- Removed PaletteService (palette_generator) from all screens for faster navigation and reduced memory usage
- Album, Playlist, Downloaded Album, Local Album, and Track Metadata screens now use blurred cover art as header background instead of dominant color extraction
- Removed
palette_generatordependency - App startup now renders immediately (
runApp) while service initialization runs asynchronously in eager init - Main shell provider subscriptions now use field-level
select(...)to reduce unnecessary rebuilds - Settings persistence now uses single-flight + queued save coalescing to avoid redundant disk writes
- Progress polling cadence adjusted to 800ms for download queue, local library scan progress, and Go log polling
- Android foreground download service progress updates are throttled (change-based updates + 5s heartbeat)
- SAF history repair is now batched (
20items per batch) and capped per launch (60) to reduce startup I/O spikes - Incremental library scan now builds final item list in-memory instead of reloading from database
- Local cover images in queue/library use direct
Image.filewitherrorBuilderinstead ofFutureBuilderexistence check - CSV parser
_parseLinerewritten: correct escaped-quote handling, no quote characters in output - Removed unused legacy screen files (
home_screen.dart,queue_screen.dart,settings_screen.dart,settings_tab.dart) - Incremental local library scan now merges delta results in-memory and sorts once, avoiding full-state reload churn
- Queue local cover rendering now uses direct
Image.file+errorBuilder(removed repeated async file-exists checks)
Added
- Auto-cleanup orphaned downloads on history load (files that no longer exist are automatically removed from history)
Changed
- Removed legacy screen files that were no longer used after the tab/part refactor:
lib/screens/home_screen.dartlib/screens/queue_screen.dartlib/screens/settings_screen.dartlib/screens/settings_tab.dart
- Concurrent download limit increased from
3to5(settings clamp + Options UI chips now support1..5) - Download queue now uses a single parallel scheduler path;
1concurrency is handled as parallel-with-limit-1 (no separate sequential engine) - Download queue now listens to settings updates in real-time so concurrency/output settings stay in sync while queue is active
Fixed
- CSV parser now correctly handles escaped quotes (
"") inside quoted fields during import - Fixed dynamic concurrency update during active downloads: changing limit (e.g.
1 -> 3) now schedules additional queued items without waiting current active item to finish - Queue scheduler now re-checks capacity/queued items on short intervals to avoid blocking on long-running single active download
Dependencies
Flutter
flutter_local_notifications19.x → 20.0.0 (breaking: all positional params converted to named params)connectivity_plus6.x → 7.0.0flutter_secure_storage9.x → 10.0.0- Removed
palette_generatordependency
Go
go-flac/go-flacv1.0.0 → v2.0.4go-flac/flacvorbisv0.2.0 → v2.0.2go-flac/flacpicturev0.3.0 → v2.0.2- Go toolchain 1.24 → 1.25.7
Android
- Android Gradle Plugin 8.x → 9.0.0
- Kotlin 2.1.x → 2.3.10
desugar_jdk_libs→ 2.1.5kotlinx-coroutines-android→ 1.10.2lifecycle-runtime-ktx→ 2.10.0activity-ktx→ 1.12.3
CI/CD
actions/cachev4 → v5actions/checkoutv4 → v6actions/setup-gov5 → v6actions/setup-javav4 → v5softprops/action-gh-releasev1 → v2- GitHub artifact actions updated
Downloads
Android
- arm64:
SpotiFLAC-v3.5.1-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v3.5.1-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v3.5.1-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA