Backend: item detail returns audio_streams + subtitle_streams (from Plex Part.Stream
ordinals). The HLS session accepts audio/subtitle stream ordinals — the selected audio
is mapped (transcoded to AAC), a selected subtitle is muxed in as a WebVTT rendition
via a MASTER playlist (-master_pl_name + -var_stream_map sgroup:subs) so ffmpeg keeps
it in sync per-session. Selecting a track forces the HLS path (even for direct files).
Generic /stream/{rk}/hls/{filename} endpoint serves the master/media/vtt/ts artifacts.
Frontend: gear menu lists real audio + subtitle tracks; changing one restarts the
session at the current position (seek-restart mechanism). hls.js subtitle enabled on
SUBTITLE_TRACKS_UPDATED (not just MANIFEST_PARSED, else the VTT is never fetched).
Cues auto-nudged to line 88% (the full-height <video> clips a default bottom-edge cue).
Controls no longer auto-hide while the menu is open. plex.player.* i18n en/hu/de.
Verified in a real browser (2 Broke Girls S1E1, 2 audio + 2 subs): menu shows the real
tracks, enabling English subtitles renders them correctly positioned; backend master
playlist + vtt segments validated over HTTP.
57 lines
1.5 KiB
JSON
57 lines
1.5 KiB
JSON
{
|
|
"navLabel": "Plex",
|
|
"backToFeed": "YouTube feed",
|
|
"backToLibrary": "Back to library",
|
|
"searchPlaceholder": "Search Plex…",
|
|
"sort": {
|
|
"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",
|
|
"watched": "Watched",
|
|
"play": "Play",
|
|
"resume": "Resume",
|
|
"openShow": "Open show",
|
|
"markWatched": "Mark watched",
|
|
"markUnwatched": "Mark unwatched",
|
|
"seasons": "{{count}} seasons",
|
|
"playerSoon": "Player coming soon — “{{title}}”",
|
|
"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)",
|
|
"fullscreen": "Fullscreen (f)",
|
|
"download": "Download original file",
|
|
"tracks": "Audio & subtitles",
|
|
"audio": "Audio",
|
|
"subtitles": "Subtitles",
|
|
"subOff": "Off"
|
|
},
|
|
"playable": {
|
|
"direct": "Plays directly in the browser",
|
|
"remux": "Needs a light remux (no video re-encode)",
|
|
"transcode": "Needs transcoding (heavier)"
|
|
}
|
|
}
|