(playlistId, songId) is the playlist_songs PK, so a second @Insert of the
same pair threw UNIQUE constraint failed and killed the app (reproduced
twice in the crash buffer on 10-03). Switch to OnConflictStrategy.IGNORE:
duplicate add is now a silent no-op. Verified on-device on 0.1.5 (7):
re-adding 'The Humbling River' to FAVORITES keeps the song list intact,
0 FATALs, no new crash-buffer entries.
v0.1.3 was sideloaded to the test phone during verification before the
release was published, so self-update from that phone saw equal versions
and reported 'up to date'. Release number moved ahead of the installed
build so the update path has something to offer.
Wavlake rankings 400 on sub-genres (Trance, Classic Rock, Metal...). Discover
chips now include 15 sub-genres; tapping one routes through refreshRankings ->
browseRadioGenre, filling a new browseStations StateFlow from radio-browser
tag search (most-listened first) rendered by RadioGenreList. Wavlake-indexed
genres keep the rankings path.
Genre matching is now space-insensitive (user types 'oldschool' for 'Old
School Hip Hop'). radio-browser tag match is case-SENSITIVE against lowercase
stored tags — byTag() lowercases or every sub-genre browse returns zero hits.
Directory search now merges name and tag(genre) hits so genre queries
find tagged stations. Tabs jump instantly (adjacent glide, swipe kept);
startup pre-builds disk-backed singletons off main thread; equalizer
animation runs only on the playing indicator; row placement animations;
missing list key. Debug-only StrictMode guard for main-thread I/O.
Release signed with debug key for direct installs.