feat(plex): P1.5 — Plex as a nav module + integrated search + filter sidebar

Per user feedback: promote Plex from a hidden feed-Source option to a first-class
left-nav module, with its own filter sidebar and the shared top search box.

- Plex is now a nav-rail module (page='plex', gated on me.plex_enabled) — its own
  page → correct browser Back/Forward; removed the Feed Source-dropdown 'plex' hack.
- PlexSidebar.tsx: left filter column (library scope, watch-state for movies:
  all/unwatched/in_progress/watched, sort) — per-account persisted (App state).
- Header search box now also serves the Plex page (integrated search); the live
  YouTube-search escalation stays feed-only.
- PlexBrowse.tsx reworked: infinite scroll (IntersectionObserver, no 'Load more'),
  content-visibility for smoother long-list scroll, show drill-down rides history
  (useHistorySubview) so Back returns to the grid; dropped the stray 'YouTube feed'
  button on the show page.
- backend /browse gains a per-user watch-state filter (show=, movies only).
- plex i18n (navLabel + filter.*) en/hu/de.

Note: episode-title 'Episode N' on some shows (e.g. Westworld) is Plex-side
(unmatched show) — we mirror what Plex has; Match/Refresh in Plex + re-sync fixes it.
This commit is contained in:
npeter83 2026-07-05 03:29:20 +02:00
parent 62636319b1
commit 219a935121
14 changed files with 290 additions and 133 deletions

View file

@ -1,4 +1,5 @@
{
"navLabel": "Plex",
"backToFeed": "YouTube-Feed",
"backToLibrary": "Zurück zur Bibliothek",
"searchPlaceholder": "Plex durchsuchen…",
@ -6,8 +7,20 @@
"added": "Kürzlich hinzugefügt",
"title": "Titel"
},
"filter": {
"library": "Bibliothek",
"show": "Anzeige",
"showOpt": {
"all": "Alle",
"unwatched": "Ungesehen",
"in_progress": "Läuft",
"watched": "Gesehen"
},
"sort": "Sortierung"
},
"count": "{{count}} Titel",
"searchCount": "{{count}} Treffer",
"noMatches": "Keine Treffer.",
"loading": "Wird geladen…",
"empty": "Noch nichts hier. Starte eine Plex-Synchronisierung auf der Admin-Konfigurationsseite.",
"loadMore": "Mehr laden",

View file

@ -1,4 +1,5 @@
{
"navLabel": "Plex",
"backToFeed": "YouTube feed",
"backToLibrary": "Back to library",
"searchPlaceholder": "Search Plex…",
@ -6,8 +7,20 @@
"added": "Recently added",
"title": "Title"
},
"filter": {
"library": "Library",
"show": "Show",
"showOpt": {
"all": "All",
"unwatched": "Unwatched",
"in_progress": "In progress",
"watched": "Watched"
},
"sort": "Sort"
},
"count": "{{count}} titles",
"searchCount": "{{count}} matches",
"noMatches": "No matches.",
"loading": "Loading…",
"empty": "Nothing here yet. Run a Plex sync from the admin Config page.",
"loadMore": "Load more",

View file

@ -1,4 +1,5 @@
{
"navLabel": "Plex",
"backToFeed": "YouTube feed",
"backToLibrary": "Vissza a könyvtárhoz",
"searchPlaceholder": "Keresés a Plexben…",
@ -6,8 +7,20 @@
"added": "Nemrég hozzáadott",
"title": "Cím"
},
"filter": {
"library": "Könyvtár",
"show": "Megjelenítés",
"showOpt": {
"all": "Mind",
"unwatched": "Nem nézett",
"in_progress": "Folyamatban",
"watched": "Megnézett"
},
"sort": "Rendezés"
},
"count": "{{count}} cím",
"searchCount": "{{count}} találat",
"noMatches": "Nincs találat.",
"loading": "Betöltés…",
"empty": "Még nincs itt semmi. Futtass egy Plex-szinkront az admin Konfiguráció oldalról.",
"loadMore": "Több betöltése",