42 lines
2.4 KiB
Markdown
42 lines
2.4 KiB
Markdown
# Task plan — audiobookshelf provider
|
|
|
|
Ordered, verifiable tasks to build `absdy` per
|
|
architecture/audiobookshelf-provider.md, satisfying
|
|
quality/audiobookshelf-provider.md. All complete.
|
|
|
|
- [x] **T1 — Crate skeleton.** New workspace member `absdy`
|
|
(`Cargo.toml` mirroring `fyyd`); add to root `members` and
|
|
`workspace.dependencies`. *Verify: `cargo build -p absdy`.*
|
|
- [x] **T2 — HTTP seam (`api.rs`).** `Abs` trait
|
|
(`libraries`/`library_items`/`search_items`/`item_detail`/`stream_url`),
|
|
domain types (`Library`/`Book`/`AudioTrack`/`BookDetail`), typed
|
|
`FetchError`, and `AbsApi` (bearer auth, per-call timeout, redacting
|
|
`Debug`, defensive DTOs). *Gates: G2, G3, G5, G6, G12.*
|
|
- [x] **T3 — Path model.** `AbsPath` enum + total `parse_path` with the
|
|
reserved-`search` split. *Gate: G7. Tests:
|
|
`foreign_and_malformed_paths_are_rejected`.*
|
|
- [x] **T4 — Settings + init.** `Settings` (required `base_url`/`api_key`,
|
|
bounds), redacting `Debug`, non-fatal `init`. *Gates: G1, G14, G16. Tests:
|
|
`settings_*`, `init_requires_base_url_and_api_key`.*
|
|
- [x] **T5 — Tree builders.** `get_lib_root` placeholder + async
|
|
`get_lib_node` (root→book libraries, library→search+books, book→tracks,
|
|
search node/term), the shared book-listing/book-node builders, and the
|
|
central download blessing. *Gates: G8, G9, G10, G13. Tests:
|
|
`root_lists_*`, `a_library_lists_*`, `a_book_lists_*`, `an_audio_less_*`.*
|
|
- [x] **T6 — Search-term store.** Per-library in-memory terms;
|
|
`create`/`rename`/`delete` idempotent + implicit recreation. *Gate: G11.
|
|
Tests: `search_terms_*`.*
|
|
- [x] **T7 — Playback.** `is_track_path`, `get_urls_for_track` (URL built,
|
|
no call), `get_metadata_for_track` (pick by ino). *Gates: G12, G13. Tests:
|
|
`track_stream_url_*`, `track_metadata_*`.*
|
|
- [x] **T8 — Orchestrator + settings wiring.** `abs_client` field,
|
|
`abs_owns`/`abs_provider`, build block, root child, all dispatch arms;
|
|
`ALL_PROVIDERS`/`ProviderToggles`/`all`/`provider_toggles`. *Gate: G15.
|
|
Verify: `cargo build -p crabidy-server`, existing server tests pass.*
|
|
- [x] **T9 — Unit tests + gates.** `absdy/src/tests.rs` (FakeApi seam),
|
|
`quality/audiobookshelf-provider.md`. *Verify: `cargo test -p absdy`.*
|
|
- [x] **T10 — Live validation.** `absdy/tests/live.rs` (`#[ignore]`);
|
|
ran against the test server. *Gate: G17.*
|
|
- [x] **T11 — Docs.** README `/abs` section (`abs.toml`, `[audio]`-style
|
|
config). *Verify: markdownlint.*
|