summaryrefslogtreecommitdiff
path: root/CLAUDE.md
diff options
context:
space:
mode:
Diffstat (limited to 'CLAUDE.md')
-rw-r--r--CLAUDE.md15
1 files changed, 15 insertions, 0 deletions
diff --git a/CLAUDE.md b/CLAUDE.md
index 4e266ac..0ce7d44 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -210,6 +210,21 @@ by default and correct; it is simply waiting for a publisher who marks breaks.
## Domain notes worth keeping
+- **A feed's declared duration is often wrong, and not by rounding.** Radiolab publishes Grass
+ Apes as `00:22:05`; the file ExoPlayer opens is 29:34. The seven and a half minutes between
+ them are dynamically inserted ads -- the feed states the ad-free content length and the CDN
+ stitches in the rest -- so the error is large, systematic, and worst on exactly the shows the
+ midroll detector cares about. `PositionWriter` replaces the stored value with the player's
+ once per episode, on the position tick, via the narrow `PlaybackStateDao`. Once per episode,
+ not once per tick: a lookup on every tick for the length of an episode is the per-episode
+ work the feed-scale note below warns about.
+
+- **The media notification opens the app**, via `setSessionActivity` on the session. Without it
+ the transport buttons work and tapping the body does nothing, which reads as breakage rather
+ than omission. Worth knowing for diagnosis: `dumpsys notification --noredact` shows this app's
+ notification as `importance=2`, `sound=null`, `vibrate=null`, `category=transport` -- it is a
+ control surface, and it is silent.
+
- **Playback position is the crown jewel of the data model.** It must survive process death. Save
on a timer, on pause, and on lifecycle transitions — not just on stop.
- **Never assume audio.** An enclosure carries a MIME type. Video was cut from scope, but the model