diff options
| author | Claude <noreply@anthropic.com> | 2026-09-21 18:24:16 +0000 |
|---|---|---|
| committer | Claude <noreply@anthropic.com> | 2026-09-21 18:24:16 +0000 |
| commit | cabe26374ef047c93bcebed83d70923631910fc0 (patch) | |
| tree | 4fa05d7a94870ae579c27bda1d2266097ed31150 /.coverage-baseline | |
| parent | 3eb15dbd84da689943f54d48a4d4974aa3d7f017 (diff) | |
Actually resolve shared links, and guard against dead code
Bug report from the phone: pasting a link produced "Could not parse feed:
Unexpected <! (position:START_DOCUMENT...)" -- the XML parser meeting
<!DOCTYPE html>. The cause was mine. SubscriptionResolver.findFeedLink and
applePodcastId were written, unit-tested, documented as how the share sheet
would work, and had zero call sites. The raw URL went straight to the parser.
FeedResolver now does what I said the app already did: a direct feed resolves
to itself, a show's web page resolves through its link rel=alternate, an Apple
Podcasts link goes through the iTunes lookup, and a YouTube channel or
playlist uses YouTube's own RSS endpoint. Both entry points -- the in-app add
box and the share sheet -- go through it, so they cannot drift apart again.
Verified on-device against real sites: thisamericanlife.org resolved to
/podcast/rss.xml, a direct megaphone feed passed through unchanged, and a
YouTube handle failed with an explanation rather than opaquely.
Errors are now written for a person. "Unexpected <!" told the user nothing;
"That's a web page, not a podcast feed, and it doesn't link to one" tells them
what to do. A test asserts parser internals never reach the UI.
Fixing the class, not just the instance:
- A reachability test fails when a helper object's function has no production
caller. Its first version passed on the very code it was written to catch,
because a bare name also matches a KDoc cross-reference -- it now requires a
call-shaped match. Verified by reintroducing the original bug and watching
it fail.
- That audit found a real functional gap, not just unused code:
QueueRepository.advance had no caller, so an episode ending never advanced
the queue. Playback now marks the episode played, advances, and starts the
next one.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
Diffstat (limited to '.coverage-baseline')
| -rw-r--r-- | .coverage-baseline | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/.coverage-baseline b/.coverage-baseline index 65bf252..93f570e 100644 --- a/.coverage-baseline +++ b/.coverage-baseline @@ -1 +1 @@ -70.75 +71.77 |
