New Features
- artist: Give Mornye's album card Music's plus and note
- search: Drop Mornye desktop's filter chips, as in Music
- artist: Shuffle an artist's Library songs from the Mornye hero
- mornye: Music's glass inspector, player actions and Home text
- home: Make Mornye's Home Music's own, picks included
- home: Recently Played and extension playlists for Mornye
- theme: Move a stored red Mornye accent to blue once
- search: Mornye Top Results and a compact desktop toolbar
- home: Open Mornye Home with Top Picks banners
- mornye: Pour menus, fold the bar into one glass, desktop artist row
- desktop: Bring Mornye's chrome and motion closer to Music
- track: Copy a track's streaming service link
- library: Play, queue and delete files from a collection selection
- library: Find downloads that were moved to the download folder (#809)
- desktop: Use the expressive transport in the Material player bar
- player: Make automatic fullscreen lyrics optional
- network: Prefetch upcoming NAS songs to a local cache
- library: Upload local songs to network storage
- desktop: Add application tab back and forward history
- cast: Google Cast on iOS and desktop
- cast: Add a Rust Google Cast sender and media server
- lyrics: Edit and sync lyrics from the player
- player: Open audio files and folders directly
- home: Lay out the Material desktop Home for a wide pane
- library: Save network songs offline with independent copies
- files: Safely reorganize existing library files (#781)
- Implement plain Windows path handling and matching for file operations by @kevenchantre
- Enhance library reorganization and file handling by @kevenchantre
- files: Apply folder and filename rules to existing downloads by @kevenchantre
- player: Slide artwork with track swipes (#788)
- player: Slide artwork with track swipe by @frpboy
- library: Add whole-library metadata re-enrichment (#787) (#787)
- Add re-enrich all tracks functionality and related UI components by @kevenchantre
- lyrics: Add fast and synced translation modes
- android: Add Google Cast audio output
- library: Add search by saved lyrics
- lastfm: Add desktop account connection and scrobbling
- lyrics: Automatically embed online search results
- lyrics: Sync AI romanization to original word timing
- lyrics: Sync translated phrases to original word timing
- network: Edit metadata and lyrics on SMB and WebDAV
- desktop: Dismiss paused playback from the player bar
Bug Fixes
- android: Register player events before create replies
- android: Move player operations off the UI thread
- metadata: Re-enrich writable network library files
- player: Dismiss search focus when opening now playing
- player: Keep landscape motion covers square and toggle lyric controls
- audio: Clarify Bluetooth codec access and bitrate display
- metadata: Grant file access for Windows artwork paths
- artist: Isolate album notes and clarify download actions
- search: Preserve all extension filters on desktop
- home: Respect feed selection and provider-neutral layouts
- audio: Distinguish exclusive output from bit-perfect playback
- home: Hold Mornye's card until Recently Played loads
- home: Let Top Picks read any extension
- artist: Let Mornye's artist page fall away to near black
- home: Size Mornye's Home shelves as Music's pane does
- mixes: Build again when the cache is empty at the same total
- home: Keep Mornye's Home neutral and enlarge its toolbar glass
- artist: Size the Mornye desktop toolbar as in Music and drop its title
- player: Keep Mornye's layout still when a computer takes over
- windows: Build without the ATL component and find Inno Setup (#764)
- orientation: Let tablets rotate outside the full player (#807)
- playback: Remove missing files from the active queue
- windows: Update WASAPI backend and use driver minimum buffer
- playback: Skip missing local tracks
- playback: Release local audio before deletion
- nas: Accept format hints in metadata proxy URLs
- ios: Play formats AVPlayer cannot open and skip unplayable songs
- windows: Poll connectivity without registering network listeners
- lint: Align Library test overrides and notifier APIs
- android: Keep media controls responsive during artwork reads
- desktop: Keep Escape on the page and record every destination
- lyrics: Translate straight into the saved language
- link: Refresh phone catalogs after desktop file deletion
- android: Restore keyboard viewport after backgrounding
- android: Keep MediaPlayer audio in the platform mixer
- ios: Preserve NAS streaming format hints and native errors
- link: Delete shared phone songs from desktop
- desktop: Keep Material player bar controls inside narrow windows
- files: Align the reorganize flow with the app's UI rules
- library: Preserve artwork and silence automatic scan notices
- windows: Omit unused FFmpegKit native plugin
- files: Keep relocation compatible with system SQLite
- windows: Recognize alternate paths to the same library file (#789)
- windows: Treat verbatim and plain paths as the same file by @kevenchantre
- l10n: Validate and merge Crowdin translations (#734)
- download: Resolve SAF conversion filenames from document metadata (#768)
- storage: Allow cancellable large-file uploads (#762) (#762)
- storage: Decouple upload timeouts for large file transfers by @Rohitkr0406
- playback: Support gapless exclusive output and guard metadata lifecycle
- android: Size notification mark for the status bar
- android: Promote download service before queue preparation
- lyrics: Reduce translation latency and recover missing lines
- link: Preserve artwork during remote track changes
- player: Center immersive Material landscape content
- link: Relay playback artwork and metadata across devices
- equalizer: Preserve signed zero in control selectors
- audio: Reconcile USB output status with native playback
- lyrics: Complete Material word lift before stopping the clock
- library: Unify Windows extended path identities
- images: Preserve extension icon crop resolution
- android: Avoid Sony snapshot crash when locking screen
- library: Persist the selected song sort order
- covers: Preserve fresh thumbnail permissions when linking
- cache: Finish decoding invalid analysis artwork
- apple: Guard seek callbacks and scan progress
- android: Cancel blocked SAF worker waits
- extensions: Enforce deadlines while waiting for the VM
- network: Preserve edits and close late requests
- lyrics: Preserve motion across interrupted scrolls
- download: Cancel old attempts before retrying
- player: Preserve transport intent across asynchronous work
- link: Refresh phone library on reconnect
- network: Handle HTTP redirects and clarify connection errors
- metadata: Preserve extension URL fetch errors
- link: Read embedded phone lyrics without cached audio
- library: Avoid duplicate desktop scrollbars
Performance
- backend: Migrate selected data jobs to Rust
- link: Reuse desktop player window state
- link: Filter remote rows and release published phone catalogs
- library: Share Android thumbnail files by content
- equalizer: Isolate control rebuilds and defer serialization
- ui: Back off idle TV focus recovery and retain transfer layout
- android: Stream unchanged CUE scans and retain metadata objects
- network: Reuse cover clients and coalesce permission checks
- link: Send negotiated download queue deltas
- autoplay: Defer taste training and pack vectors on the worker
- android: Defer crash session preference I/O
- bridge: Avoid redundant download and small job codecs
- storage: Move preference blobs to atomic files
- covers: Memoize reference keys and offload index warmup
- images: Bound landscape artwork and extension icon decodes
- link: Suppress idle state heartbeats and redundant pings
- player: Bound Android session queue messages
- shell: Defer idle preload and freeze hidden tab size
- library: Measure uniform desktop song row extents
- rewind: Cache backdrop blur and cap story updates
- library: Reduce schema writes and repeated path migration
- library: Restrict filtered album aggregates
- library: Reuse suggestion matching and playlist seeds
- home: Share counts and reuse unchanged shelves
- network: Keep one Subsonic metadata client per connection
- shell: Keep the Store update count out of MainShell
- desktop: Rebuild only the arrows when a shelf is hovered
- shell: Keep the window size and download count out of MainShell
- player: Set the AutoMix start timer again only when the start moves
- player: Prepare AutoMix only in the last 150 s of a song
- library: Move the incremental scan delta instead of copying it
- network: Keep NAS tag covers the cache already holds
- covers: Link identical Library thumbnails on desktop and iOS
- covers: Flush scan thumbnails once per scan on Apple
- ui: Lazily build large logs and review lists
- library: Batch retained-page refreshes
Refactoring
- Reorganize and streamline file settings and download queue logic by @kevenchantre
Testing
- search: Note why the Mornye fingerprints changed
- network: Accept the file type in streaming routes
- Fix native cache cleanup fixtures (#786) (#786)
- Pass empty cover references to native cleanup by @frpboy
- shell: Allow idle preloads in rebuild checks
- player: Cover AutoMix lead duration and cancellation
- perf: Measure private native application pipelines
Chores
- release: Let a manual run skip desktop packages
- Update AltStore source to v5.3.1 by @github-actions[bot]
- Neutralize UI terminology and clarify code comments
- Bump version to 5.3.1 (167)
- Merge upstream AltStore source update
- Update AltStore source to v5.3.0 by @github-actions[bot]
Merge
- Sync reviewed pull requests from origin main
Revert
- player: Keep the artwork anchored during track swipes
New Contributors
- @kevenchantre made their first contribution
- @frpboy made their first contribution
- @lesecuritae made their first contribution
- @Rohitkr0406 made their first contribution
Full Changelog: v5.3.0...v5.3.1
Downloads
Android
Android APKs: 5.3.1-hotfix.2 (build 168). Restricts the Glyph mixer workaround to Nothing devices to address reported volume control issues on other phones.
- arm64:
Mornye-v5.3.1-hotfix.2-arm64.apk(recommended for modern devices) - arm32:
Mornye-v5.3.1-hotfix.2-arm32.apk(older devices) *.apk.idsig: V4 signatures foradb install --incrementalonly; normal installs do not need them
iOS
- iOS:
Mornye-v5.3.1-ios-unsigned.ipa(sideload required)
SHA256SUMS.txt lists the SHA-256 of every file above.
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA