From 0a0c35c53102bfbac427a72d22cd884bffe4ba79 Mon Sep 17 00:00:00 2001 From: Test User Date: Thu, 23 Jul 2026 17:35:18 +0200 Subject: [PATCH] fyyd: mark live API validation done Hit all four api.fyyd.de endpoints directly; every field the FyydApi DTOs read matches (data envelope, podcast id/title, /podcast/episodes as one object with title+episodes[], episode id/title/enclosure/duration/ podcast_id). No DTO change needed. A manual audio + W-capture smoke test on the running server stays open. Co-Authored-By: Claude Opus 4.8 (1M context) --- plan/fyyd-provider.md | 7 ++++--- plan/summary.md | 13 ++++++++----- quality/fyyd-provider.md | 20 +++++++++++++------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/plan/fyyd-provider.md b/plan/fyyd-provider.md index e80f202..e47405f 100644 --- a/plan/fyyd-provider.md +++ b/plan/fyyd-provider.md @@ -34,6 +34,7 @@ by dependency; each task names how it is verified. `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. -- [ ] **Live validation** (deferred, needs network): confirm the real - `api.fyyd.de` field shapes against `fyyd/src/api.rs` DTOs — see the - open gate in `quality/fyyd-provider.md`. +- [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`. diff --git a/plan/summary.md b/plan/summary.md index aa90410..2aefdc5 100644 --- a/plan/summary.md +++ b/plan/summary.md @@ -988,11 +988,14 @@ Where the implementation shaped decisions beyond the plan: timeout-bounded and every listing capped (`search_results`, `hot_count`, `episodes_per_podcast`). -Deferred: **live validation** against the real `api.fyyd.de` (field -names/envelope were taken from the current public docs, not exercised on -the network). Left as an open gate in `quality/fyyd-provider.md` and a -`- [ ]` in `plan/fyyd-provider.md`; if a field differs the fix is -confined to the `FyydApi` DTOs. +**Live validation done (2026-07-23).** All four `api.fyyd.de` endpoints +were hit directly and match the `FyydApi` DTOs exactly (the `data` +envelope; numeric podcast `id`+`title`; `/podcast/episodes` as a single +object with `title`+`episodes[]`; episode `id`/`title`/`enclosure`/ +`duration`/`podcast_id`). No DTO change was needed. Remaining open: a +manual audio-playthrough + `W`-capture smoke test on the running server +(enclosures are plain media URLs, some via podtrac redirects, which both +the resolve path and the capture reqwest client follow). Verification: `fyyd` 10 tests + `crabidy-server` 74 lib + 4 integration green; clippy and rustfmt clean on both crates. diff --git a/quality/fyyd-provider.md b/quality/fyyd-provider.md index ed76243..a7906f0 100644 --- a/quality/fyyd-provider.md +++ b/quality/fyyd-provider.md @@ -61,11 +61,17 @@ in `fyyd/src/lib.rs` (provider logic against a fake `Fyyd`) and `get_lib_root` lists `fyyd` only when the client is mounted. No proto change and no new `ProviderCommand` were needed. -## Live validation (deferred, needs network) +## Live validation -- [ ] Against the real `api.fyyd.de`: a search returns podcasts, a podcast - lists episodes with non-empty `enclosure` URLs, and an enclosure plays - through the audio player. If a field name differs from the documented - shape, the fix is confined to `fyyd/src/api.rs` DTOs (design risk noted - in the architecture doc). This gate cannot run in the offline unit - suite. +- [x] Validated against the real `api.fyyd.de` on 2026-07-23. All four + endpoints match the `fyyd/src/api.rs` DTOs exactly: responses are + wrapped in `data`; a podcast carries numeric `id` + `title`; + `/podcast/episodes` returns a single object with `title` and an + `episodes` array; each episode carries `id` (int), `title`, + `enclosure` (a direct audio URL, e.g. an `.mp3`), `duration` (int + seconds), and `podcast_id` (int); `/episode?episode_id=` returns one + such object. No DTO change was needed. +- [ ] End-to-end audio playthrough of an enclosure and a `W` capture to + `/crabidy` still want a manual smoke test on the running server (the + resolve path and the capture reqwest client both follow the enclosure, + including podtrac/redirect URLs).