Full changlogs here: https://www.simpmusic.org/blogs/new-update-simpmusic-v170
🎉 New features
Playback & player
- Last.fm scrobbling (Full build only) —
lastfm/lastfm-emptymodule pair, a login screen, its own settings group, and scrobbling during playback - Reworked Now Playing: new backdrop and artist card; added an inline lyric line and removed the blurred backgrounds
- Playlist import from a converted file, straight from Settings; writes to the database in batches
- Charts: added seven new YouTube Music countries — Hong Kong, Malaysia, Philippines, Singapore, Taiwan, Thailand and Vietnam
Browsing & search
- The empty search screen now shows browse categories
- Play a song directly from a browse category's shelf
- Home: long-press a quick pick to open the Now Playing sheet
- Library: show item counts in dynamic playlist headers
Settings
- Ask for confirmation before logging out of a linked account
Desktop
- Replaced VLC with libmpv as the sole playback backend — including DJ crossfade filters and a switch to DASH streams
- Linux: build libmpv from source in a container instead of extracting it from the AppImage
- Tray menu and tooltip now show the current track
- The volume slider expands only on hover
- The player bar timeline is tinted while a crossfade is running
- Video now renders through Compose frames;
SwingPanelremoved - Windows: removed the debug terminal window
- "Play next" now works on the desktop side
- Added a Queue button to the mini player — PR #2275 by @laoluogun
Internal
- Migrated every icon to generated Material Symbols
ImageVectors, droppingmaterial-icons-extendedand the XML drawables
🐛 Fixes
Crossfade & player
- Skip the crossfade when the next track plays as video, and when the current track plays as video
- Keep the correct incoming track when a transport control is pressed mid-crossfade
- Align the restored queue with the player, and guard against saves during a rebuild
- Keep the progress slider within Material3's default range
- Volume: apply it to the player before persisting it; unmute restores the original level — PR #2274
- Desktop: release the crossfade handle when loading another track; route volume through
ao-volumeso it applies instantly - Normalise Tidal key names before Camelot matching — Tidal spells accidentals out (
"FSharp","CSharp") rather than using symbols, sokeyToSemitonefailed to parse them and roughly 22% of tracks silently lost their key in DJ crossfade. Fixed by normalising the string before matching, and by changing thecalculateKeyGapDurationFactorfallback from1.0toUNKNOWN_GAP_DEFAULT_FACTOR— an unparseable key was previously treated as a perfect match
Data & parsing
- Lyrics: stop dropping the first character when no space follows the timestamp
- Identify song columns by
pageTypeinstead of a fixed index - Keep only the first subtitle group as artists
- The database now repairs artist names and album names stored by an older parse
- Treat personalised mixes as radio playlists
- Browse categories: key sections by title and cache them on disk, parse the songs shelf, and render every section the API returns
Downloads & cache
- Stop re-resolving stream URLs for tracks that are already fully downloaded
- Serve directly from cache only when the whole track is on disk
Desktop
- macOS: switched audio output to
avfoundation— avoids anao_coreaudiouse-after-free crash when headphones are plugged in or removed - macOS: register now-playing handlers on the main queue; stopped trimming native memory, which was causing a crash
- Disabled skiko vsync (the cause of freezes when changing displays) and restore the window on Dock reopen
- Backup: stopped double-wrapping the zip output stream
- Registered URL schemes at the correct level in
conveyor.conf, and restored external link opening on Linux - libmpv bundle: resolve by absolute path and drop POSIX open flags on Windows; strip AppleDouble sidecars that made macOS report "app is damaged"; treat an absent
ytdloption as success - Raised the macOS floor to 15.0 for the bundled libmpv — a breaking change for users on older macOS
User interface
- Force-dark screens now use a real dark colour scheme rather than just dark text
- Bottom sheet: title, artist and the like label take their colours from the dark palette
- Search: leave room for the floating search bar in every state; cap the browse grid width and use four columns on wide layouts
- Quick picks: keep titles on one line with a marquee
- Smoother artwork scrims via a smoothstep gradient
NormalAppBaruses the transparent colours the app uses elsewhere- Show a generic album label when the album name is unknown
- Analytics: lengthened the header scrim so the top song title no longer overlaps the stats
- Repaired the notification bell icon path
- Library: the "create playlist" label uses the theme colour
- Spotify: match the login status URL when it carries a query string
⚡ Performance (Desktop)
- Tuned the allocator and GC to cut resident memory
- Return freed native memory to the OS when playback idles
- Capped mpv's demuxer cache
🔧 Infrastructure & dependencies
- PipePipeExtractor to v6.2.0,
brave-newpipebumped - Bumped a batch of dependencies
- Refreshed the Gradle daemon JVM toolchain URLs
- CI/CD: workflow updates; stage natives in the release workflow and verify the libmpv bundles
CLAUDE.mdupdated for Last.fm, the from-source Linux libmpv build, Compose video rendering, and the video crossfade rules
What's Changed
- Feat/queue button desktop miniplayer by @laoluogun in #2275
- Feat/desktop mpv backend by @maxrave-dev in #2284
- Fix/volume unmute to original value by @laoluogun in #2274
- New version: v1.7.0 by @maxrave-dev in #2281
New Contributors
- @laoluogun made their first contribution in #2275
Full Changelog: v1.6.0...v1.7.0