feat: 0.5.1 — Library delete/blacklist parity with Home
New in 0.5.1
- Library tab's Delete dialogs now match Home + Playlist-detail: both
the track delete dialog (Tracks tab) and the playlist delete dialog
(Playlists tab) gained an "Also block from future syncs" checkbox.
Button label flips to "Delete & Block" when checked. Blocked items
are kept as tombstone rows so future sync identity matches still see
them and skip re-downloading.
Rolled in from 0.5.0
Sync pipeline
- Per-source Sync Mode: Refresh / Accumulate now picked independently
for Spotify vs YouTube. DataStore migrates the old global sync_mode
key into spotify_sync_mode on first read; YouTube defaults to Refresh. - DiffWorker rewritten around a per-playlist withTransaction block so
a crash mid-refresh no longer leaves empty or half-linked playlists. - Soft-deleted tracks no longer resurrect under ACCUMULATE. The cross-
ref ensurer checks removed_at and skips re-linking tracks the user
explicitly removed. - findExistingTrack collapsed into a single OR-query (was 3 N+1 reads
per remote track). Shaves ~6,000 SELECTs from a 3K-track sync.
Stash Discover
- Fixed the wipe-on-refresh bug that made the mix 100% library tracks:
materializeMix now re-links every DONE discovery_queue track that
still exists after the weekly clear. Paired with an orphan-sweeper
guard so in-flight discovery stubs aren't GC'd between refresh and
re-link. - Weekly per-recipe discovery cap raised 10 → 30.
- Stash Discover recipe retuned: discovery_ratio 0.25 → 0.6. Non-
destructive migration updates existing installs' row in place instead
of wiping the playlist + cascading the queue.
Last.fm
- Home nudge banner when creds are wired but session is missing and
pending scrobbles exist. Dismissible forever via the X button. - "Sync scrobbles now" button in Settings' Last.fm Connected section
pushes the whole backlog on demand (useful right after connect when
cold-start import + accumulated plays leave hundreds queued). - Sync status card no longer duplicates Spotify / YouTube service
labels — the stats row already has them.
Playlists (sync + Home)
- YouTube playlists disabled in Sync Preferences no longer reappear on
Home after every sync. New getAllVisible query gates by sync_enabled
with a source = 'BOTH' exemption so in-app-created CUSTOM + STASH_MIX
stay visible regardless of toggle state. - Home playlist grid has Recently Added / A-Z / Most Played sort chips
matching the Library screen. - Library delete crash fixed (CursorWindow invalidation during Flow
read on 3K+ track libraries; retryWhen bounded at 3 attempts). - ExoPlayer onPlayerError handler now recovers by skipping to the next
track instead of stalling in STATE_IDLE. Fixes auto-advance freezes. - Playlists gained a stable date_added column (migration v12→v13).
Library's Recently Added sort is now stable across syncs.
Wrong-version downloads
- Title-pattern filter broadened from 5 exact substrings to 16
patterns covering lyric video, [brackets], HD Video, Visualizer,
Audio, Upscaled, etc. The old filter was matching 0 of 38 real
offenders in a typical library. - New music_video_type column (migration v13→v14) persists the
InnerTube classification so repeat runs of Fix wrong-version skip
the network round-trip on known-ATV tracks. - Canonicalizer path now also fills album / album_art_url / duration /
youtube_id on every verified search match via a fill-only-if-blank
DAO query. Stash Discover tracks used to land in the library with no
album art because the search-path never persisted the match's
thumbnail; now they do.
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.5.0...v0.5.1