Skip to content

feat(seerr): request missing movies and seasons from library items#1523

Open
l3gitpanda wants to merge 4 commits into
edde746:mainfrom
l3gitpanda:feat/seerr-request-from-browse
Open

feat(seerr): request missing movies and seasons from library items#1523
l3gitpanda wants to merge 4 commits into
edde746:mainfrom
l3gitpanda:feat/seerr-request-from-browse

Conversation

@l3gitpanda

@l3gitpanda l3gitpanda commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Ideally if you can implement the idea behind this however you like I would be really happy. Makes it very easy to request based on show/movie metadata you already have. Thanks for the great work on the project though!

Motivation

My library has a lot of metadata-only placeholder entries — shows Sonarr added from earlier requests that never completed, shows missing some seasons, movies with no file behind them. The new Explore tab covers requesting new content beautifully, but when I'm already looking at one of these items in my own library there was no path to Seerr: a show with a missing season, or a season tab that just says "No episodes found", left me switching to the Jellyseerr web UI to request it.

This PR closes that gap by wiring the existing Seerr request sheet into the library surfaces, so missing seasons and movies can be requested right where you notice they're missing.

What it does

  • "Request" in the library card context menu (long-press / right-click / hold-SELECT) for movies, shows, and empty seasons — in browse, hubs, and the detail screen's more-actions menu.
  • A Request button in the "No episodes found" empty state on the detail screen — both under a season tab and in flattened episode views (there it requests the whole show).
  • Season-scoped requests: requesting from a season opens the sheet with that season preselected, via a new optional initialSeasons parameter on SeerrRequestSheet (default const [], existing callers unaffected; only seasons the sheet considers requestable get preselected).

How it works

Everything funnels through one new helper, showSeerrRequestSheetForLibraryItem: resolve the item's TMDB id with MediaServerClient.fetchExternalIds, then open the existing showSeerrRequestSheet. Seasons resolve through their show — parentId ?? grandparentId, since Plex children carry the show in parentRatingKey while Jellyfin's seasons endpoint carries SeriesId and may omit ParentId. Failures reuse the seerr.requestsLoadFailed snackbar; no new i18n keys.

Visibility is a pure predicate (isSeerrRequestVisible, unit-tested like isAdminActionAllowedForMediaItem):

  • Requires a connected Seerr with request permission for the kind, and the item's server reachable (same liveness gate as Play Version).
  • Movies: only offered when no local file is known (mediaVersions empty). Jellyfin browse listings omit MediaSources, so movie cards there fail open — the sheet still reports owned titles as available.
  • Shows: always offered; season completeness isn't knowable from listing data, and the sheet's per-season availability gating already blocks anything available or requested.
  • Seasons: only regular seasons with no episodes on the server; Specials are excluded since the sheet drops season 0.

Testing

  • dart format / flutter analyze / full flutter test clean (scripts/ci_checks.sh).
  • New unit tests for the visibility predicate (connection, permission bits, movie file gate, season/Specials gate).
  • Manually verified on Windows against Jellyfin + Jellyseerr: requests from cards, season preselection, already-requested seasons blocked with status chips, and the error paths (unreachable server, Seerr disconnected while the menu is open).

🤖 Generated with Claude Code

l3gitpanda and others added 4 commits July 10, 2026 00:09
…menu

Adds a "Request" entry to the shared library-card context menu, gated on a
connected Seerr with request permission. Plex movies only offer it when no
file is present; shows always offer it since season completeness is unknown
at card level - the request sheet's own availability gating blocks
already-available seasons. Resolves the item's TMDB id on demand via
fetchExternalIds, then opens the existing Seerr request sheet.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016oGGWGt2igPx8mn8k5dkJb
Season cards with no episodes on the server now offer Request: the handler
resolves the parent show's TMDB id and opens the request sheet with that
season preselected via a new optional initialSeasons parameter. Specials
are excluded since the sheet drops season 0.

Also hardens the menu entry from review: movies gate on version data
presence rather than backend (a Jellyfin detail fetch does carry
MediaSources), the entry hides while the item's server is unreachable
(mirroring Play Version), a Seerr disconnect between menu build and tap
surfaces an error instead of a silent no-op, and the icon matches the
maintainer's other Request affordances.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016oGGWGt2igPx8mn8k5dkJb
…son requests

The "No episodes found" empty state on the show detail screen now offers a
Seerr Request button (scoped to the selected season, or the whole show when
episodes are flattened), reusing a new shared
showSeerrRequestSheetForLibraryItem helper that the card context menu now
also routes through.

Fixes season requests on Jellyfin: the seasons endpoint may omit ParentId,
leaving the show id in grandparentId (SeriesId), so resolution now falls
back across both fields - previously every Jellyfin season request failed
with "Couldn't load request options".

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016oGGWGt2igPx8mn8k5dkJb
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