2026-07-05 02:32:00 +02:00
{
2026-07-05 03:29:20 +02:00
"navLabel" : "Plex" ,
2026-07-05 02:32:00 +02:00
"backToFeed" : "YouTube-Feed" ,
"backToLibrary" : "Zurück zur Bibliothek" ,
"searchPlaceholder" : "Plex durchsuchen…" ,
"sort" : {
"added" : "Kürzlich hinzugefügt" ,
feat(plex): expanded metadata filters, clickable info page, image disk cache
Backend (migration 0045_plex_filter_meta): plex_items gains rating (audienceRating
~IMDb), content_rating, studio, originally_available_at, and GIN-indexed genres /
directors / cast_names — all mirrored from the cheap section listing (no per-item API
calls; they also seed a future watch-habit recommender). /browse gains genre / content-
rating / year / rating / duration / added-within / director / actor / studio filters
(@> containment, GIN) + sort by year|rating|duration|release; new /facets endpoint
returns available genres+ratings (with counts) and the year/rating/duration bounds. A
thin on-disk image cache (.plex-img-cache) serves posters/art/cast photos from local
disk after first fetch (~7-14x faster repeat loads).
Frontend: PlexSidebar grows the full filter set (facet-driven genre/age chips, rating
steps, year range inputs, duration buckets, added-within, active people/studio chips,
clear-all); filters persist per-account as one JSON blob. PlexInfo metadata (year,
genre, director, cast, studio, IMDb score) is clickable → sets the matching filter and
returns to the filtered grid (page variant only; the in-player overlay stays read-only
so a stray click can't stop playback). i18n en/hu/de.
2026-07-05 23:45:55 +02:00
"title" : "Titel" ,
"year" : "Jahr" ,
"rating" : "IMDb-Wertung" ,
"duration" : "Länge" ,
"release" : "Erscheinungsdatum"
2026-07-05 02:32:00 +02:00
} ,
2026-07-05 03:29:20 +02:00
"filter" : {
"library" : "Bibliothek" ,
"show" : "Anzeige" ,
"showOpt" : {
"all" : "Alle" ,
"unwatched" : "Ungesehen" ,
"in_progress" : "Läuft" ,
"watched" : "Gesehen"
} ,
feat(plex): expanded metadata filters, clickable info page, image disk cache
Backend (migration 0045_plex_filter_meta): plex_items gains rating (audienceRating
~IMDb), content_rating, studio, originally_available_at, and GIN-indexed genres /
directors / cast_names — all mirrored from the cheap section listing (no per-item API
calls; they also seed a future watch-habit recommender). /browse gains genre / content-
rating / year / rating / duration / added-within / director / actor / studio filters
(@> containment, GIN) + sort by year|rating|duration|release; new /facets endpoint
returns available genres+ratings (with counts) and the year/rating/duration bounds. A
thin on-disk image cache (.plex-img-cache) serves posters/art/cast photos from local
disk after first fetch (~7-14x faster repeat loads).
Frontend: PlexSidebar grows the full filter set (facet-driven genre/age chips, rating
steps, year range inputs, duration buckets, added-within, active people/studio chips,
clear-all); filters persist per-account as one JSON blob. PlexInfo metadata (year,
genre, director, cast, studio, IMDb score) is clickable → sets the matching filter and
returns to the filtered grid (page variant only; the in-player overlay stays read-only
so a stray click can't stop playback). i18n en/hu/de.
2026-07-05 23:45:55 +02:00
"sort" : "Sortierung" ,
"clearAll" : "Filter zurücksetzen" ,
"active" : "Aktiv" ,
"any" : "Alle" ,
"rating" : "IMDb-Wertung" ,
"genre" : "Genre" ,
"year" : "Jahr" ,
"duration" : "Länge" ,
"durationOpt" : { "short" : "Unter 90 Min." , "mid" : "90– 120 Min." , "long" : "Über 2 Std." } ,
"added" : "Zu Plex hinzugefügt" ,
"addedOpt" : { "24h" : "24 Std." , "1w" : "1 Woche" , "1m" : "1 Monat" , "6m" : "6 Monate" , "1y" : "1 Jahr" } ,
2026-07-06 00:15:31 +02:00
"contentRating" : "Altersfreigabe" ,
"match" : { "any" : "Beliebig" , "all" : "Alle" } ,
2026-07-06 02:25:48 +02:00
"dir" : { "desc" : "↓ Absteigend" , "asc" : "↑ Aufsteigend" } ,
"collection" : "Sammlung" ,
"collectionSearch" : "Sammlungen suchen…" ,
"collectionEmpty" : "Keine Sammlungen"
2026-07-05 03:29:20 +02:00
} ,
2026-07-05 02:32:00 +02:00
"count" : "{{count}} Titel" ,
"searchCount" : "{{count}} Treffer" ,
2026-07-05 03:29:20 +02:00
"noMatches" : "Keine Treffer." ,
2026-07-05 02:32:00 +02:00
"loading" : "Wird geladen…" ,
"empty" : "Noch nichts hier. Starte eine Plex-Synchronisierung auf der Admin-Konfigurationsseite." ,
"loadMore" : "Mehr laden" ,
"watched" : "Angesehen" ,
2026-07-05 05:26:16 +02:00
"play" : "Abspielen" ,
"resume" : "Fortsetzen" ,
"openShow" : "Serie öffnen" ,
"markWatched" : "Als gesehen markieren" ,
"markUnwatched" : "Als ungesehen markieren" ,
2026-07-05 02:32:00 +02:00
"seasons" : "{{count}} Staffeln" ,
"playerSoon" : "Player kommt bald — „{{title}}“" ,
2026-07-06 00:56:01 +02:00
"people" : {
"match" : "Personen" ,
"actor" : "Schauspieler" ,
"director" : "Regie" ,
"count" : "{{count}} Titel" ,
"added" : "hinzugefügt"
} ,
feat(plex): P2 player — rich full-page HLS/direct player + watch-state
- backend: GET /api/plex/item/{rk} detail (metadata, cast + intro/credit markers
from Plex, episode prev/next, per-user resume+status); POST /item/{rk}/progress
(resume checkpoint, near-end→watched) + /state (new|watched|hidden).
- frontend PlexPlayer.tsx (lazy, pulls hls.js): full-page player over the Plex
module. Direct files stream raw <video>; remux via hls.js on the seek-restart
session — custom controls map the ABSOLUTE timeline over the session offset, and a
seek beyond the loaded region restarts the session at the target. Play/pause/resume
/restart, ±10s seek, prev/next episode (Shift+←/→), volume, windowed/fullscreen,
full keyboard, Skip intro/Skip credits from markers (shaded on the seekbar),
auto-advance + watched-on-end, resume from saved position, 10s progress checkpoints.
- PlexBrowse: card/episode click opens the player as a history subview (browser Back
returns to the grid/show). api client (plexItem/plexSession/plexProgress/plexSetState)
+ types; plex.player.* i18n en/hu/de. hls.js@^1.6.16.
- Verified over HTTP: detail w/ markers+cast+episode-nav, progress persist. Video
playback itself is pending browser UAT. Subtitle/audio track SELECTION deferred.
2026-07-05 04:28:00 +02:00
"player" : {
"loading" : "Wird geladen…" ,
"back" : "Zurück" ,
"skipIntro" : "Intro überspringen" ,
"skipCredits" : "Abspann überspringen" ,
"playPause" : "Wiedergabe / Pause (Leertaste)" ,
"restart" : "Von vorn beginnen" ,
"prev" : "Vorherige Folge" ,
"next" : "Nächste Folge" ,
"mute" : "Stumm (m)" ,
2026-07-05 05:26:16 +02:00
"fullscreen" : "Vollbild (f)" ,
2026-07-05 06:08:44 +02:00
"download" : "Originaldatei herunterladen" ,
"tracks" : "Audio & Untertitel" ,
"audio" : "Audio" ,
"subtitles" : "Untertitel" ,
2026-07-05 06:58:34 +02:00
"subOff" : "Aus" ,
"errNotFound" : "Diese Datei kann nicht abgespielt werden — die Medien sind auf dem Server nicht erreichbar (die Plex-Medieneinbindung fehlt oder die Pfadzuordnung ist falsch). Bitte den Administrator, die Plex-Konfiguration zu prüfen." ,
"errTranscode" : "Das Format dieser Datei erfordert eine Transkodierung, die noch nicht unterstützt wird." ,
2026-07-05 21:27:02 +02:00
"errGeneric" : "Die Wiedergabe konnte nicht gestartet werden. Bitte erneut versuchen." ,
"stop" : "Stopp" ,
"help" : "Tastenkürzel" ,
feat(plex): rich media info — info page, in-player info overlay, IMDb + cast photos
Backend (no migration): item_detail now also returns IMDb score + id/url (from the
Plex Rating/Guid arrays), content rating, genres, director(s), studio, tagline, and
cast as {name, role, photo}. New host-whitelisted /person-image proxy serves cast
photos from Plex's public metadata CDN (keeps third-party requests off the browser).
Frontend: reusable PlexInfo component in two forms — a full info page opened from a
card's 'i' button (history subview, art backdrop, Play/Resume + watch controls) and a
lean overlay in the player toggled with 'I' (video keeps playing). Two per-user view
prefs (faint backdrop, cast row) persisted in preferences. Mark-unwatched / clear-resume
cover the watched-reset gap. i18n en/hu/de.
2026-07-05 22:57:18 +02:00
"infoBtn" : "Medieninfo" ,
2026-07-05 21:27:02 +02:00
"keys" : {
"playPause" : "Wiedergabe / Pause" ,
"seek" : "10 Sekunden spulen" ,
"episode" : "Vorherige / nächste Folge" ,
"volume" : "Lautstärke lauter / leiser" ,
"mute" : "Stumm" ,
"fullscreen" : "Vollbild" ,
feat(plex): rich media info — info page, in-player info overlay, IMDb + cast photos
Backend (no migration): item_detail now also returns IMDb score + id/url (from the
Plex Rating/Guid arrays), content rating, genres, director(s), studio, tagline, and
cast as {name, role, photo}. New host-whitelisted /person-image proxy serves cast
photos from Plex's public metadata CDN (keeps third-party requests off the browser).
Frontend: reusable PlexInfo component in two forms — a full info page opened from a
card's 'i' button (history subview, art backdrop, Play/Resume + watch controls) and a
lean overlay in the player toggled with 'I' (video keeps playing). Two per-user view
prefs (faint backdrop, cast row) persisted in preferences. Mark-unwatched / clear-resume
cover the watched-reset gap. i18n en/hu/de.
2026-07-05 22:57:18 +02:00
"info" : "Medieninfo" ,
2026-07-05 21:27:02 +02:00
"back" : "Stopp & zurück zum Feed" ,
"help" : "Diese Hilfe anzeigen"
}
feat(plex): P2 player — rich full-page HLS/direct player + watch-state
- backend: GET /api/plex/item/{rk} detail (metadata, cast + intro/credit markers
from Plex, episode prev/next, per-user resume+status); POST /item/{rk}/progress
(resume checkpoint, near-end→watched) + /state (new|watched|hidden).
- frontend PlexPlayer.tsx (lazy, pulls hls.js): full-page player over the Plex
module. Direct files stream raw <video>; remux via hls.js on the seek-restart
session — custom controls map the ABSOLUTE timeline over the session offset, and a
seek beyond the loaded region restarts the session at the target. Play/pause/resume
/restart, ±10s seek, prev/next episode (Shift+←/→), volume, windowed/fullscreen,
full keyboard, Skip intro/Skip credits from markers (shaded on the seekbar),
auto-advance + watched-on-end, resume from saved position, 10s progress checkpoints.
- PlexBrowse: card/episode click opens the player as a history subview (browser Back
returns to the grid/show). api client (plexItem/plexSession/plexProgress/plexSetState)
+ types; plex.player.* i18n en/hu/de. hls.js@^1.6.16.
- Verified over HTTP: detail w/ markers+cast+episode-nav, progress persist. Video
playback itself is pending browser UAT. Subtitle/audio track SELECTION deferred.
2026-07-05 04:28:00 +02:00
} ,
feat(plex): rich media info — info page, in-player info overlay, IMDb + cast photos
Backend (no migration): item_detail now also returns IMDb score + id/url (from the
Plex Rating/Guid arrays), content rating, genres, director(s), studio, tagline, and
cast as {name, role, photo}. New host-whitelisted /person-image proxy serves cast
photos from Plex's public metadata CDN (keeps third-party requests off the browser).
Frontend: reusable PlexInfo component in two forms — a full info page opened from a
card's 'i' button (history subview, art backdrop, Play/Resume + watch controls) and a
lean overlay in the player toggled with 'I' (video keeps playing). Two per-user view
prefs (faint backdrop, cast row) persisted in preferences. Mark-unwatched / clear-resume
cover the watched-reset gap. i18n en/hu/de.
2026-07-05 22:57:18 +02:00
"info" : {
"title" : "Medieninfo" ,
"customize" : "Ansicht anpassen" ,
"prefArtBg" : "Dezenter Hintergrund" ,
"prefCast" : "Besetzung" ,
"openImdb" : "Bei IMDb öffnen" ,
"director" : "Regie" ,
"cast" : "Besetzung & Crew" ,
"markWatched" : "Als gesehen markieren" ,
"markUnwatched" : "Gesehen zurücknehmen" ,
feat(plex): expanded metadata filters, clickable info page, image disk cache
Backend (migration 0045_plex_filter_meta): plex_items gains rating (audienceRating
~IMDb), content_rating, studio, originally_available_at, and GIN-indexed genres /
directors / cast_names — all mirrored from the cheap section listing (no per-item API
calls; they also seed a future watch-habit recommender). /browse gains genre / content-
rating / year / rating / duration / added-within / director / actor / studio filters
(@> containment, GIN) + sort by year|rating|duration|release; new /facets endpoint
returns available genres+ratings (with counts) and the year/rating/duration bounds. A
thin on-disk image cache (.plex-img-cache) serves posters/art/cast photos from local
disk after first fetch (~7-14x faster repeat loads).
Frontend: PlexSidebar grows the full filter set (facet-driven genre/age chips, rating
steps, year range inputs, duration buckets, added-within, active people/studio chips,
clear-all); filters persist per-account as one JSON blob. PlexInfo metadata (year,
genre, director, cast, studio, IMDb score) is clickable → sets the matching filter and
returns to the filtered grid (page variant only; the in-player overlay stays read-only
so a stray click can't stop playback). i18n en/hu/de.
2026-07-05 23:45:55 +02:00
"clearResume" : "Fortsetzungsposition löschen" ,
"filterYear" : "Titel aus {{year}}" ,
"filterRating" : "Titel mit {{n}}+" ,
2026-07-06 02:25:48 +02:00
"filterActor" : "Titel mit {{name}}" ,
"browseCollection" : "Sammlung durchsuchen →"
feat(plex): rich media info — info page, in-player info overlay, IMDb + cast photos
Backend (no migration): item_detail now also returns IMDb score + id/url (from the
Plex Rating/Guid arrays), content rating, genres, director(s), studio, tagline, and
cast as {name, role, photo}. New host-whitelisted /person-image proxy serves cast
photos from Plex's public metadata CDN (keeps third-party requests off the browser).
Frontend: reusable PlexInfo component in two forms — a full info page opened from a
card's 'i' button (history subview, art backdrop, Play/Resume + watch controls) and a
lean overlay in the player toggled with 'I' (video keeps playing). Two per-user view
prefs (faint backdrop, cast row) persisted in preferences. Mark-unwatched / clear-resume
cover the watched-reset gap. i18n en/hu/de.
2026-07-05 22:57:18 +02:00
} ,
2026-07-05 02:32:00 +02:00
"playable" : {
"direct" : "Spielt direkt im Browser" ,
"remux" : "Braucht ein leichtes Remux (keine Video-Neucodierung)" ,
"transcode" : "Braucht Transcoding (aufwendiger)"
}
}