Movies and Series: Enter adds, a no longer does

The status bar only ever named Enter, while the hint for searching
releases of a title not in the library said (a). Enter is now the one
key for adding, and the hint says Enter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 23:23:34 +02:00
co-authored by Claude Opus 5.5
parent 9b8d59bd48
commit 8775c27aab
6 changed files with 30 additions and 8 deletions
+2
View File
@@ -2,6 +2,8 @@
## Unreleased ## Unreleased
- **Enter adds** a title in Movies and Series; `a` no longer does (the status bar only ever named
Enter, and the hint for searching releases of a title not in the library now says Enter too).
- **Trending, most watched and anticipated** movies and series from Trakt: with an empty search - **Trending, most watched and anticipated** movies and series from Trakt: with an empty search
box, Movies and Series show trending now, most watched this week, anticipated, popular and (movies) box, Movies and Series show trending now, most watched this week, anticipated, popular and (movies)
the US box office, each title with its number ("1.2k watching", "on 18k lists", "$48M last the US box office, each title with its number ("1.2k watching", "on 18k lists", "$48M last
+2 -2
View File
@@ -11,7 +11,7 @@ A terminal UI to search for movies and series with [Radarr](https://radarr.video
- **Trending, most watched, anticipated**: while the search box is empty, Movies and Series show - **Trending, most watched, anticipated**: while the search box is empty, Movies and Series show
lists from [Trakt](https://trakt.tv): trending now, most watched this week, anticipated, popular, lists from [Trakt](https://trakt.tv): trending now, most watched this week, anticipated, popular,
and the US box office for movies. `[` and `]` switch lists; titles already in your library are and the US box office for movies. `[` and `]` switch lists; titles already in your library are
ticked, the others can be added right there. Needs a free Trakt client ID (see Configure). ticked, the others can be added right there (Enter). Needs a free Trakt client ID (see Configure).
- **Interactive search**: list the releases Radarr/Sonarr find (approved or rejected, with reasons), - **Interactive search**: list the releases Radarr/Sonarr find (approved or rejected, with reasons),
sort and filter them (by approval, quality, x265 / x264 / AV1, HDR, Dolby Vision, audio format, language), and grab one. Series: pick a season or a single episode first. sort and filter them (by approval, quality, x265 / x264 / AV1, HDR, Dolby Vision, audio format, language), and grab one. Series: pick a season or a single episode first.
- **Posters**: the detail panes show the poster at the top right; title, facts, path and plot - **Posters**: the detail panes show the poster at the top right; title, facts, path and plot
@@ -112,7 +112,7 @@ Keep the file private (`chmod 600`); it holds your API keys.
| `F9` | help | | `F9` | help |
| `/` | focus search box | | `/` | focus search box |
| `[`, `]`, `r` (Movies / Series, empty search) | previous / next Trakt list, reload it | | `[`, `]`, `r` (Movies / Series, empty search) | previous / next Trakt list, reload it |
| `Enter`, `a` | add selected title | | `Enter` | add selected title |
| `i` | interactive release search | | `i` | interactive release search |
| `Tab`, `f`, `F`, `/`, `t`, `s`, `d`, `i`/`Enter`, `r` (library) | movies/series list, status filter, file-property filter, text filter, monitor, search, remove, releases/episodes, reload | | `Tab`, `f`, `F`, `/`, `t`, `s`, `d`, `i`/`Enter`, `r` (library) | movies/series list, status filter, file-property filter, text filter, monitor, search, remove, releases/episodes, reload |
| `[`, `]`, `t`, `u`, `Enter`, `s` (calendar) | week back / forward, today, unmonitored, releases, search | | `[`, `]`, `t`, `u`, `Enter`, `s` (calendar) | week back / forward, today, unmonitored, releases, search |
+1 -1
View File
@@ -118,7 +118,7 @@ Keybindings (the status bar shows the ones that apply to the current view):
| `Ctrl+C` | Quit (there is no single-letter quit key, so typing never quits by accident) | | `Ctrl+C` | Quit (there is no single-letter quit key, so typing never quits by accident) |
| `Esc` | Close a dialog or a full-screen view | | `Esc` | Close a dialog or a full-screen view |
| `/` | Movies, Series, Library: focus the search / text filter | | `/` | Movies, Series, Library: focus the search / text filter |
| `Enter` / `a` | Movies, Series: add the selected result (dialog: ↑↓ move, ←→ change dropdowns) | | `Enter` | Movies, Series: add the selected result (dialog: ↑↓ move, ←→ change dropdowns) |
| `i` | Movies, Series, Library: interactive release search (series: seasons and episodes) | | `i` | Movies, Series, Library: interactive release search (series: seasons and episodes) |
| `F` | Library and release list: filter by properties (quality, codec, HDR/DV, audio, language) | | `F` | Library and release list: filter by properties (quality, codec, HDR/DV, audio, language) |
| `f` | Library: cycle the status filter; release list: hide rejected releases | | `f` | Library: cycle the status filter; release list: hide rejected releases |
+23
View File
@@ -128,3 +128,26 @@ func TestListNumbersAreRightAligned(t *testing.T) {
t.Errorf("after resize: numbers end in columns %v", e) t.Errorf("after resize: numbers end in columns %v", e)
} }
} }
func TestEnterAddsAndAIsAnOrdinaryKey(t *testing.T) {
a := newTestApp(t)
v := a.searches[0]
v.setResults([]result{movieResult{Movie: radarr.Movie{Title: "Dune", Year: 2021, TMDBID: 1}}})
// a is no longer a key of the list: it goes on to the list (which ignores it).
if got := v.list.GetInputCapture()(tcell.NewEventKey(tcell.KeyRune, 'a', 0)); got == nil {
t.Error("a is still taken by the list")
}
// The hint for releases of a title not in the library names Enter.
v.interactive(0)
if msg := plainText(a.status.GetText(false)) + toastText(a); !strings.Contains(msg, "first (Enter)") {
t.Errorf("hint: %q", msg)
}
}
func toastText(a *App) string {
var b strings.Builder
for _, t := range a.toasts {
b.WriteString(t.text)
}
return b.String()
}
+1 -1
View File
@@ -27,7 +27,7 @@ var helpSections = []helpSection{
}}, }},
{title: "Movies and Series", items: []helpItem{ {title: "Movies and Series", items: []helpItem{
{"/", "focus the search box"}, {"/", "focus the search box"},
{"Enter, a", "add the selected title (dialog: ↑↓ move, ←→ change a dropdown, Space toggles, Enter/Space opens a list)"}, {"Enter", "add the selected title (dialog: ↑↓ move, ←→ change a dropdown, Space toggles, Enter/Space opens a list)"},
{"i", "interactive release search (library titles)"}, {"i", "interactive release search (library titles)"},
{"[ ]", "with an empty search box: previous / next Trakt list (trending now, most watched this week, anticipated, popular; movies also the US box office); needs a Trakt client ID (Config view)"}, {"[ ]", "with an empty search box: previous / next Trakt list (trending now, most watched this week, anticipated, popular; movies also the US box office); needs a Trakt client ID (Config view)"},
{"r", "reload the Trakt list"}, {"r", "reload the Trakt list"},
+1 -4
View File
@@ -125,9 +125,6 @@ func newSearchView(app *App, be backend) *searchView {
v.reloadList() v.reloadList()
return nil return nil
} }
case 'a':
v.add(v.list.GetCurrentItem())
return nil
case 'i': case 'i':
v.interactive(v.list.GetCurrentItem()) v.interactive(v.list.GetCurrentItem())
return nil return nil
@@ -347,7 +344,7 @@ func (v *searchView) interactive(i int) {
} }
r := v.results[i] r := v.results[i]
if !r.inLibrary() { if !r.inLibrary() {
v.app.SetMessage(fmt.Sprintf("[yellow]Add %s to %s first (a), then search for releases", tview.Escape(r.title()), v.be.name())) v.app.SetMessage(fmt.Sprintf("[yellow]Add %s to %s first (Enter), then search for releases", tview.Escape(r.title()), v.be.name()))
return return
} }
v.be.interactive(v, r) v.be.interactive(v, r)