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:
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user