SpotiFLAC v3.5.2
What's New
Performance
- Home tab search result sections are now virtualized with
SliverList(lazy item build) instead of eagerColumnrendering, reducing frame drops on large result sets - Home tab now narrows Riverpod subscriptions using field-level
select(...)for search/provider state to reduce unnecessary full-tab rebuilds - Search provider dropdown now watches only required fields (
searchProvider,metadataSource,extensions) instead of full provider states - Track row rendering in Home search now receives precomputed thumbnail sizing/local-library flags from parent to avoid repeated per-item provider watches
- Removed thumbnail
debugPrintcalls inside track rowbuild()to reduce runtime overhead during scrolling/rebuilds - Queue tab root subscription no longer watches full queue item list; it now watches only queue presence (
items.isNotEmpty) to avoid full Library UI rebuilds on every progress tick - Queue download header/list rendering has been isolated into dedicated
Consumerslivers; header now watches only queue length (items.length) while item list watches queue item updates - Queue filter/sort computations are now centralized and memoized per filter mode within a build pass (
all/albums/singles), reducing repeated list transforms for chip counts and page content - Selection bottom bar content is now computed only when selection mode is active, removing hidden-state heavy list preparation
- File existence checks in queue/library rows now use per-path
ValueNotifier+ValueListenableBuilderupdates instead of triggering globalsetState, reducing unnecessary whole-tab repaints
Changed
- Replaced date range filter with sorting options in Library tab: Latest, Oldest, A-Z, Z-A
- Sorting applies to all views: unified items, downloaded albums, and local library albums
- Local library items now use file modification time (
fileModTime) for sorting instead of scan time, providing more accurate chronological ordering - Removed redundant manual "Export Failed Downloads" button from Library UI (auto-export setting in Settings is sufficient)
- Library filters (quality, format, source) now correctly apply to album tabs and update tab chip counts (All/Albums/Singles)
Fixed
- Fixed local library scan crashing on Samsung One UI devices due to MediaStore URI mismatch in SAF tree traversal
- Added MediaStore URI fallback in SAF file reader: when SAF permission is denied for Samsung-returned MediaStore URIs, automatically retries using READ_MEDIA_AUDIO permission
- Hardened SAF scan with per-directory and per-file error handling: scan now skips problematic files instead of aborting entirely
- Added visited directory tracking to prevent infinite loops from circular SAF references
- Fixed metadata enrichment cascading failure after one queued download fails: metadata APIs (Deezer, SongLink, Spotify) now use isolated
metadataTransportso failed download connections cannot poison metadata requests - Added immediate connection cleanup on every download failure path (error response and exception), not only periodic cleanup every N downloads
- Fixed incremental SAF scan edge case where
lastModified()failure could misclassify existing files as removed (removedUris) - Fixed tracks marked "In Library" still showing active download button - download button now shows as completed (checkmark) for local library tracks across all screens (album, playlist, artist, home/search)
- Fixed FFmpeg M4A-to-FLAC conversion erroneously triggered on already-existing FLAC files when re-downloading duplicates via Tidal
- Fixed SAF download creating empty artist/album folders when re-downloading duplicate tracks; directory is now only created after confirming the file does not already exist
Downloads
Android
- arm64:
SpotiFLAC-v3.5.2-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v3.5.2-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v3.5.2-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