New Features
- library: Expand audio format and ReplayGain filters
- player: Warn when muted and allow manual resume
- native: Add cancellable data workers and streamed file hashing
- playback: Automate mute and headphone playback controls
- player: Show mixing status beside audio quality
- automix: Add configurable duration and transition effects
- lyrics: Add staggered spring motion to visible rows
- build: Require Discord in production and keep Lite opt-in
- settings: Default to built-in playback and word-synced lyrics
- network: Add SMB and WebDAV libraries with streaming and uploads
- statistics: Show cover artwork and artists for top tracks
- mornye: Restore liquid glass with continuous draggable navigation
- discord: Add opt-in mobile rich presence with track artwork
- extensions: Support personal account forms and direct downloads
- playback: Add local listening statistics and annual recap
- library: Show recent releases from favorite artists
- library: Add batch playlist and queue actions
- library: Filter albums with missing tracks
Bug Fixes
- repo: Retry initialization before adding a registry
- storage: Preserve extension encryption keys on read failures
- extensions: Retain packages with unreadable settings
- downloads: Finalize album ReplayGain after history is saved
- downloads: Preserve actual provider audio format
- lyrics: Treat placeholder zero timestamps as unsynced
- library: Retry transient SQLite locks before scan transactions
- riverpod: Remove public notifier getters
- queue: Merge startup additions before persistence and processing
- library: Stage native scans before owner SQLite publication
- cache: Prune detached projections under source writer barrier
- backup: Publish native restores through owning SQLite connection
- sqlite: Isolate native staging from live database handles
- queue: Preserve restored downloads during startup flush
- mornye: Show provider checkmark spacing only when selected
- mornye: Use glass for download queue confirmations
- settings: Retain pending preferences during asynchronous loading
- recents: Preserve early edits during history loading
- logs: Retain polling ownership across restart and clear
- network: Close request-owned HTTP clients reliably
- backup: Close archive outputs when extraction fails
- android: Release temporary media on failed SAF operations
- playlists: Prevent overlapping picker submissions
- network: Discard stale folder browsing responses
- downloads: Recover queue ownership after setup failures
- playlists: Serialize collection changes and isolate domain models
- history: Serialize mutations and preserve newer file metadata
- lyrics: Hold current line highlight until the next lead
- history: Preserve bulk deletion failure handling
- library: Distinguish unavailable storage from missing files
- player: Retire deleted sources and stale SAF copies
- library: Remove deleted files from both library indexes
- downloads: Preserve filenames after decryption and conversion
- glass: Refract navbar icons through the held lens
- glass: Swell navbar glass without resizing icons
- library: Serialize scan admission and retain reconnect requests
- artwork: Promptly dispose failed video decoders
- home: Protect fresh feeds from late cache restoration
- search: Reject pending completions after clearing results
- library: Honor album artist filters in summary counts
- home: Anchor track menus to their source cards
- extensions: Use themed account option picker
- automix: Diagnose crossfade fallback reasons
- automix: Use themed transition effect picker
- lyrics: Keep simultaneous singers highlighted and visible
- extensions: Accept account forms with optional cancel actions
- library: Expose failed scan files and reasons in app logs
- library: Preserve album view when returning from detail screens
- stats: Show artwork for top artists
- mornye: Match tab highlights to the expanding glass outline
- library: Scan remote SAF folders when root metadata is unavailable
- library: Match SAF documents across folder tree aliases
- mornye: Use liquid glass for Home download and album actions
- lyrics: Grant scoped access to selected audio files
- mornye: Use consistent animated oval switches across glass levels
- artwork: Recover missing SAF covers after transient provider failures
- library: Reject filename guesses from failed NAS metadata reads
- selection: Dismiss action panels with a downward swipe
- android: Preserve remote SAF descriptors for audio and artwork
- playback: Refresh notification favorite and shuffle controls
- lyrics: Preserve manual scrolling during control transitions
- mornye: Keep lyrics scrolling stable when controls fade
- library: Preserve folders during upgrades and load failures
- ui: Make snackbars transient and replace stale messages
- ios: Preserve Now Playing ownership with motion artwork
- metadata: Recognize featured artist credits consistently
- library: Make missing-file cleanup responsive for downloaded tracks
- lyrics: Preserve batch track identity and report results promptly
- album: Open track metadata from local album rows
- history: Prevent maintenance from restoring orphan downloads
- artwork: Preserve thumbnail aspect ratio during decoding
- library: Restore Material playlist drag and drop
- library: Restore search selection actions after re-enrich
- metadata: Show re-enrich results above Library cards
- library: Preserve SD card visibility during transient access failures
- library: Include unindexed tracks in missing ReplayGain filter
- download: Preserve native media workspace across cache eviction
Performance
- downloads: Index queued positions for scheduling
- downloads: Stop queue selection when slots fill
- downloads: Index progress notification candidates
- downloads: Reuse committed queue snapshots
- downloads: Retain queue indexes between item removals
- downloads: Check album ReplayGain readiness in one pass
- downloads: Batch queue failures when folder access is lost
- downloads: Enqueue selected playlists in one update
- downloads: Batch queue cancellation and progress cleanup
- downloads: Batch cancellation resets for retry
- collections: Delete selected playlists in one transaction
- downloads: Enqueue Wishlist selections in one update
- collections: Remove selected tracks in one transaction
- network: Prepare large SMB listings off the UI thread
- library: Buffer network scan output with bounded writes
- lyrics: Short-circuit content availability checks
- collections: Batch Love All updates and persistence
- collections: Stage large playlist additions off the UI thread
- collections: Split native chunks without per-line async events
- library: Load bounded browse pages without rereading prefixes
- backup: Stream encoded collections without cloning model graphs
- queue: Bound SQLite transfers and move large codecs off UI
- collections: Hydrate native snapshots on bounded workers
- collections: Isolate action and track row rebuilds
- collections: Reuse membership indexes for metadata changes
- library: Rank playlist search pages on bounded workers
- cache: Batch cover maintenance on Rust workers
- collections: Restore backups on Rust SQLite workers
- backup: Stream ZIP archives on Rust workers
- mornye: Prepare overlay GPU pipeline before first opening
- mornye: Compose overlay glass into one backdrop pass
- mornye: Streamline download source and quality picker
- extensions: Decode provider responses outside the UI isolate
- backup: Stream history backup codecs and restore transactions natively
- library: Index scans and snapshots with native SQLite workers
- playlists: Import CSV and export M3U through native workers
- metadata: Parse lyrics and encode ID3 artwork in native workers
- audio: Analyze AutoMix grids and spectral cutoffs natively
- theme: Extract cover palettes with native quantization
- nas: Process listings, artwork caches, and upload recovery natively
- player: Avoid redundant lyric paints and background sampling
- stats: Ignore playback position-only changes
- widgets: Skip unchanged playback state updates
- network: Reduce directory listing and connection allocations
- library: Simplify unfiltered album queries
- android: Trim platform assets and release Dart symbols
- android: Reduce release APK size
- downloads: Bound scheduler waiters and prevent overlapping retries
- glass: Cull selection masks outside the moving lens
- glass: Omit collapsed navbar backdrop layers
- ui: Retain marquee content while scrolling
- player: Reuse artwork decodes across Mornye transitions
- artwork: Reuse decoded covers and preserve in-flight cache writes
- library: Defer local providers while the feature is disabled
- autoplay: Index listening history and reuse normalized metadata
- library: Coalesce availability probes and reject stale indexes
- search: Reduce tab switching lag
- widget: Publish artwork only for installed consumers
- theme: Resolve artwork cache identities asynchronously
- logging: Batch UI updates and gate native log copies
- analysis: Bound disk cache and protect active bundles
- network: Share artwork by content hash
- playback: Resolve paths lazily and batch history cleanup
- library: Scan SAF CUE audio through live descriptors
- hires: Analyze every channel in one audio decode pass
- cover: Avoid copying originals rejected by cache budget
- usb: Reuse PCM buffers and respect native ring capacity
- isrc: Bound retained indexes and stream FLAC comments
- extensions: Pass metadata values without internal JSON round trips
- bridge: Bound metadata cache and persisted JSON bytes
- audio: Reuse media session worker and bound metadata retention
- media: Shrink FFmpeg while preserving HTTPS motion artwork
- details: Load local albums with skeletons and bound artwork decoding
Refactoring
- player: Isolate session writes and content URI cache ownership
- albums: Share immutable track and disc ordering
- downloads: Normalize completion audio and share album ReplayGain
- extensions: Separate domain models from provider state
- downloads: Extract completion audio and upload staging
- downloads: Separate metadata resolution and embedding
- downloads: Isolate typed results and audio finalization
- android: Isolate native download history persistence
- metadata: Separate file save persistence from editor
- logging: Isolate native log transport
- library: Isolate schema, row mapping and queue queries
- ffmpeg: Split media operations and safely publish outputs
- metadata: Separate editor state, autofill and artwork ownership
- player: Isolate routes, layouts and reactive controls
- player: Separate metadata state and lyrics rendering
- playback: Own configuration and dependencies per runtime
- downloads: Separate persistence, progress and feedback
- network: Place range reader implementations before tests
- metadata: Remove unused fallback parameter
- ios: Remove unreachable legacy bridge routes
- extensions: Align settings with Material and Mornye
- metadata: Flatten track actions and remove similar songs
Documentation
- audio: Record metadata cache retention rules
Testing
- progress: Keep batch tests after production helpers
- downloads: Measure selectors after queue removals
- network: Read complete fixture requests on BSD
- native: Verify private data routes through app channels
- sqlite: Exercise private files and exclusive transactions
- native: Verify data workers through Android and iOS channels
- providers: Keep notifier fixture counters private
- glass: Capture native Mornye poses and layer counts
- performance: Benchmark Mornye on iOS and Android emulators
- Align settings and support title expectations
Chores
- Update AltStore source to v5.0.7 by @github-actions[bot]
- git: Ignore vendored Android build outputs
- Provision pinned Discord SDK for Android and iOS
- Remove Pages workflow without site sources
- network: Keep JSON dependency scoped to tests
- release: Bump build number to 160
- release: Bump app version to 5.1.0
- analyzer: Exclude vendored Android audio plugin
- release: Bump app version to 5.0.8
Full Changelog: v5.0.7...v5.1.0
Downloads
Android
- arm64:
SpotiFLAC-v5.1.0-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v5.1.0-arm32.apk(older devices) *.apk.idsig: V4 signatures foradb install --incrementalonly; normal installs do not need them
iOS
- iOS:
SpotiFLAC-v5.1.0-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