Stash v0.3.8
·
1573 commits
to master
since this release
feat(library): protected Liked Songs + in-app playlists + blocklist
Rewrites the delete cascade so Liked Songs (Spotify or YouTube) and
in-app custom playlists are untouchable by deletions originating from
other playlists. Adds a "never download again" blocklist with a
Settings viewer for unblocking.
Protected cascade:
- New MusicRepository.removeTrackFromPlaylistAndMaybeDelete applies a
three-step algorithm: unlink the track from the source playlist,
skip the cascade if any protected playlist (LIKED_SONGS or CUSTOM +
source=BOTH) still claims it, skip the cascade if any other
non-protected playlist still claims it, otherwise delete file +
album art + track row. - Blacklist is explicitly bypassed on protected tracks so users can't
accidentally block something they curated. Protected tracks count
as "kept" in the summary so the UI can explain what happened. - Home playlist-delete and PlaylistDetail single-track-delete dialogs
both route through the new method. Home dialog previews the split
before confirmation: "N will be deleted, M stay because they're in
Liked Songs or a custom playlist."
Blacklist:
- is_blacklisted column on tracks (migration v9 → v10). Blocked rows
stay as tombstones (is_downloaded=0, file_path=null) so every
future sync's identity match picks them up and skips re-download. - DiffWorker's findExistingTrack hit for a blacklisted row short-
circuits: no playlist_tracks insert, no download queue entry. - Settings → Blocked Songs viewer lists blocked tracks with per-row
Unblock. Reactive count badge on the Settings row.
Delete dialogs:
- Home playlist-delete: "Also block these songs from future syncs"
checkbox + protected-count preview. - PlaylistDetail single-track delete: same dialog + checkbox pattern.
- Snackbar summary after the cascade so users know what happened.
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.3.7...v0.3.8