Skip to content

Add genebean.services.filteredPodcastFeeds module - #725

Merged
genebean merged 1 commit into
mainfrom
filtered_feed
Sep 21, 2026
Merged

genebean merged 1 commit into
mainfrom
filtered_feed

Conversation

@genebean

Copy link
Copy Markdown
Owner

Summary

  • New genebean.services.filteredPodcastFeeds module: republishes an upstream podcast RSS feed with only episodes matching a text filter (and optional since-date), so a family member's Audiobookshelf/Absorb setup can subscribe to just one arc of a show instead of the whole catalog.
  • Generator lives at pkgs/filtered-podcast-feeds as a real, lintable generator.py (packaged via writers.writePython3Bin, flake8-checked at build time), not embedded Nix-string Python.
  • Enabled on nixnuc for Fantasy Fangirls' "Everflame" arc, served at podcasts.home.technicalissues.us (DNS-01 ACME, basic auth) alongside the host's other centrally-defined nginx vhosts.
  • Uses a dedicated system user instead of DynamicUser — DynamicUser's state directory lives under /var/lib/private/<name> (0700 root:root), which nginx can never read regardless of the leaf directory's own mode. Same tradeoff already made in nixnuc/social-reader-mcp.nix.
  • ruff added to pre-commit/CI/the shared home-manager package list, since this is the first Python landing in the repo.

Test plan

  • pre-commit run --all-files clean (nixfmt, deadnix, statix, ruff-check, ruff-format)
  • nix build .#filtered-podcast-feeds succeeds, including the build-time flake8 check
  • Ran the built generator directly against the live Acast feed — correctly filtered 28 "Everflame" episodes out of the full catalog, produced well-formed XML
  • deploy-rs --dry-activate then real deploy to nixnuc — clean activation
  • Verified live from the public internet: 401 without credentials, 200 with them, valid feed XML served over the real domain/cert at https://podcasts.home.technicalissues.us/feeds/fantasy-fangirls-everflame.xml

🤖 Generated with Claude Code

Republishes an upstream podcast RSS feed with only episodes matching a
text filter, so a family member's Audiobookshelf/Absorb setup can
subscribe to just one arc of a show instead of the whole catalog.

- pkgs/filtered-podcast-feeds: the generator as a real, lintable
  generator.py, packaged via writers.writePython3Bin (flake8 at build
  time) and registered in the fleet overlay.
- modules/genebean/nixos/services/filtered-podcast-feeds.nix: the
  reusable systemd oneshot+timer service. Uses a dedicated system user
  rather than DynamicUser - DynamicUser's state dir lives under
  /var/lib/private/<name> (0700 root:root), which nginx can never read
  regardless of the leaf directory's own mode. Same tradeoff already
  made in nixnuc/social-reader-mcp.nix.
- modules/hosts/nixos/nixnuc/filtered-podcast-feeds.nix +
  nixnuc/default.nix: enables it for Fantasy Fangirls' "Everflame" arc,
  and adds the podcasts.home.technicalissues.us vhost (DNS-01 ACME,
  basic auth) alongside this host's other centrally-defined vhosts.
- filtered_podcast_feeds_basic_auth secret added to the shared
  secrets.yaml (set blind via `sops set`, never decrypted).
- ruff added to pre-commit/CI/the shared home-manager package list and
  documented in README/AGENTS.md, since this is the first Python
  landing in the repo.

Verified live against the real Acast feed and the deployed nixnuc host:
correct episode filtering, 401 without credentials, 200 with them.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: OpenAI Codex <noreply@openai.com>
@genebean
genebean enabled auto-merge September 21, 2026 03:36
@genebean
genebean merged commit 34db583 into main Sep 21, 2026
5 checks passed
@genebean
genebean deleted the filtered_feed branch September 21, 2026 03:42
genebean added a commit that referenced this pull request Sep 21, 2026
…Feeds

Fail fast at Nix eval time instead of surfacing as a per-feed "ERROR:"
line in the generator's journal output at runtime.

- since must match YYYY-MM-DD, checked via builtins.match.
- publicUrl must not end in a trailing slash, since the generator
  appends /<slug>.xml.

Suggested by a ChatGPT review of the already-merged #725.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: OpenAI Codex <noreply@openai.com>
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.

1 participant