Skip to content

TV detail page has no visible request affordance above the fold #22

Description

@lilpercy11

Summary

On a TV detail page the Mini App shows no request affordance anywhere above the fold, so the show reads as "not requestable". Movie pages show a request button immediately. The season picker does exist, but it is appended after the cast grid and the recommendations/similar sliders, several screens down, and the request bar only appears once a season has been tapped.

The result is that requesting a TV show is undiscoverable unless you happen to scroll to the very bottom of the page. In my case this looked like a broken integration — a fair amount of time went into checking Sonarr and Seerr before the picker turned up at the bottom of the page.

Steps to reproduce

  1. Open the Mini App and go to any TV show that is not in the library (e.g. 2 Days and 1 Night, TMDB 30801).
  2. Observe the page from the top: poster, meta pills, "Not in library", streaming providers, IMDB link, overview, director/creators, cast.
  3. No request button and no season picker are visible.
  4. Scroll past the cast grid, Recommendations and Similar Titles to reach "Pick yer seasons".
  5. Tap a season — only now does the "Plunder S1" bar appear.

Expected

Some indication above the fold that the show can be requested — the picker itself near the status line, or a request bar that scrolls you to the picker, matching how movies present "Plunder It!" immediately.

Actual

Nothing requestable is visible until the bottom of the page.

Where it comes from

In web/detail.js, the shared template ends with <div id="detail-recommendations"></div><div id="detail-similar"></div>, and the TV branch then does:

} else {
  html += renderSeasonPicker(d);
  view.innerHTML = html;
  attachSeasonHandlers(d, view);
  updateTvRequestBar(d);
}

so the picker always lands after cast and both sliders. Meanwhile updateTvRequestBar() starts with:

if (selectedSeasons.size === 0) { removeRequestBar(); return; }

so there is no persistent bar for TV, unlike the movie branch which calls showRequestBar("Plunder It!") on load.

Possible fix

Inserting the picker just after the status line is a one-line change and makes it visible immediately. This is what I'm currently running locally as a patch:

const picker = renderSeasonPicker(d);
const marker = '<div id="download-progress-container"></div>';
html = html.includes(marker) ? html.replace(marker, marker + picker) : html + picker;

An alternative would be a persistent TV request bar that jumps to the picker when nothing is selected yet. Happy to open a PR if you have a preference on the approach.

Environment

  • ghcr.io/nikamura/teleseerr:latest, digest sha256:899799909db849edbcc98e78ce3a4f6548f0bd0b2701d8808a9efbc4ed812e4c (image created 2026-04-03)
  • Node v25.9.0, Docker on TrueNAS SCALE 25.10.4
  • Seerr 3.4.1, Sonarr 4.0.19, Radarr 6.4.3
  • Telegram Mini App on iOS

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions