Add /track/lyricsUrl (signed RPC, method name "tracklyricsUrl") plus
the CDN document fetch through the offline choke point. Wire shapes
were validated against live captures (2026-06-10) and diverge from the
inferred yaml: numeric track_id in the step-1 envelope, CDN document
wrapped in {translation_langs, publishers, writers, original}, "wsync"
word-synced discriminator instead of "lsync" (per-word timestamps),
plain lines as objects, and miss = HTTP 404 error body mapped to a
typed Ok(None) instead of an error. Unit tests deserialize fixture
excerpts of the captures; examples/lyrics_probe.rs is the read-only
live probe used for the capture.
Also expose qbz_credentials::load_oauth_token_from_file so a stale
keyring entry cannot shadow the authoritative encrypted token file.
cc
47 lines
977 B
TOML
47 lines
977 B
TOML
[package]
|
|
name = "qbz-qobuz"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
description = "Qobuz API client for QBZ"
|
|
|
|
[dependencies]
|
|
qbz-models = { path = "../qbz-models" }
|
|
qbz-cmaf = { path = "../qbz-cmaf" }
|
|
|
|
# Async
|
|
tokio = { workspace = true }
|
|
futures-util = { workspace = true }
|
|
|
|
# HTTP
|
|
reqwest = { workspace = true }
|
|
|
|
# Serialization
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
|
|
# Crypto (for Qobuz auth)
|
|
md-5 = { workspace = true }
|
|
base64 = { workspace = true }
|
|
|
|
# Time
|
|
chrono = { workspace = true }
|
|
|
|
# Filesystem (bundle-token cache location)
|
|
dirs = "6"
|
|
|
|
# Regex
|
|
regex = { workspace = true }
|
|
|
|
# Logging
|
|
log = { workspace = true }
|
|
|
|
# Error handling
|
|
thiserror = { workspace = true }
|
|
anyhow = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
# Used only by examples/lyrics_probe.rs (read-only live probe of the lyrics
|
|
# endpoint): loads the saved OAuth token / credentials for login.
|
|
qbz-credentials = { path = "../qbz-credentials" }
|