Skip to content

Stash v0.5.1

Choose a tag to compare

@github-actions github-actions released this 21 Apr 21:22
· 1557 commits to master since this release

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