Show poster thumbnails in the detail panes

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-20 21:47:50 +02:00
co-authored by Claude Sonnet 5.5
parent ff204655d3
commit a4303ed3ca
15 changed files with 724 additions and 22 deletions
+11 -8
View File
@@ -47,6 +47,7 @@ type libItem struct {
status string
size string
details string
cover coverRef
movie *radarr.Movie
series *sonarr.Series
// File properties for the attribute filter. For series they are fetched on
@@ -199,7 +200,7 @@ type libraryView struct {
root *tview.Flex
header *tview.TextView
input *tview.InputField
details *tview.TextView
details *detailPane
panes [2]*libPane
// UI-goroutine state.
@@ -225,11 +226,10 @@ func newLibraryView(app *App, r *radarr.Client, s *sonarr.Client) *libraryView {
app: app, radarr: r, sonarr: s,
header: tview.NewTextView().SetDynamicColors(true),
input: tview.NewInputField().SetLabel("Filter Movies: ").SetFieldWidth(0),
details: tview.NewTextView().SetDynamicColors(true).SetWordWrap(true),
details: newDetailPane(app),
seriesFiles: map[int]seriesFiles{},
}
v.details.SetBorder(true).SetTitle(" Details ")
lists := tview.NewFlex().SetDirection(tview.FlexRow) // movies above series
for _, kind := range []libKind{kindMovies, kindSeries} {
@@ -326,14 +326,18 @@ func (v *libraryView) reloadPane(p *libPane) {
var movies []radarr.Movie
if movies, err = v.radarr.Movies(ctx); err == nil {
for _, m := range movies {
items = append(items, newMovieItem(m))
it := newMovieItem(m)
it.cover = coverFor(v.radarr.Client, m.Images, true)
items = append(items, it)
}
}
} else {
var series []sonarr.Series
if series, err = v.sonarr.Series(ctx); err == nil {
for _, s := range series {
items = append(items, v.withCachedFiles(newSeriesItem(s)))
it := newSeriesItem(s)
it.cover = coverFor(v.sonarr.Client, s.Images, true)
items = append(items, v.withCachedFiles(it))
}
}
}
@@ -423,11 +427,10 @@ func (v *libraryView) renderPane(p *libPane) {
func (v *libraryView) renderDetails() {
if it, ok := v.selected(); ok {
v.details.SetText(it.details)
v.details.ScrollToBeginning()
v.details.Show(it.details, it.cover)
return
}
v.details.SetText("")
v.details.Clear()
}
// open starts the interactive search (movie) or the episode drill-down (series).