2.1 KiB
2.1 KiB
Plan: youtube-rustypipe
Ordered tasks; each names its verification (ytdy tests and/or gates in
quality/youtube-rustypipe.md).
- T1 — Extractor trait + models.
Extractor(search_videos, video, audio_stream_url, saved_playlists, playlist_videos) withVideoEntry/PlaylistEntrymodels and a typedExtractError;Clientholds aBox<dyn Extractor>. Verifies: gates "Extractor seam". - T2 — RustyPipeExtractor. rustypipe client (rustls, storage dir, timeout, retries), mp4a-preferring stream pick, cookie-txt login with cache-first order, saved playlists + bounded playlist pagination. Verifies: gates "Stream selection", "Login"; live probe.
- T3 — Client rework. Settings without
binary; init builds the extractor non-fatally; logged-in gating from the login outcome; all trait methods routed through the seam. Verifies: existing behavioral tests, rewritten against the fake. - T4 — Tests. Port every ytdy test from fake-script to FakeExtractor; add stream-preference and login-degradation tests. Verifies: ytdy suite green without network.
- T5 — Environment. Remove
yt-dlpfromdevenv.nix; trim ytdyCargo.toml(drop process/io-util, add rustypipe); root workspace dep. Verifies: gates "Environment". - T6 — Full verification + live probe. Workspace suite, clippy/fmt/markdownlint; temporary ignored probe: search, stream URL fetch, decode, download capture — removed after passing.
- T7 — Docs.
plan/summary.mdsection incl. deviations; reconcile the architecture docs. - T8 — Same-day fix: windowed fetching + stream sidecar.
YouTube caps tokenless URLs at their leading ~1 MiB (measured; offset
starts refused; upstream web-client deciphering broken; botguard
ineffective through iOS).
WindowedHttpStreamin audio-player, windowed capture downloads,yt-dlpback as a stream-URL-only sidecar with degrade-and-fallback,botguard_binpassthrough, capture deadline 30 min. Verifies: audio-player windowed tests, capture window-chaining test, ytdy sidecar tests, gates "Stream fetching"; live probe on the failing track.