diff options
Diffstat (limited to 'CLAUDE.md')
| -rw-r--r-- | CLAUDE.md | 33 |
1 files changed, 28 insertions, 5 deletions
@@ -104,8 +104,8 @@ claims three separate times across these repos. queue, play, variable speed, sleep timer, retention, unsubscribe, Android Auto with a browsable library and voice search. 207 unit tests plus instrumented tests covering the media browse tree. -**Phase 2 is in progress**, in three tracks. Peter deferred the audio-fingerprint skip detection -(the design plan's Tier 3); the simple skip work comes last. +**Phase 2 is complete**, in three tracks. Peter deferred the audio-fingerprint skip detection +(the design plan's Tier 3), so the simple skip work came last. - **Track 1, auto-queue rules — done.** Named, ordered, enable-able rules with conditions on show, title, duration, age and season, and actions to queue top/bottom, mark played, auto-download, or @@ -115,12 +115,23 @@ library and voice search. 207 unit tests plus instrumented tests covering the me `DripReleaser` pays it out), a released-set the show and Android Auto both list, and `FeedArchiveWalker` following RFC 5005 `prev-archive` pages to fetch a back catalogue. A drip release always enqueues and deliberately bypasses the rule engine. -- **Track 3, simple skip — not started.** Manual per-show offsets (`skipIntroMs`/`skipOutroMs` - exist on `SubscriptionEntity` and nothing reads them) and Podcasting 2.0 chapter JSON via - `EpisodeEntity.chaptersUrl`, which the parser already captures. +- **Track 3, simple skip — done.** Manual per-show intro/outro offsets through + `PlaybackProgress`, and Podcasting 2.0 chapters: `ChapterParser`, a chapter list in the player, + and opt-in skipping of breaks the publisher marked `toc: false`. Nothing is guessed from + chapter titles. + +**Tier 3 skip detection — audio fingerprinting of theme music — is still not built.** Peter +deferred it; the design plan puts it in Phase 3 and wants a desktop prototype against real +episodes before any Android code. ID3 `CHAP` frames are also not read: that means parsing ID3 +out of a possibly-partial MP3, and the JSON path covers the shows that mark chapters at all. **Known gaps in what is built** (deliberate, not forgotten): +- **Ad-chapter skipping trusts `toc: false` and nothing else.** No title matching: a show + discussing its own sponsorship deal has a chapter called "Sponsors" that is the actual + programme. It is also off by default per show, being the one part of the feature that can + remove audio nobody has heard. + - **Auto-downloads are not retried.** A rule's download that fails is left FAILED rather than requeued: retrying forever against a 404 would burn the battery, and the failed row is visible in the episode list. Retry is the manual Download button. @@ -241,6 +252,18 @@ library and voice search. 207 unit tests plus instrumented tests covering the me left off. `getForSubscription` deliberately still returns everything: feed reconciliation must see held-back episodes or it re-inserts them on every refresh. +- **A start position belongs to `setMediaItem`, not a `seekTo` after `prepare()`.** Seeking + afterwards is silently dropped across the MediaController-to-service boundary. This was found + wiring up the intro offset -- an episode set to start sixty seconds in began at zero -- and it + had been quietly breaking *every resume* since phase 1: an episode left half-heard restarted + from the top. Nothing failed, nothing logged. Verified fixed on a device: a fresh episode now + starts at the offset and a stored position resumes where it was left. + +- **Finishing an episode has to stop playback when nothing is queued.** `onFinished` used to + rely on the file having ended anyway. With an outro offset the episode is finished while audio + is still playing, so it marked the episode played and then played the credits regardless -- + the exact thing the offset exists to prevent. + - **XML comments cannot contain `--`.** The house prose style uses it constantly and it makes the manifest unparseable, with a merge error that doesn't name the line. |
