New Features
- settings: Reveal nested search results
- settings: Search nested options
- metadata: Show current cover dimensions
- metadata: Add embedded cover resize options
- navigation: Add go to album actions
- player: Polish actions and synced lyrics
- settings: Polish search and navigation layout
- settings: Add searchable settings index
- collections: Unify selection-aware screens
- l10n: Localize settings search
- details: Add adaptive cover palettes
- theme: Add shared design tokens
- album: Batch download selected tracks
- metadata: Choose extension for online autofill
- library: Add quality label display modes
- library: Highlight high-bitrate quality badges
- library: Show a trailing fade on the filter chips row
- library: Playlists filter view and configurable default view
- player: Animate track changes and open queue with a swipe up
- tutorial: Fit pages on short viewports and fix page indicator visibility
- setup: Make language list scrollability obvious and center step content
- tablet: Cap wide-layout margins at 80dp so content uses the screen
- appearance: Manual toggle to force backdrop blur on lower device tiers
- queue: Long-press menu with move up/down for queued items
- metadata: Show average bitrate for lossless files in the track screen
- library: Add missing-ISRC metadata filter
- android: Home-screen download queue widget
- metadata: Manual MusicBrainz lookup in the tag editor
- player: Add repeat off/all/one modes
- queue: Offer one-tap retry when connectivity returns
- ux: Unify added-to-queue snackbars and add fetch retry
- library: ISRC duplicate detection beyond FLAC with review sheet
- track: Add Open on... platform links sheet
- l10n: Merge Crowdin updates, enable Korean at 98%
- library: M3U8 playlist import and export
- library: M3U8 playlist import and export
- player: Restore playback session after process death
- queue: Add download-next action on queued items
- extensions: Verify decentralized package integrity
- audio: Use VHQ settings for SoXR resampling
Bug Fixes
- ci: Align APK targets with supported ABIs
- search: Expose go to album for sparse tracks
- database: Make playback session migration idempotent
- metadata: Keep header details legible in light theme
- player: Refresh lyrics after automatic track changes
- metadata: Preserve WAV and AIFF tags
- analysis: Guard unsupported AC-4 codec
- lyrics: Reject empty embedded payloads
- metadata: Support extension custom search
- analysis: Detect full-band spectral cutoff
- ui: Refine track action spacing
- ui: Align track play button hitboxes
- player: Restore lyrics after cold start
- session: Enforce provider retry modes
- session: Block challenged session generations
- session: Honor canonical gateway error contracts
- session: Coordinate verification across parallel downloads
- selection: Keep modal sheets above selection bar
- player: Restore playback position reliably
- download: Make picker drag dismissal natural
- player: Preserve audio quality across track changes
- a11y: Improve compact control readability
- android: Stop forcing display mode at startup
- download: Suffix only colliding quality variants
- metadata: Fetch maximum cover for online autofill
- metadata: Verify maximum cover candidates
- storage: Recover from unwritable download folders
- ui: Sanitize user-facing errors
- analysis: Detect effective spectral cutoff
- library: Retain history during active downloads
- metadata: Dismiss autofill preview and surface feedback
- album: Overlay selection bar above navbar
- metadata: Align source picker with edit sheet
- analysis: Isolate metrics from active downloads
- download: Always alert for verification pauses
- download: Reject mismatched provider tracks
- download: Honor explicitly selected provider
- extensions: Serialize verification callbacks
- library: Retain cached rows across refresh
- library: Backfill local audio bitrates
- library: Keep rows visible during refresh
- library: Persist lossless bitrate metadata
- download: Swap local track variant actions
- home: Keep search visible during provider changes
- library: Retain records when deletion fails
- download: Complete quality variants reliably
- audio: Wait for complete analyzer metrics
- library: Keep track count readable next to filter actions
- store: Center add-repository state and keep submit button above keyboard
- download: Restore fast SQL-only duplicate check so huge playlists queue again
- queue: Keep cancelled downloads retryable across every cancel path and app restarts
- queue: Give completion-bridge cells swipe navigation into the library list
- extensions: Anchor URL handler patterns to the host
- extensions: Enforce minAppVersion and requiredRuntimeFeatures on load
- extensions: Isolate invalid registry checksums
- reenrich: Preserve release identity in batch actions
- verification: Recover signed-session bootstrap failures
- reenrich: Allow correcting stale release metadata
- download: Avoid unsafe automatic range resume
- config: Refresh announcements and remote content
- ci: Download pinned Gradle for native tests
- ci: Install Android 37 platform package
Performance
- metadata: Avoid SAF copies during quality probes
- android: Skip unused download widget work
- ui: Scope scan rebuilds, aspect-bound MediaQuery, lazy duplicate list
- history: Coalesce index bumps and batch per-row exists lookups
- metadata: Cache MusicBrainz ISRC lookups in the finalize path
- go: Cut redundant signed-session writes, progress-callback churn, tombstone growth
- assets: Instance GoogleSansFlex to the wght axis only
Refactoring
- ui: Standardize error and empty states
- extensions: Share extension rows
- settings: Unify settings components
- selection: Share bottom bar behavior
- library: Unify track cards
- ui: Standardize modal sheets
- ui: Unify sliver page headers
- metadata: Split cover cache, display helpers, and options menu into part files
- extensions: Split manifest models and provider-priority logic into part files
- library: Split row models and queue union SQL into part files
- analysis: Split models, info card, and spectrogram into part files
- android: Split replaygain journal, snapshots, and network policy out of DownloadService
- android: Split media, ffmpeg, and SAF publish helpers out of NativeDownloadFinalizer
- go: Split per-format scanners and incremental scan out of library_scan.go
- go: Split result/overlay helpers and output builders out of extension_fallback.go
- go: Split deezer models, cache upkeep, and browse endpoints out of deezer.go
- go: Split lyrics provider config, LRC codec, and search matching out of lyrics.go
- queue: Fold duplicated final-embed blocks into one helper
- queue: Decompose single-item god-method into _DownloadRun pipeline class
- queue: Move single-item download pipeline into a part file
- android: Split SAF scan and URI IO helpers out of MainActivity
- artist: Split section builders and dialogs into a part file
- go: Split package validation and VM lifecycle out of extension_manager.go
- history: Split models and startup maintenance into part files
- home: Split explore, recent, import, and search-results into part files
- queue: Split progress, verification, and connectivity into part files
- go: Split Ogg parsing and cover-art extraction out of audio_metadata.go
- go: Split M4A/MP4 tagging out of metadata.go
- Consolidate lyrics builders, cancel registries, and priority plumbing
- go: Consolidate duplicated track maps, selectors, and small helpers
- dart: Consolidate duplicated lookup, filename, and search-provider helpers
- ffmpeg: Remove dead conversion cluster and speculative decryption fields
- library: Drop unwired DB pagination providers
- Remove orphaned bridge, database, and queue helpers
- bridge: Remove dead cross-layer platform bridge methods
- ios: Isolate and test extension callbacks
- android: Extract native finalization policies
- dart: Extract queue search and media policies
Documentation
- release: Add 4.8.5 changelog
- extensions: Document the .sflx package suffix
- extensions: Document file download recovery options
- extensions: Add current development guide
Styling
- settings: Restore connected group layout
- dart: Apply repository formatting
- go: Apply Go 1.26 formatting
Testing
- ui: Cover search and player action consistency
- ui: Cover shared design system contracts
- go: Close output handle before cleanup
Dependencies
- deps: Update Flutter and Go dependencies
- deps: Update FFmpeg and notifications
Chores
- Update AltStore source to v4.8.0 by @github-actions[bot]
- release: Bump version to 4.8.5
- repo: Improve contributor experience
- release: Bump version to 4.8.1
- analysis: Enable unreachable_from_main lint
- about: Credit blackgold8282 (Korean) and BrandQc (French) as translators
- altstore: Describe extension-based providers instead of Amazon
Full Changelog: v4.8.0...v4.8.5
Downloads
Android
- arm64:
SpotiFLAC-v4.8.5-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v4.8.5-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v4.8.5-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