summaryrefslogtreecommitdiff
path: root/CLAUDE.md
diff options
context:
space:
mode:
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md33
1 files changed, 28 insertions, 5 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index ab38a4b..65655be 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -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.