siftlode/frontend/src/lib
npeter83 a06f87f5f6 feat(plex): P2 subtitle + audio track selector (closes P2)
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.
2026-07-05 06:08:44 +02:00
..
adminUsersTab.ts perf: route- and modal-level code splitting (React.lazy) 2026-07-04 19:43:50 +02:00
api.ts feat(plex): P2 subtitle + audio track selector (closes P2) 2026-07-05 06:08:44 +02:00
chatDock.ts feat(messages): auto-open/flash dock on incoming + persist dock across reload 2026-06-25 22:46:54 +02:00
descriptionLinks.tsx refactor(player): extract description link-rendering into lib/descriptionLinks 2026-06-29 00:24:49 +02:00
e2ee.ts feat(messages): standalone Messages module + floating chat dock 2026-06-25 22:34:24 +02:00
errorDialog.ts refactor(frontend): adopt store/storage helpers; centralize persistence 2026-06-26 03:30:19 +02:00
format.ts feat(downloads): M5 — Download Center frontend 2026-07-03 01:52:58 +02:00
hints.ts fix(state): scope all per-account localStorage by account id 2026-07-02 01:45:16 +02:00
history.ts fix(modal): stop Release Notes modal flashing shut on modal-to-modal handoff 2026-07-01 14:27:41 +02:00
messagesSocket.ts feat(auth): per-tab account — different account per browser tab 2026-07-01 23:43:35 +02:00
messaging.ts fix(messages): gate on server key state, not just local unlock 2026-06-25 22:58:29 +02:00
nav.ts feat(downloads): M5 — Download Center frontend 2026-07-03 01:52:58 +02:00
notifications.ts fix(state): scope all per-account localStorage by account id 2026-07-02 01:45:16 +02:00
onboarding.ts fix(state): scope all per-account localStorage by account id 2026-07-02 01:45:16 +02:00
pageMeta.ts feat(plex): P1.5 — Plex as a nav module + integrated search + filter sidebar 2026-07-05 03:29:20 +02:00
releaseNotes.ts docs(release): note player auto-advance + loop in v0.22.3 2026-07-05 00:21:15 +02:00
sidebarLayout.ts fix(state): scope all per-account localStorage by account id 2026-07-02 01:45:16 +02:00
storage.ts feat(plex): P1.5 — Plex as a nav module + integrated search + filter sidebar 2026-07-05 03:29:20 +02:00
store.ts feat(frontend): add createStore factory + central localStorage registry 2026-06-26 03:30:19 +02:00
theme.ts fix(state): scope all per-account localStorage by account id 2026-07-02 01:45:16 +02:00
urlState.ts feat(plex): P1.5 — Plex as a nav module + integrated search + filter sidebar 2026-07-05 03:29:20 +02:00
useDebounced.ts fix(feed): stop search-box flicker (keepPreviousData + debounced query) 2026-06-29 02:19:18 +02:00
useDismiss.ts refactor(ui): useDismiss hook for outside-click/Escape close 2026-06-29 00:11:44 +02:00
useLiveQuery.ts fix(scheduler): show progress for any running job with reliable live updates 2026-06-19 02:43:46 +02:00
useUndoable.ts feat(playlists): sort + group-by-channel with reusable undo/redo 2026-06-15 21:52:28 +02:00
version.ts refactor(frontend): adopt store/storage helpers; centralize persistence 2026-06-26 03:30:19 +02:00