3.6 KiB
3.6 KiB
Task plan — jamendo provider
Ordered, independently verifiable tasks for /jamendo
(architecture/jamendo-provider.md, quality/jamendo.md). Each cites the gate/test
it satisfies.
Crate scaffold
- P1 — Add
jamendodytoCargo.tomlworkspacemembers; createjamendody/Cargo.tomlmirroringsoundclouddy(deps:async-trait,crabidy-core,reqwest,serde,thiserror,tokio,toml,tracing; dev-deptokiofull). Verify:cargo metadatalists the crate.
Network seam (api.rs)
- P2 — Domain types
JamTrack(id, title, artist, album, duration_secs) andJamAlbum(id, title, artist, tracks);FetchError(Http,Decode,NotFound,Unauthorized,NotStreamable). Verify: compiles. (G2) - P3 —
Jamtrait:search_tracks,search_albums,album_tracks,track_detail,track_stream. Doc each with error behavior. Verify: compiles. (G2/G10) - P4 —
JamApi(reqwest):new(client_id, audioformat, timeout)with a timeout-bearing client and redactingDebug;get_jsonhelper addingclient_id+format=json, decoding the{headers, results}envelope, mapping non-success/404/401 toFetchError.limit.min(200)cap. Verify:cargo build. (G3/G4/G5/G9) - P5 — Defensive DTOs (
#[serde(default)]) for track/album/envelope andinto_track/into_album. Verify: build + a decode unit test on a JSON fixture. (G9)
Provider logic (lib.rs)
- P6 —
PROVIDER_ROOT, segment consts,JamPathenum +parse_path. Verify: T2,foreign_and_malformed_paths_reject. (D3) - P7 —
Settings(client_id: Option<String>+ bounds) with redactingDebug. Verify: T10settings_debug_redacts_client_id. (G3) - P8 —
Client+with_api, search-term store helpers (store_add/remove/snapshot),search_limit/album_limit. Verify: compiles. (D3) - P9 — Node builders:
root_node(search only),store_node,search_term_node(tracks + albums),album_node,list_node,jam_track. Verify: T1, T4, T5, T7, T11. (D3/D4) - P10 —
ProviderClientimpl:init(require non-emptyclient_id, elseConfig),settings,is_track_path,get_urls_for_track(→track_stream),get_metadata_for_track,get_lib_root,get_lib_node(download blessing),create/rename/delete_lib_node. Verify: T3, T6, T8, T9. (D4/G1/G2/G6)
Tests (tests.rs)
- P11 —
FakeJam+FailingJamfixtures and all T1–T11. Verify:cargo test -p jamendody. (all tests)
Orchestrator + settings wiring (crabidy-server)
- P12 —
settings.rs:jamendoinALL_PROVIDERS(8→9),ProviderToggles.jamendo, defaults,provider_toggles(). Verify: build + existing settings tests. (G6) - P13 —
provider.rs:jamendo_clientfield,jamendo_owns,jamendo_provider, non-fatalbuild()block (readsjamendo.toml),is_track_patharm,get_lib_rootchild (gated onis_some),get_lib_nodearm,get_urls_for_track/get_metadata_for_trackarms, create/rename/delete arms. Verify:cargo build -p crabidy-server. (D1/G6/G8)
Verification gate
- P14 —
cargo fmt --check,cargo clippy -- -D warnings,cargo testgreen across the workspace. Re-read G1–G10 against the diff. - P15 (live gate, R1) — with a real
client_idinjamendo.toml, browse/jamendo/search/<term>, queue and play a track: confirm audio plays via the existing windowed-HTTP path, seek bar correct (duration from metadata), clean EOS, no panic. Deferred to a run with network + a key.