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" : "Back to library" ,
"searchPlaceholder" : "Search Plex…" ,
"sort" : {
"added" : "Recently added" ,
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" : "Title" ,
"year" : "Year" ,
"rating" : "IMDb rating" ,
"duration" : "Length" ,
"release" : "Release date"
2026-07-05 02:32:00 +02:00
} ,
2026-07-05 03:29:20 +02:00
"filter" : {
"library" : "Library" ,
"show" : "Show" ,
"showOpt" : {
"all" : "All" ,
"unwatched" : "Unwatched" ,
"in_progress" : "In progress" ,
"watched" : "Watched"
} ,
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" : "Sort" ,
"clearAll" : "Clear filters" ,
"active" : "Active" ,
"any" : "Any" ,
"rating" : "IMDb rating" ,
"genre" : "Genre" ,
"year" : "Year" ,
"duration" : "Length" ,
2026-07-06 17:33:16 +02:00
"durationOpt" : {
"short" : "Under 90m" ,
"mid" : "90– 120m" ,
"long" : "Over 2h"
} ,
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
"added" : "Added to Plex" ,
2026-07-06 17:33:16 +02:00
"addedOpt" : {
"24h" : "24h" ,
"1w" : "1 week" ,
"1m" : "1 month" ,
"6m" : "6 months" ,
"1y" : "1 year"
} ,
2026-07-06 00:15:31 +02:00
"contentRating" : "Age rating" ,
2026-07-06 17:33:16 +02:00
"match" : {
"any" : "Any" ,
"all" : "All"
} ,
"dir" : {
"desc" : "↓ Descending" ,
"asc" : "↑ Ascending"
} ,
2026-07-06 02:25:48 +02:00
"collection" : "Collection" ,
"collectionSearch" : "Search collections…" ,
"collectionEmpty" : "No collections"
2026-07-05 03:29:20 +02:00
} ,
2026-07-05 02:32:00 +02:00
"count" : "{{count}} titles" ,
"searchCount" : "{{count}} matches" ,
2026-07-05 03:29:20 +02:00
"noMatches" : "No matches." ,
2026-07-08 23:19:23 +02:00
"noMatchesFiltered_one" : "No matches — a filter is also narrowing the results." ,
"noMatchesFiltered_other" : "No matches — {{count}} filters are also narrowing the results." ,
2026-07-05 02:32:00 +02:00
"loading" : "Loading…" ,
"empty" : "Nothing here yet. Run a Plex sync from the admin Config page." ,
"loadMore" : "Load more" ,
"watched" : "Watched" ,
2026-07-10 21:43:09 +02:00
"inProgress" : "In progress" ,
2026-07-05 05:26:16 +02:00
"play" : "Play" ,
"resume" : "Resume" ,
"openShow" : "Open show" ,
"markWatched" : "Mark watched" ,
"markUnwatched" : "Mark unwatched" ,
2026-07-05 02:32:00 +02:00
"seasons" : "{{count}} seasons" ,
"playerSoon" : "Player coming soon — “{{title}}”" ,
2026-07-06 00:56:01 +02:00
"people" : {
"match" : "People" ,
"actor" : "Actor" ,
"director" : "Director" ,
"count" : "{{count}} titles" ,
"added" : "added"
} ,
2026-07-06 17:33:16 +02:00
"collEditor" : {
"manage" : "Collections" ,
"title" : "Collections — {{title}}" ,
"newPlaceholder" : "New collection name…" ,
"create" : "Create" ,
"search" : "Filter collections…" ,
"none" : "No editable collections yet. Create one above." ,
"count" : "{{count}} items" ,
"delete" : "Delete" ,
"deleteConfirm" : "Delete the collection \"{{title}}\" from Plex? This affects all users." ,
"note" : "Changes are written to Plex and shared across all clients and users." ,
"others" : "Manage {{count}} existing collections…" ,
"makeEditable" : "Manage"
} ,
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" : "Loading…" ,
"back" : "Back" ,
"skipIntro" : "Skip intro" ,
"skipCredits" : "Skip credits" ,
"playPause" : "Play / pause (space)" ,
"restart" : "Restart from beginning" ,
"prev" : "Previous episode" ,
"next" : "Next episode" ,
"mute" : "Mute (m)" ,
2026-07-05 05:26:16 +02:00
"fullscreen" : "Fullscreen (f)" ,
2026-07-05 06:08:44 +02:00
"download" : "Download original file" ,
"tracks" : "Audio & subtitles" ,
"audio" : "Audio" ,
"subtitles" : "Subtitles" ,
2026-07-05 06:58:34 +02:00
"subOff" : "Off" ,
"errNotFound" : "This file can't be played — the media isn't reachable on the server (the Plex media mount is missing or the path map is wrong). Ask the admin to check the Plex configuration." ,
"errTranscode" : "This file's format needs transcoding, which isn't supported yet." ,
2026-07-05 21:27:02 +02:00
"errGeneric" : "Playback couldn't start. Please try again." ,
"stop" : "Stop" ,
"help" : "Keyboard shortcuts" ,
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" : "Media info" ,
2026-07-05 21:27:02 +02:00
"keys" : {
"playPause" : "Play / pause" ,
"seek" : "Seek 10 seconds" ,
"episode" : "Previous / next episode" ,
"volume" : "Volume up / down" ,
"mute" : "Mute" ,
"fullscreen" : "Fullscreen" ,
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" : "Media info" ,
2026-07-05 21:27:02 +02:00
"back" : "Stop & back to feed" ,
feat(plex): rework player timing (copyts) + player settings & personalization
Streaming / subtitle sync (the core fix):
- stream.py: add -copyts so HLS segments carry the true absolute PTS, and measure
the real keyframe start K from seg_0 (ffprobe) -> return it as the session start.
Fixes the seconds-long subtitle lead caused by using the requested seek offset
instead of the keyframe ffmpeg actually lands on with video stream-copy.
- Add -noaccurate_seek so the re-encoded audio starts at the same keyframe as the
video (was starting (X-K)s later -> seconds of silence after each seek/audio switch).
- Compensate the fixed ~1.0s lag hls.js introduces for non-zero-start copyts streams,
folded into the session start so the clock, seeking and the subtitle shift are all
content-accurate.
- /subtitle gains an offset param; _shift_vtt shifts absolute cues onto the session's
zero-based clock and DROPS fully-past cue blocks (collapsing them to 0->0 made every
past cue active at currentTime 0 on resume -> a pile-up until playback advanced).
Audio:
- /session + stream.py gain an audio A/V-sync offset (-itsoffset, full +/-, second
input only when non-zero).
Player settings & personalization (per-account, persisted -> survive F5):
- storage.ts: useAccountPersistedObject (per-account JSON prefs blob).
- PlexPlayer: volume/mute, audio+subtitle language (index-based match, fixes the F5
audio-revert), sync offsets, seek steps, subtitle style, auto-hide, play intent.
- Hotkeys A (cycle audio) / S (cycle subtitle), mouse-wheel volume, Ctrl+arrow fine
seek, per-user plain/fine seek-step + auto-hide toggle.
- Subtitle appearance: size / colour / vertical position / background via ::cue + line.
- UI: split into a Tracks quick-menu + a tabbed gear panel (Sync | Playback | Subtitle);
both dismiss on outside-click; edge-aware control tooltips.
- i18n en/hu/de for all new strings.
2026-07-08 21:35:38 +02:00
"help" : "Show this help" ,
"audio" : "Cycle audio track" ,
"subtitle" : "Cycle subtitle" ,
"fineSeek" : "Fine seek"
} ,
"settings" : "Settings" ,
2026-07-09 01:32:04 +02:00
"sync" : "Offsets" ,
feat(plex): rework player timing (copyts) + player settings & personalization
Streaming / subtitle sync (the core fix):
- stream.py: add -copyts so HLS segments carry the true absolute PTS, and measure
the real keyframe start K from seg_0 (ffprobe) -> return it as the session start.
Fixes the seconds-long subtitle lead caused by using the requested seek offset
instead of the keyframe ffmpeg actually lands on with video stream-copy.
- Add -noaccurate_seek so the re-encoded audio starts at the same keyframe as the
video (was starting (X-K)s later -> seconds of silence after each seek/audio switch).
- Compensate the fixed ~1.0s lag hls.js introduces for non-zero-start copyts streams,
folded into the session start so the clock, seeking and the subtitle shift are all
content-accurate.
- /subtitle gains an offset param; _shift_vtt shifts absolute cues onto the session's
zero-based clock and DROPS fully-past cue blocks (collapsing them to 0->0 made every
past cue active at currentTime 0 on resume -> a pile-up until playback advanced).
Audio:
- /session + stream.py gain an audio A/V-sync offset (-itsoffset, full +/-, second
input only when non-zero).
Player settings & personalization (per-account, persisted -> survive F5):
- storage.ts: useAccountPersistedObject (per-account JSON prefs blob).
- PlexPlayer: volume/mute, audio+subtitle language (index-based match, fixes the F5
audio-revert), sync offsets, seek steps, subtitle style, auto-hide, play intent.
- Hotkeys A (cycle audio) / S (cycle subtitle), mouse-wheel volume, Ctrl+arrow fine
seek, per-user plain/fine seek-step + auto-hide toggle.
- Subtitle appearance: size / colour / vertical position / background via ::cue + line.
- UI: split into a Tracks quick-menu + a tabbed gear panel (Sync | Playback | Subtitle);
both dismiss on outside-click; edge-aware control tooltips.
- i18n en/hu/de for all new strings.
2026-07-08 21:35:38 +02:00
"subOffset" : "Subtitle delay" ,
"audioOffset" : "Audio delay" ,
"playback" : "Playback" ,
"seekStep" : "Seek step" ,
"fineSeek" : "Fine seek (Ctrl)" ,
"autoHide" : "Auto-hide controls" ,
2026-07-09 01:32:04 +02:00
"subStyle" : "Subtitles" ,
feat(plex): rework player timing (copyts) + player settings & personalization
Streaming / subtitle sync (the core fix):
- stream.py: add -copyts so HLS segments carry the true absolute PTS, and measure
the real keyframe start K from seg_0 (ffprobe) -> return it as the session start.
Fixes the seconds-long subtitle lead caused by using the requested seek offset
instead of the keyframe ffmpeg actually lands on with video stream-copy.
- Add -noaccurate_seek so the re-encoded audio starts at the same keyframe as the
video (was starting (X-K)s later -> seconds of silence after each seek/audio switch).
- Compensate the fixed ~1.0s lag hls.js introduces for non-zero-start copyts streams,
folded into the session start so the clock, seeking and the subtitle shift are all
content-accurate.
- /subtitle gains an offset param; _shift_vtt shifts absolute cues onto the session's
zero-based clock and DROPS fully-past cue blocks (collapsing them to 0->0 made every
past cue active at currentTime 0 on resume -> a pile-up until playback advanced).
Audio:
- /session + stream.py gain an audio A/V-sync offset (-itsoffset, full +/-, second
input only when non-zero).
Player settings & personalization (per-account, persisted -> survive F5):
- storage.ts: useAccountPersistedObject (per-account JSON prefs blob).
- PlexPlayer: volume/mute, audio+subtitle language (index-based match, fixes the F5
audio-revert), sync offsets, seek steps, subtitle style, auto-hide, play intent.
- Hotkeys A (cycle audio) / S (cycle subtitle), mouse-wheel volume, Ctrl+arrow fine
seek, per-user plain/fine seek-step + auto-hide toggle.
- Subtitle appearance: size / colour / vertical position / background via ::cue + line.
- UI: split into a Tracks quick-menu + a tabbed gear panel (Sync | Playback | Subtitle);
both dismiss on outside-click; edge-aware control tooltips.
- i18n en/hu/de for all new strings.
2026-07-08 21:35:38 +02:00
"subSize" : "Text size" ,
"subPos" : "Position" ,
"subColor" : "Text color" ,
"subBg" : "Background" ,
2026-07-08 22:38:47 +02:00
"subBgNone" : "None" ,
"clock" : "Clock" ,
"clockShow" : "Show clock" ,
"clock24h" : "24-hour" ,
"clockSize" : "Size" ,
"clockColor" : "Color" ,
"clockDate" : "Show date" ,
"subShadow" : "Shadow" ,
"subShadowColor" : "Shadow color" ,
"autoSkipIntro" : "Auto-skip intro" ,
"autoSkipCredits" : "Auto-skip credits" ,
"autoSkipDelay" : "Auto-skip delay"
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" : "Media info" ,
"customize" : "Customize view" ,
"prefArtBg" : "Faint backdrop" ,
"prefCast" : "Cast & crew" ,
2026-07-06 06:49:43 +02:00
"stripSource" : {
"collection" : "Collections" ,
"imdb" : "IMDb" ,
"tmdb" : "TMDb" ,
"tvdb" : "TVDb" ,
"trakt" : "Trakt" ,
"smart" : "Smart lists"
} ,
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
"openImdb" : "Open on IMDb" ,
"director" : "Director" ,
"cast" : "Cast & crew" ,
"markWatched" : "Mark watched" ,
"markUnwatched" : "Mark unwatched" ,
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" : "Clear resume position" ,
"filterYear" : "Show titles from {{year}}" ,
"filterRating" : "Show titles rated {{n}}+" ,
2026-07-06 02:25:48 +02:00
"filterActor" : "Show titles with {{name}}" ,
"browseCollection" : "Browse collection →"
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" : "Plays directly in the browser" ,
"remux" : "Needs a light remux (no video re-encode)" ,
"transcode" : "Needs transcoding (heavier)"
feat(plex): Playlists Phase 1 — per-user ordered watch-lists (Siftlode-native)
Personal ordered lists of Plex items, kept in Siftlode's own DB (works for users
without a Plex account, like watch-state) — the "your own lists" counterpart to
shared collections. Plex-direction sync is a later phase (plex_rating_key
reserved).
Backend: migration 0048 (plex_playlists + plex_playlist_items with position),
PlexPlaylist/PlexPlaylistItem models, and per-user CRUD endpoints under
/api/plex/playlists (list [+?contains for the add dialog], create [seeded],
detail [ordered cards], rename, delete, add/remove item, reorder). _leaf_card
handles the movie/episode mix. Frontend: "Add to playlist" dialog from the movie
info page (all users), a Playlists section in PlexSidebar (list + create),
PlexPlaylistView (reorder up/down, remove, rename, delete, Play all), and
PlexPlayer gained an optional `queue` so play-through follows the list order
(prev/next + auto-advance). i18n en/hu/de. Verified end-to-end on localdev
(backend CRUD + the create→add→view→play-through UI flow).
2026-07-06 19:05:12 +02:00
} ,
"playlistAdd" : {
"manage" : "Add to playlist" ,
"title" : "Add to playlist — {{title}}" ,
"newPlaceholder" : "New playlist name…" ,
"create" : "Create" ,
"none" : "No playlists yet. Create one above." ,
2026-07-06 22:14:56 +02:00
"count" : "{{count}} items" ,
"groupProgress" : "{{in}} / {{size}}"
feat(plex): Playlists Phase 1 — per-user ordered watch-lists (Siftlode-native)
Personal ordered lists of Plex items, kept in Siftlode's own DB (works for users
without a Plex account, like watch-state) — the "your own lists" counterpart to
shared collections. Plex-direction sync is a later phase (plex_rating_key
reserved).
Backend: migration 0048 (plex_playlists + plex_playlist_items with position),
PlexPlaylist/PlexPlaylistItem models, and per-user CRUD endpoints under
/api/plex/playlists (list [+?contains for the add dialog], create [seeded],
detail [ordered cards], rename, delete, add/remove item, reorder). _leaf_card
handles the movie/episode mix. Frontend: "Add to playlist" dialog from the movie
info page (all users), a Playlists section in PlexSidebar (list + create),
PlexPlaylistView (reorder up/down, remove, rename, delete, Play all), and
PlexPlayer gained an optional `queue` so play-through follows the list order
(prev/next + auto-advance). i18n en/hu/de. Verified end-to-end on localdev
(backend CRUD + the create→add→view→play-through UI flow).
2026-07-06 19:05:12 +02:00
} ,
"playlist" : {
"section" : "Playlists" ,
"newPlaceholder" : "New playlist…" ,
"create" : "Create playlist" ,
"none" : "No playlists yet." ,
"deleteConfirm" : "Delete the playlist \"{{title}}\"?" ,
"rename" : "Rename" ,
"playAll" : "Play all" ,
"delete" : "Delete playlist" ,
"empty" : "This playlist is empty. Add titles from their info page." ,
"up" : "Move up" ,
"down" : "Move down" ,
2026-07-06 22:14:56 +02:00
"remove" : "Remove" ,
"layoutAccordion" : "Accordion view" ,
"layoutTree" : "Tree view" ,
"removeShow" : "Remove whole show" ,
"removeSeason" : "Remove whole season" ,
"episodes" : "{{count}} episodes" ,
"season" : "Season {{n}}" ,
"seasonUnknown" : "Episodes" ,
"addShow" : "Add whole show to a playlist" ,
"addSeason" : "Add season to a playlist" ,
"addEpisode" : "Add episode to a playlist"
2026-07-05 02:32:00 +02:00
}
}