8000 feat(feeds): a private podcast feed of a collection, from its page by adeelahmad · Pull Request #682 · adeelahmad/lense · GitHub
[go: up one dir, main page]

Skip to content

feat(feeds): a private podcast feed of a collection, from its page - #682

Merged
adeelahmad merged 1 commit into
mainfrom
claude/project-thread-xfmkzn
Oct 19, 2026
Merged

adeelahmad merged 1 commit into
mainfrom
claude/project-thread-xfmkzn

Conversation

@adeelahmad
@adeelahmad adeelahmad commented Oct 19, 2026 •
Copy link
Copy Markdown
Owner

Requested by Adeel · project thread

Description

Before: only a whole namespace could be a podcast feed, so following a hand-picked set of recordings in a podcast app wasn't possible.

After: a saved collection's page has Podcast feed, which shows your private address for it, with Copy and New address. Its episodes are the collection's assets with audio or video that you can read, with the same RSS and Apple Podcasts tags, audio and private-address rules as a namespace's feed. Everyone who may read the collection gets their own address, and it stops working when the collection is deleted or no longer shared with them. Agents get it with GET /api/v1/collections/{id}/feed or the MCP tool list_feeds with collection_id.

How: syndication.py reuses the namespace feed's tokens and RSS for a collection: for_collection makes one feed per collection and reader, and _reader checks on every request that the collection still exists, is still shared with them and that their account is live. drop_collection deletes a collection's feeds, and removing an account deletes their collections' feed addresses (auth.remove_account).

Motivation and Context

Item from the personal feature plan sheet (a collection as a podcast).

Screenshots (if appropriate):

n/a

Steps to reproduce (if appropriate):

Open a saved collection with recordings, press Podcast feed, copy the address and add it to a podcast app: the collection's recordings show up as episodes.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change; ! in the title)

Checklist:

  • The title is a Conventional Commit.
  • My code follows the code style of this project (make hooks checks it on commit).
  • I added or updated tests (tests/api/test_feeds.py, __tests__/collection-feed.test.ts).
  • My change requires documentation updates, and I have updated docs/ accordingly (docs/feeds.md, A collection's podcast feed).
  • Users need more than the title to understand it, so I wrote it under ## Unreleased in CHANGELOG.md. Written as changelog.d/collection-feed.md, per build(release): changelog fragments in changelog.d/ instead of one Unreleased section #581.

Done questions (AGENTS.md)

  • Goal: delivers what the user wanted, merged on green CI.
  • Agents: usable through the API, MCP or an assistant tool. GET /collections/{id}/feed and list_feeds with collection_id.
  • Zero setup: no new prerequisite, .env edit or manual step.
  • Fewest clicks and keystrokes. One click on the collection's page, then Copy.
  • Configurable: new settings in the web app with defaults; wizard asks only what is required. n/a: no settings.
  • Light: default install still runs on a Raspberry Pi with cloud models.
  • Private and secure: data local and encrypted, passkeys, threat model updated. The feed entry point and P-FEEDS cover collection feeds: one address per reader, listing only what that reader can read.
  • Cost: cheapest path, model calls in the activity ledger, budgets respected. n/a: no model calls.
  • User decides: consequential or new actions wait for the user; defaults unchanged. No feed exists until someone asks for one.
  • Upgrades: existing installs upgrade safely (upgrade step for stored-data changes). New optional fields on feed rows; existing feeds unchanged.
  • Honest: sources cited; labelled built, in progress or planned. README built list and docs/requirements.md name test_feeds.py.
  • Tests, docs and generated files updated (make openapi).
  • Open standards; dependencies keep Lens MIT. n/a: RSS 2.0 and the iTunes podcast tags, no new dependencies.
  • Result reported with evidence; "refine later" items written down.
  • Reuse: existing Lens code and permissive libraries reused, nothing reinvented. Reuses the namespace feed's builder and token rules.

Local CI (ci/local-ci.sh): FastAPI server passed. FastAPI embedded had 1 failure in 1,973 (test_graph_query.py::test_where_prunes_early, the 8-second query limit, which this change doesn't touch) while the container ran about three times slower than usual. The run hit its time limit before Next.js and pre-commit, so GitHub CI decides those.

🤖 Generated with Claude Code

https://claude.ai/code/session_01QFUNzy1QZy5HhKAyJxTAYJ

@adeelahmad adeelahmad self-assigned this Oct 19, 2026
@adeelahmad
adeelahmad merged commit 1255df0 into main Oct 19, 2026
13 checks passed
@adeelahmad
adeelahmad deleted the claude/project-thread-xfmkzn branch October 19, 2026 11:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

0