Add interactive release search (M6)
Release listing and grab in the shared arr client, a full-screen release list (sort, hide rejected, rejection reasons, confirmation before grabbing rejected releases; Usenet only), and a season/episode picker for Sonarr. Overlays are now a stack so dialogs can open above the release list. Add a fake Newznab indexer to the dev setup. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,9 @@ package ui
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/rivo/tview"
|
||||
|
||||
"git.stinnesbeck.com/nils/arr-tui/internal/arr"
|
||||
"git.stinnesbeck.com/nils/arr-tui/internal/radarr"
|
||||
@@ -41,6 +44,8 @@ type backend interface {
|
||||
search(ctx context.Context, term string) ([]result, error)
|
||||
monitorModes() []monitorMode // nil if not applicable
|
||||
add(ctx context.Context, r result, c addChoice) (id int, err error)
|
||||
// interactive starts an interactive release search for a library item.
|
||||
interactive(v *searchView, r result)
|
||||
}
|
||||
|
||||
// --- Radarr ---
|
||||
@@ -83,6 +88,13 @@ func (b radarrBackend) add(ctx context.Context, r result, c addChoice) (int, err
|
||||
return created.ID, err
|
||||
}
|
||||
|
||||
func (b radarrBackend) interactive(v *searchView, r result) {
|
||||
m := r.(movieResult)
|
||||
v.app.openReleases("Releases for "+tview.Escape(movieTitleYear(m.Movie)),
|
||||
func(ctx context.Context) ([]arr.Release, error) { return b.c.Releases(ctx, m.ID) },
|
||||
b.c.Grab)
|
||||
}
|
||||
|
||||
// --- Sonarr ---
|
||||
|
||||
type seriesResult struct{ sonarr.Series }
|
||||
@@ -133,3 +145,21 @@ func (b sonarrBackend) add(ctx context.Context, r result, c addChoice) (int, err
|
||||
})
|
||||
return created.ID, err
|
||||
}
|
||||
|
||||
func (b sonarrBackend) interactive(v *searchView, r result) {
|
||||
s := r.(seriesResult)
|
||||
v.app.SetMessage("Loading episodes…")
|
||||
go func() {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||
defer cancel()
|
||||
episodes, err := b.c.Episodes(ctx, s.ID)
|
||||
v.app.post(func() {
|
||||
if err != nil {
|
||||
v.app.SetMessage("[red]Loading episodes failed: " + tview.Escape(err.Error()))
|
||||
return
|
||||
}
|
||||
v.app.SetMessage("")
|
||||
v.app.pickSeason(b.c, s.Series, episodes)
|
||||
})
|
||||
}()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user