App v0.2.26 and gateway 0.1.20

Client: seek controls, Bazarr subtitle download and cast panel in the
player; MDBList ratings strip; episode and schedule detail pages; series
pace estimate; what's new panel; install-permission onboarding step;
synced per-profile preferences; Emby outage banner.

Gateway: rebuilt admin console (one fragment per page), preference
history and restore, merged Continue Watching, Emby health probe,
subtitle selection and Bazarr download, structured request logging with
per-request identity, and embedded build version.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
ponzischeme89
2026-08-06 22:33:56 +12:00
co-authored by Claude Opus 5
parent 2675e6d82b
commit 4a4df7a73c
257 changed files with 24868 additions and 3108 deletions
+32
View File
@@ -275,6 +275,38 @@ func (s *Store) LibraryGenres(
return out, rows.Err()
}
// SeriesRef is the minimum needed to link an outside catalogue's show — Sonarr's, in
// practice — to the Emby series the library holds, so a card built from that catalogue
// can open the show's own page. Year is 0 when Emby does not know it.
type SeriesRef struct {
ID string
Name string
Year int
}
// SeriesRefs lists every imported series. The catalogue is a household's, not a
// provider's: a few hundred rows of three short columns, which is why this reads them
// all rather than querying per title.
func (s *Store) SeriesRefs(ctx context.Context) ([]SeriesRef, error) {
rows, err := s.pool.Query(ctx, `
SELECT id, name, COALESCE(production_year, 0)
FROM library_items
WHERE type = 'Series'`)
if err != nil {
return nil, fmt.Errorf("store: series refs: %w", err)
}
defer rows.Close()
out := []SeriesRef{}
for rows.Next() {
var ref SeriesRef
if err := rows.Scan(&ref.ID, &ref.Name, &ref.Year); err != nil {
return nil, err
}
out = append(out, ref)
}
return out, rows.Err()
}
func lowerStrings(values []string) []string {
out := make([]string, 0, len(values))
for _, value := range values {