Stash v0.9.26
Stash v0.9.26 — Stash Mixes opt-out + library-wide album backfill + faster album downloads
Stash Mixes (beta) opt-out — issues #56, #57
New "Stash Mixes (beta)" toggle in Settings (between Downloads and
Appearance). On by default — flipping off:
- cancels every Stash-Mix background worker (refresh, discovery,
discovery download, tag enrichment, track info enrichment) so no
more "random songs downloading the moment you reconnect to internet"; - hides Daily Discover, Deep Cuts, and First Listen from Home and
Library by flipping is_active on the built-in recipes + their
materialized playlists; - leaves previously-downloaded discovery tracks on disk so nothing
destructive happens.
Re-enabling restores the recipes and playlists with their existing
track lists, re-schedules the workers, and fires a one-shot refresh
so the surfaces repopulate immediately.
Library Albums tab now actually works
Three issues collided to keep downloaded albums from grouping under
album cards:
- Search-tab downloads dropped the album field. Plumbed through
TrackItem -> SearchDownloadCoordinator -> TrackEntity insert. - Album-page tracklist parser left artist empty (InnerTube omits
the artist column on album pages). Falls back to the album header's
artist now. - Library Albums query grouped by (album, artist), so multi-artist
collab albums fragmented into one card per per-track artist string.
Schema bump v24 -> v25 adds an album_artist column so albums with
the same name by different artists ("Singles" by Usher vs by Drake)
stay separated, while multi-artist collab albums (Drake & 21 Savage
Her Loss, Drake & PartyNextDoor Some Sexy Songs 4 U) stay grouped.
One-shot startup backfill walks every downloaded track with empty
album / album_artist and fills the columns from the file's embedded
album tag (preferred) or the file path's artist/album folder
(de-kebabbed). Existing libraries are auto-organised on next launch
— no re-download required.
Album downloads are fast again
The v0.9.25 loudness work serialised every download behind a 25-50s
ffmpeg ebur128 pass inside TrackFinalizer, so a 25-track album took
~12 minutes of additional dead time waiting for measurements. Moved
measurement off the download path to a fire-and-forget background
scope; the download flow returns as soon as the file is on disk, the
loudness DB write trickles in over the next few minutes.
Spinner state also fixed — a DB-write exception inside upsertSearchTrack
could prevent the Completed flow event from emitting, leaving the
per-row spinner stuck even though the file had landed. Wrapped in
runCatching so the spinner always clears.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
Install
Download the .apk below and open it on your Android device. If you've got a previous Stash release installed, this upgrades in place — your library, sync history, and settings are preserved.
Requires: Android 8.0 (API 26) or newer.
See the README for first-time setup.
Full Changelog: v0.9.25...v0.9.26