Stash v0.9.11
feat: 0.9.11 — fine-grained lossless quality controls + per-track quality info
Two related polish wins built on top of v0.9.10's two-source lossless pipeline.
- Lossless quality picker (Settings → Audio Quality)
A three-tier RadioButton group lets users dial the lossless request between
CD (16-bit/44.1 kHz, ~28 MB / 4 min), Hi-Res (24-bit/96 kHz, ~70 MB / 4 min),
and Max (24-bit/192 kHz, ~140 MB / 4 min) instead of the prior hardcoded
Max-everywhere. Maps directly to Qobuz's format_id codes (6/7/27) and flows
through to both QobuzSource (squid.wtf) and KennyySource (kennyy.com.br) on
each resolve(). The actual delivered tier may be lower when the upstream
master doesn't exist at the requested resolution (Qobuz returns
"highest-available <= requested") — what we persist is the file's actual
bit-depth/sample-rate, not the requested tier.
Default-tier logic preserves v0.9.10 behaviour for opted-in users:
- v0.9.8+ users with lossless explicitly enabled → MAX (matches v0.9.10)
- Fresh installs → HI_RES (sensible-storage middle ground)
- v0.9.8+ users with lossless explicitly disabled → HI_RES (so a later
re-enable lands at the storage-aware default rather than 192)
- Per-track quality persistence + display
Schema v17 adds nullable bits_per_sample + sample_rate_hz columns to tracks.
AudioDurationExtractor now probes MediaExtractor (KEY_SAMPLE_RATE on all
APIs, KEY_BITS_PER_SAMPLE on API 30+ via raw "bits-per-sample" key) with a
FLAC STREAMINFO parser fallback for FLAC files where the extractor returns
no bit-depth. Both filesystem and SAF (content://) paths supported.
Surfaces three visible places:
- Library list: FlacBadge upgraded from icon to text pill. Plain "FLAC"
for unknown / CD-quality tracks; "FLAC 24/96" or "FLAC 24/192" for
Hi-Res. CD-quality stays plain on purpose — visual distinction without
crowding row layouts that already carry artist + album text. - Now Playing: a bodySmall line below the artist/album row reads
"FLAC · 24-bit/96.0 kHz · 4233 kbps" (degrades gracefully — codec only,
or codec + bitrate, when partial data is available). - Library Health → Refresh quality info: manual button that enqueues the
backfill worker without WorkManager constraints (user-initiated).
- One-shot backfill for legacy rows
QualityInfoBackfillWorker (HiltWorker, BATCH_LIMIT=500, self-re-enqueues)
fills bit-depth + sample-rate for downloaded lossless tracks where the
columns are still NULL (legacy v0.9.10-and-earlier rows). Auto-triggered
once per install via SharedPreferences flag in StashApplication.onCreate
with requireBatteryNotLow constraint. The DAO predicate is idempotent —
re-runs after everything is populated cost a single empty SELECT.
Out of scope (deferred)
No source-management UI (per-source rows, priority reorder) — v0.9.12+.
No filter chip split for Hi-Res vs CD FLAC. No re-download triggered by
quality-tier changes (forward-only). No transcoding / codec re-encoding.
No bit-depth display for lossy formats (Opus / MP3 / AAC).
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.10...v0.9.11