Release 0.5.3: OPML orphan scan, feed error UI, small UI fixes
- Stop scanning an OPML/Patreon feed's derived rows once nobody subscribes to it; retire them (drop or orphan) the way sync_group already does when the list itself drops one. This is what let 922 defunct davewiner feeds keep scanning hourly after the OPML left config. - Repair feed XML with a bare `&`, and give a plain reason (moved web page with its new address when linked, or nothing yet for an empty body) instead of a raw parser error. - Show a failing feed's plain-English reason and next step (Unsubscribe / Use the new address) in the sidebar and on its own page, once it has been down a day. - Fix four small UI bugs: show-note links open in a new tab, video files play as video, an opened item no longer disappears from the Unread tab, and Subscribe/Unsubscribe get their own icons. - Fix Settings disappearing for non-admin accounts: it was hiding the whole modal instead of just the admin-only parts (Users, the editable schedule/quota, Save), which are the only parts the server actually refuses them. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DmQfE1eFPApnXWyPHBWqUA
This commit is contained in:
26
TODO.md
26
TODO.md
@@ -6,7 +6,7 @@ From the production log and the feeds' stored errors on 2026-09-13. The Docker l
|
||||
to 12:32 UTC, so the list comes from `feeds.last_error`: 57 of 1,059 feeds. None of it is ipx's
|
||||
User-Agent; a browser gets the same answers.
|
||||
|
||||
- [ ] **Stop scanning an OPML's feeds once nobody subscribes to it.** 55 of the 57 are feeds from
|
||||
- [x] **Stop scanning an OPML's feeds once nobody subscribes to it.** 55 of the 57 are feeds from
|
||||
`davewiner` (lists.opml.org/davefeeds.xml). The list left `config.toml` about 14 hours before this
|
||||
was written, but its 922 feeds are still in the database and still scanned every hour, with
|
||||
auto-download on: `subscriptions()` adds every derived feed, and with no parent to copy from,
|
||||
@@ -15,19 +15,19 @@ User-Agent; a browser gets the same answers.
|
||||
when the last subscriber leaves an OPML, treat its feeds the way `sync_group` treats ones the list
|
||||
dropped: remove those with nothing downloaded, mark the rest orphaned. `remove_feed` and `ipx rm`
|
||||
both leave them behind today. (`src/main.rs`, `src/web.rs`)
|
||||
- [ ] **Read feeds with a bare `&`.** kcpw has `<link>https://kcpw.org/?post_type=post&p=125715</link>`,
|
||||
- [x] **Read feeds with a bare `&`.** kcpw has `<link>https://kcpw.org/?post_type=post&p=125715</link>`,
|
||||
and both feedland feeds have the same fault. Strict XML refuses them; browsers and other readers do
|
||||
not. When `feed::parse` fails, try once more with every `&` that does not start an entity written
|
||||
as `&`. Nobody subscribes to these three now, but the next feed like them will fail the same
|
||||
way. (`src/feed.rs`)
|
||||
- [ ] **Say what came back when it is not a feed.** Thirteen errors read "not RSS (the input did not
|
||||
- [x] **Say what came back when it is not a feed.** Thirteen errors read "not RSS (the input did not
|
||||
begin with an rss tag) and not Atom (...)". Each one checked was a web page: the feed moved and its
|
||||
old URL redirects to the site, or the domain lapsed. Say "got a web page, not a feed", and when the
|
||||
page links a feed (`<link rel="alternate" type="application/rss+xml">`), name it. That link found
|
||||
the new feed for om.co, ms.now, Letters of Note, the Daily Dot, Hell Gate, The Frame Lab and
|
||||
Daily Kos. A `202` with an empty body (British Antarctic Survey) should read as "nothing yet", not
|
||||
as a parse failure. (`src/feed.rs`)
|
||||
- [ ] **Show a publisher's error in the UI.** Today a failing feed shows its raw error in red only
|
||||
- [x] **Show a publisher's error in the UI.** Today a failing feed shows its raw error in red only
|
||||
once you open it (`web/index.html:877`, `:960`); the OPML view marks a failing child "error"
|
||||
(`:988`), and the sidebar shows nothing. Mark a failing feed in the sidebar too, and say whose
|
||||
problem it is and what to do, in plain words: a 404 means the publisher took the feed down or moved
|
||||
@@ -41,9 +41,17 @@ User-Agent; a browser gets the same answers.
|
||||
gives `joanwestenberg.com/rss`, which is a 404; the feed is now `joanwestenberg.com/feed`.
|
||||
Nothing for ipx to fix; subscribe to the new URL directly.
|
||||
|
||||
The rest are the publishers' doing: 404 (24 feeds), 403 from sites that refuse anything but a
|
||||
browser (5), no longer resolving or connecting (7), and one each of 400 (an invite-only Substack),
|
||||
401 (a site gone private) and 402 (an expired rss.app trial). Once the first item lands, all of them
|
||||
but Westenberg stop being scanned.
|
||||
## Other Fixes and Features
|
||||
|
||||
After these: `cargo test`, `node tests/page-smoke.js`, `npx playwright test`.
|
||||
- [ ] Remember which feed is selected and view (all, unread, flagged, etc) user as selected between visits. If unknown default to All Subscriptions
|
||||
- [x] When clicking any link it should open in a new tab
|
||||
- [ ] In mobile (iOS) sometimes the top line items like the hamburger menu are not clickable unless you do a hard refresh
|
||||
- [x] video files play as audio files, they should play as video.
|
||||
- [ ] Move Light/Dark/Classic options to user settings. Include an Auto mode that uses system preferences for light/dark modes
|
||||
- [ ] Below Popular, have a currently listening section to show what podcasts have been started and not finnished
|
||||
- [x] Update subscribe/unsubscribe icons to be circle-minus (unsubscribe) and circle-check (subscribe)
|
||||
- [x] If I'm on the Unread tab, and I click to read an item the entry in the list will disappear. it should remain until I click to another item.
|
||||
|
||||
## Directory Overhaul
|
||||
|
||||
- [ ] Directory needs to be more functional, with categories and a more interesting layout. use /frontend-design to help
|
||||
|
||||
Reference in New Issue
Block a user