Skip to content

feat: rTorrent, SABnzbd, Metron, Navidrome, Jellystat, Apprise, RomM placement, Live TV provider interface - #165

Merged
snapetech merged 28 commits into
mainfrom
feat/market-research-recommendations
Oct 7, 2026
Merged

snapetech merged 28 commits into
mainfrom
feat/market-research-recommendations

Conversation

@snapetech

Copy link
Copy Markdown
Collaborator

Summary

Builds the approved items from the market-research recommendations (#2-#5, #8-#15) plus the SeerrNG side of #6 (ROMarrNG RomM placement). Full list and rationale: docs/maintainers/market-research-2026-10-06.md.

  • rTorrent and SABnzbd live download progress (generalized the live-progress key space to cover both torrent hashes and SABnzbd queue IDs)
  • Metron as a comic search fallback when ComicVine fails
  • Navidrome as a music availability source
  • Jellystat per-title watch activity (admin-only)
  • Apprise notification agent
  • LiveTvProvider interface with Tunerr as the sole implementation (no behavior change)
  • rommPlacement display (In RomM Library badge) — requires snapetech/ROMarrNG#<branch feat/romm-library-placement> to be merged for the field to ever be populated
  • Documentation, release notes, and research-status updates throughout

Testing

  • Focused suites for every new module pass (rTorrent, SABnzbd, Metron, Navidrome, Jellystat, Apprise, Live TV provider, software placement sanitizer).
  • Full pnpm validate:development gate run against this branch merged into origin/main in a disposable worktree: Translations, Current batch contract, Shared visual standard, Formatting, Lint, Server types, Client route types, Client types, Vitest (103/103 files, 469/469 tests), and Native TypeScript (3086/3089; the 3 remaining pass 100% in isolation — confirmed load-flaky under full concurrency, matching a previously documented pattern, not a regression) all pass.
  • The Platform-aware tooling lane (packaging/release smoke tests) has pre-existing failures on this macOS/arm64 host without Docker installed (missing Docker, BSD-vs-GNU tool differences fixed where reasonable, remaining failures confirmed unrelated to any file this PR touches). This lane needs a Linux CI runner with Docker to validate fully.
  • Live round-trip verified against a disposable local ROMarrNG instance (scratch API key, scratch data dir) for the rommPlacement field end-to-end.
  • No human visual review yet of the new Services sections, settings modals, or the RomM placement badge.

AI Disclosure

This PR was built by Claude Code (Claude Sonnet 5) per the repository owner's explicit direction across this session, including the design decisions, code, tests, and verification steps described above. The repository owner reviewed and directed the work throughout and is responsible for final review before merge.

🤖 Generated with Claude Code

Keith Snape and others added 28 commits October 6, 2026 15:03
Read live progress from qBittorrent, Transmission, Deluge, and TorrentNG
and stream it to open request and media pages over SSE. A shared poller
asks only for the info hashes that connected browsers are displaying and
stops when nobody is watching. SeerrNG never writes to the clients.

Includes the NG ecosystem integration plan that tracks this work.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Index the Tunerr XMLTV guide with a streaming parser, find upcoming
airings by catalog title, and let users request one airing or a whole
series. Approval creates a Tunerr recording rule through the
authenticated deck API; a Live TV Sync job tracks rule history,
re-creates rules removed in Tunerr, and removes finished airings.

SeerrNG only schedules against Tunerr versions that report the
title_equals, start_window, and rules_only_recorder features.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add an On Live TV button and dialog to movie and series pages, a
Recordings page for requesters and managers, and a Live TV (IPTV
Tunerr) section under Settings → Services. Document setup and how
recordings are tracked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
release-note: none

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Request single tracks through the slskdN wishlist with the usual
approval rules, track them with a Soulseek Sync job, list and fix
slskdN library-health issues for an album, and identify songs with
SongID. Each slskdN feature is probed separately so plain slskd or
slskr installs report it as unavailable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Offer unmatched playlist tracks to Soulseek from the bulk request
dialog, add Track Requests and Identify a Song pages, a manager-only
Library Health dialog on album pages, and a Soulseek (slskdN) section
under Settings → Services. Document setup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Carry the *arr queue's protocol and download client through download
status so administrators can see whether a request is downloading via a
torrent client, Usenet, or a direct source such as ChaptarrNG. The
non-admin projection already drops both fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pass ROMarrNG's per-file datVerified verdict through the software asset
sanitizer and request views, and show DAT Verified (or how many files
matched) beside Download copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Let users follow teams from IPTV Tunerr's sports schedule. Live TV Sync
maps each matched upcoming game to its nearest guide airing and creates a
normal recording request, skipping games the user already requested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
release-note: none

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Build per-user swipe decks for movies, series, and books from SeerrNG's
own catalogs (TMDB recommendations and trending, Open Library subjects
and trending), skipping owned, requested, and already-swiped titles.
Record want/pass/seen swipes with undo for passes, keep per-user taste
notes and request preferences, and optionally let Claude reorder the
deck with short reasons. Ranking failures and refusals keep catalog
order. Adds @anthropic-ai/sdk 0.131.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add a swipeable card stack with pointer, button, and keyboard controls,
right-swipe requests through the normal request API, undo for passes,
per-user preferences, an admin Swipe Discovery settings section with an
AI ordering test, sidebar and mobile menu entries, and docs. Feature
ideas come from ReadMeABook's public documentation only; no code or
assets were copied (see the provenance note in the plan).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove the YunoHost sync workflow, post-commit sync hook, and release
manifest updater, and document that existing installs stay on their last
published package.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Non-admin media responses alias download IDs, so live progress now uses
opaque, user-scoped subscription tokens issued with each media response.
Administrators may still subscribe by info hash. Streams report torrents
a client stopped reporting so stale figures clear. Adds login failure
diagnostics to two flaky-prone route tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add an OpenAI-compatible provider (OpenAI, Ollama, LM Studio) that asks
for a JSON-schema reply, retries in JSON mode for servers without schema
support, and validates the ranking. Admins set the base URL and model;
the key is optional for local servers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
release-note: none

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Read torrent progress from rTorrent's XML-RPC endpoint (ruTorrent /RPC2 or
an SCGI bridge) with one d.multicall2 request per refresh covering every
subscribed hash. Basic auth reuses the username and password fields.
Tracker notices are not treated as errors.

release-note: added
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Document the rTorrent endpoint and default port for live progress, and
note that TorrentNG reports torrents for the clients it fronts so only
one connection is needed. Recommend BackIssue in the comics guide for
browser reading and shared household libraries.

release-note: docs
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Send Seerr notifications through an Apprise API server using its
stateful /notify/{key} endpoint, so destination URLs and their secrets
stay in the Apprise configuration. Administrators configure the API URL,
configuration key, optional tag, and optional Basic authentication.
The key is validated on save and test. Messages are plain text.

Adds the settings route, admin test action, and settings page. Tests
cover the endpoint, message type mapping, byte limits, and delivery
against a local server.

release-note: added
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Record the dependency inventory, alternatives catalog, fork feature
comparison, and recommendations with a per-item status table. Lists
which items are built, deferred, or still open, and what each needs.

release-note: none
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Use Metron's series search when ComicVine search throws or reports a
failed status. Only series with a ComicVine ID are returned, so results
keep the identifiers that comic requests use. Metron authenticates with
a bearer token, stored and redacted like the ComicVine key, and the
client stays under its documented burst limit. Detail pages still
require ComicVine.

release-note: added
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Read a Navidrome library on a daily scan through its Subsonic API and
mark albums with a MusicBrainz ID as available, using the same music
processing path as Lidarr. Authentication uses Subsonic token auth, so
the password is never sent. The scan stops with an error rather than
recording a partial library. Adds the settings route, a test action,
the Services section, and a user page. Disconnecting stops future scans
but does not clear albums already marked available.

release-note: added
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Connect a Jellystat server with a read-only API key. Administrators see
lifetime play counts and playback time on titles linked to a Jellyfin
item. The client sends the x-api-token header, requests a ten-year
window, and maps Postgres string counts to numbers. The settings route
keeps the saved key when the redacted placeholder is sent. Only
administrators can reach the endpoint.

release-note: added
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Read Usenet queue progress from the SABnzbd API. Live keys now cover
both torrent info hashes and SABnzbd queue IDs. The poller sends each
client only the keys it can answer for, and the live-token registry and
route accept both forms. SABnzbd reports one aggregate speed, which is
shown on the first downloading item. Post-processing states show as
checking. The API key is passed as a query parameter by SABnzbd's
design, and errors never include it.

The previous live-token test asserted that SABnzbd IDs are rejected. That
rule is superseded, so the test now checks a malformed queue ID instead.

release-note: added
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Define LiveTvProvider for the guide stream, recording rules, and sports
report that SeerrNG uses from its Live TV backend, with a factory that
returns the configured Tunerr client. Recordings, sports, guide indexing,
and the sports route depend on the interface instead of constructing
Tunerr directly. Tunerr is the only implementation, so behavior is
unchanged.

release-note: none
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Record the built items (SABnzbd, Metron, Navidrome, Jellystat, tuner
provider interface) with their commits and what each covers. Record
recommendation 6 as blocked on a maintainer decision: ROMarrNG knows
where it files downloads but not whether RomM has indexed them.

release-note: none
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Read the optional rommPlacement field from ROMarrNG request status and
show an In RomM Library badge on available requests. The service keeps
only placed, library, and layout, with the library name bounded and
stripped of control characters. The label says the file is in place, not
that RomM has indexed it. Requires a ROMarrNG build that sends
rommPlacement; without it the badge never appears.

release-note: added
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown

Hey @snapetech, thanks for submitting this PR! However, it looks like the PR template hasn't been fully filled out.

Issues found:

  • Description section is empty or only contains placeholder text.
  • How Has This Been Tested? section is empty.
  • Release Notes section is missing or empty.
  • Checklist section is missing or has been removed.
  • The contribution guidelines checkbox has not been checked.

Please update your PR description to follow the PR template.
Incomplete or missing PR descriptions may indicate insufficient review of the changes, and PRs that do not follow the template may be closed without review.
See our Contributing Guide for more details.

This check will automatically re-run when you edit your PR description.

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

@snapetech
snapetech merged commit a9dd1b5 into main Oct 7, 2026
15 of 19 checks passed
@snapetech
snapetech deleted the feat/market-research-recommendations branch October 7, 2026 12:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants