# Plan — fyyd podcast provider From `architecture/fyyd-provider.md` and `quality/fyyd-provider.md`. Ordered by dependency; each task names how it is verified. - [x] **HTTP seam** (`fyyd/src/api.rs`): `Fyyd` trait (`search_podcasts`, `hot_podcasts`, `podcast_episodes`, `episode`), domain `Podcast`/`Episode`, typed `FetchError`, and the `reqwest` `FyydApi` (envelope unwrap, defensive DTOs, per-call timeout, artist backfill via a `/podcast` lookup). Verify: it compiles; used by the provider tests via a fake. - [x] **Crate skeleton** (`fyyd/Cargo.toml`, workspace `members` + dep): new `fyyd` crate depending on `crabidy-core`, `reqwest`, `serde`, `thiserror`, `tokio`, `toml`, `tracing`, `async-trait`. Verify: `cargo build -p fyyd`. - [x] **Path model** (`fyyd/src/lib.rs`): `FyydPath` enum + `parse_path` covering root/search/term/podcast/episode and hot/podcast/episode; empty segments rejected. Verify: `foreign_and_malformed_paths_are_rejected`. - [x] **Provider core** (`fyyd/src/lib.rs`): `Client` (`Box` + settings + in-memory search terms), `Settings` (`fyyd.toml`), the `ProviderClient` impl (root, node dispatch, podcast/episode builders, stream + metadata resolution, create/rename/delete of terms, central download blessing). Verify: the 10 unit tests in `fyyd/src/lib.rs`. - [x] **Settings registration** (`crabidy-server/src/settings.rs`): add `fyyd` to `ALL_PROVIDERS`, `ProviderToggles`, `all()`, and `provider_toggles()`. Verify: existing settings tests (they iterate `ALL_PROVIDERS`); `cargo test -p crabidy-server`. - [x] **Orchestrator wiring** (`crabidy-server/src/provider.rs`): `fyyd_client` field, `fyyd_owns`/`fyyd_provider`, non-fatal `build()` block reading `fyyd.toml`, `get_lib_root` child, and a routing arm in each of the eight `ProviderClient` methods. Verify: `cargo build`, full server suite green. - [x] **Gates**: `cargo test -p fyyd -p crabidy-server`, `cargo clippy`, `cargo fmt --check` all clean; check off `quality/fyyd-provider.md`. - [x] **Docs**: architecture + quality + plan committed; user docs (`docs/src/`, README provider list) updated. - [x] **Live validation**: confirmed the real `api.fyyd.de` field shapes against `fyyd/src/api.rs` DTOs (2026-07-23) — all four endpoints match, no DTO change needed. A manual audio/`W`-capture smoke test on the running server remains open in `quality/fyyd-provider.md`.