feat(playback): play the purchased copy of a Qobuz track when it is on disk

A downloaded purchase played nothing: Play on the purchase detail (and
every other Qobuz entry) streamed the catalog, so a DSD64 album bought
and saved to disk still came out of the CD stream with a "downgrade"
badge. Resolve the download registry at the audible step instead: the
best registered copy of the track that answers the bounded reachability
probe plays under the SAME Qobuz id (`play_id` = catalog id, so
now-playing, history, scrobbling and QConnect see the track they always
did), `.dsf`/`.dff` through the player's additive DSD ticket and PCM
through the file ticket. The gapless successor takes the same route, so
an album bought as DSD stays DSD across the track edge. A play that asks
for a start offset keeps the stream for a DSD copy (DSD cannot seek), and
anything the copy cannot do falls through to the tier walk unchanged.

Contract: qt-frontend/2026-09-01-purchases-local-playback §6, first
slice (implicit preference: the copy wins; no per-album select yet).

cc
This commit is contained in:
vicrodh committed 2026-09-02 00:08:46 -06:00
1 parent 7d302e0c04
commit 554d43cfdf
7 files changed
+329 -13

No files matched your search

@@ -560,6 +560,27 @@ Rectangle {
font.pixelSize: theme.fontLegal
elide: Text.ElideMiddle
}
// What Play actually does. A DSD purchase streams as CD
// quality (the catalog has no DSD stream), so the first
// smoke saw a "downgrade" badge on a Hi-Res album and
// wondered which one was lying: neither — Play is the
// stream until the file is on disk, and the purchased
// copy after that (purchase_playback_qt).
Item {
visible: streamNote.visible
width: 1
height: 8
}
Text {
id: streamNote
visible: root.downloadable && root.anyStreamable
width: parent.width
text: root.t("Until the purchased file is downloaded, Play streams the best quality Qobuz offers for this album. Once it is on disk, Play uses your copy.")
color: theme.textMuted
font.pixelSize: theme.fontLegal
wrapMode: Text.WordWrap
}
}
}