Skip to content

Add Seerr custom sliders and Foreseerr list compatibility - #1407

Open
selmant wants to merge 4 commits into
Moonfin-Client:mainfrom
selmant:feat/seerr-custom-sliders
Open

Add Seerr custom sliders and Foreseerr list compatibility#1407
selmant wants to merge 4 commits into
Moonfin-Client:mainfrom
selmant:feat/seerr-custom-sliders

Conversation

@selmant

@selmant selmant commented Sep 4, 2026

Copy link
Copy Markdown

Pull Request

Summary

Moonfin's current Seerr integration uses its own fixed discovery rows and does not read the custom sliders configured by a Seerr administrator. This PR adds support for those server-defined sliders in Moonfin's Discover screen and as optional Home sections.

The first commit implements the stock Seerr feature: TMDB keyword, genre, search, studio, network, and streaming-provider custom sliders. The second commit is intentionally separate and explicitly adds compatibility with Foreseerr: administrator-defined Trakt, AniList, and MDBList lists, plus enabled built-in Trakt / AniList / Simkl rows.

Maintainer Context and Disclosure

I maintain Foreseerr, a personal fork of Seerr that adds Trakt, AniList, Simkl, and MDBList discovery and media workflows. My practical motivation for this contribution is to use those discovery sources from a good TV client. I had considered building another TV application, and have also maintained a separate desktop companion, but Moonfin already provides the client experience I was looking for. Contributing the missing integration here is much more useful than duplicating another application, and may remove my need to continue those separate client efforts.

I want to be completely clear about the boundary in this PR:

  • Custom TMDB slider types 13–21 and GET /settings/discover are stock Seerr functionality.
  • Trakt / AniList / MDBList list types (24, 31, 35) and Foreseerr's built-in Trakt, AniList, and Simkl rows do not exist in stock Seerr.
  • The Foreseerr support is not intended to be presented as upstream Seerr behavior or slipped into Moonfin implicitly. It is isolated in its own commit so it can be reviewed, changed, or omitted independently.
  • Foreseerr currently continues Seerr's DiscoverSliderType enum from 22. This client skips unknown types, so a later upstream Seerr type in that range would be ignored here rather than mixed with Trakt/AniList. If that numbering is a concern, I can migrate Foreseerr's extra types to a reserved band (starting at 1001) in a Foreseerr patch release and update this mapping to match.

I used AI tooling to assist with implementation and review. I personally reviewed every changed file and the final diff, verified the API routes against the relevant Seerr and Foreseerr sources, and ran the tests and analysis documented below. I am happy to answer questions, revise the approach, or help maintain this integration if the Moonfin maintainers have concerns.

Related Issues

  • None

Type of Change

  • Bug fix
  • New feature
  • Refactor
  • Performance improvement
  • UI/UX update
  • Documentation update
  • Build/CI change
  • Other (describe):

Changes Made

  • Read enabled custom sliders from GET /settings/discover, preserve server ordering, and map stock Seerr slider types 13–21 to their documented search/discover routes.
  • Append those sliders after Moonfin's built-in Discover rows and expose them as disabled-by-default Home sections whose enabled state and order persist with the existing Home layout settings.
  • Add explicitly scoped Foreseerr compatibility in a separate commit: admin Trakt / AniList / MDBList lists, enabled built-in Trakt recommendations/watchlist/history, AniList browse and user lists, and Simkl trending/library rows.
  • Rewrite list-tile ids to TMDB when mapped; omit unmapped, ambiguous, and pending tiles so they cannot open /movie/{traktId}.
  • Localize built-in Foreseerr row titles from English app_en.arb keys. Admin-chosen list titles are kept as-is.
  • Skip Moonfin-local stock builtins (types 1–12), retired Simkl Best/Premieres types, disabled, malformed, unknown, empty, or failed sliders without disturbing the existing local rows.
  • Stock Seerr never returns the Foreseerr-only types, so it never receives those endpoints.

API Compatibility

  • Stock Seerr's OpenAPI documents /settings/discover, /search, and the movie/TV discover routes and query parameters used here.
  • Moonfin uses Moonbase's existing catch-all /Moonfin/Seerr/Api/{path} proxy; no generated OpenAPI client, plugin route, or API schema change is required.
  • Stock Seerr does not define or return Foreseerr list or built-in provider types, so a stock server never receives a request for a Foreseerr-only endpoint.
  • Foreseerr currently continues Seerr's DiscoverSliderType enum from 22. This client skips unknown types, so if upstream Seerr later adds a type in that range it would be ignored here rather than colliding at runtime. If that numbering is a concern, I can migrate Foreseerr's extra types to a reserved band (starting at 1001) in a Foreseerr patch release and update this mapping to match.

Commit Structure

  1. feat(seerr): add custom slider rows — stock Seerr types 13–21, API access, Discover/Home integration, settings, and tests.
  2. feat(foreseerr): support list sliders and built-in Trakt, AniList, and Simkl rows — Foreseerr-only types, payload normalization, English title keys, and tests.

Platform

  • Android
  • iOS
  • tvOS
  • Web
  • macOS
  • Windows
  • Linux
  • All / Shared code

Testing

  • Tested on emulator / simulator
  • Tested on physical device
  • Manual testing completed on Linux desktop
  • Not tested (explain why):

Automated Checks

  • Focused Seerr/Foreseerr catalog tests passed.
  • dart analyze on the changed feature and test files: no issues found.
  • Manually tested in the Linux desktop client.

Test Steps

  1. Configure stock Seerr custom TMDB keyword, genre, search, studio, network, and streaming-provider sliders and confirm they appear after Moonfin's built-in Discover rows.
  2. Enable selected custom sliders under Home section settings, reorder them, restart Moonfin, and confirm their state and order persist.
  3. With Foreseerr, enable Trakt / AniList / Simkl built-in rows and admin list sliders. Confirm mapped items open the correct TMDB detail and show posters from posterPath.
  4. Confirm unmapped external items, unknown slider types, and retired Simkl premiere types are omitted without failing the rest of Discover or Home.

Screenshots (if applicable)

screenshot-2026-09-04_22-05-07

Checklist

  • Code builds successfully
  • Code follows project style and conventions
  • No unnecessary commented-out code
  • No new warnings introduced

@selmant
selmant force-pushed the feat/seerr-custom-sliders branch 2 times, most recently from 6e318b6 to 910710a Compare September 4, 2026 21:21
@selmant
selmant marked this pull request as draft September 4, 2026 21:29
…d Simkl rows

Map Foreseerr Discover types that stock Seerr does not have. Unmapped
tiles are omitted. English title keys are the Weblate source.

Co-authored-by: Cursor <cursoragent@cursor.com>
@selmant
selmant force-pushed the feat/seerr-custom-sliders branch from 5af9315 to bbd6344 Compare September 4, 2026 21:38
@selmant

selmant commented Sep 4, 2026

Copy link
Copy Markdown
Author

If there is concern about numeric collision between Foreseerr's extra Discover slider types (currently 22+) and any types upstream Seerr might add later: I can migrate those Foreseerr types to a reserved band (starting at 1001) in a Foreseerr patch release, then update this mapping to match.

Today this client skips unknown types, so a later Seerr type in the 22+ range would be ignored here rather than mixed with Trakt/AniList/Simkl. Happy to move the numbers if a reserved range is preferred.

applyRowConfig was dropping custom rows and fetching them again whenever UserPreferences notified, which raced index-based fills and threw RangeError.

Co-authored-by: Cursor <cursoragent@cursor.com>
@selmant
selmant marked this pull request as ready for review September 5, 2026 09:55
… PR.

Those locales still get the new Foreseerr row keys; existing translations stay as they were on main.

Co-authored-by: Cursor <cursoragent@cursor.com>
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.

1 participant