siftlode/frontend/src/components
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
..
legal chore: prepare repo for public release — scrub internal infra, rewrite README 2026-07-01 12:46:50 +02:00
ui fix(a11y): accessible names for switches, swatches, selects and inputs 2026-07-04 19:13:11 +02:00
About.tsx feat(i18n): translate login and app chrome (HU/EN/DE) 2026-06-15 00:30:34 +02:00
AddToPlaylist.tsx refactor(ui): useDismiss hook for outside-click/Escape close 2026-06-29 00:11:44 +02:00
AdminUsers.tsx perf: route- and modal-level code splitting (React.lazy) 2026-07-04 19:43:50 +02:00
Avatar.tsx fix(ui): robust avatars — no-referrer + graceful fallback 2026-06-12 18:01:43 +02:00
BackToTop.tsx fix(ui): make the back-to-top button resist ad-block cosmetic filters 2026-06-30 05:18:07 +02:00
Banner.tsx refactor(banner): extract reusable Banner base for VersionBanner + DemoBanner 2026-06-19 11:18:20 +02:00
ChannelDiscovery.tsx fix(state): scope all per-account localStorage by account id 2026-07-02 01:45:16 +02:00
ChannelLink.tsx refactor(channels): share one ChannelLink + channelYouTubeUrl helper 2026-06-19 03:22:10 +02:00
ChannelPage.tsx feat(search): ephemeral results UX, count selector, channel blocklist (frontend) 2026-07-01 01:00:32 +02:00
Channels.tsx fix(state): scope all per-account localStorage by account id 2026-07-02 01:45:16 +02:00
ChatDock.tsx fix(messages): make the dock new-message flash actually visible 2026-06-26 00:00:21 +02:00
ChatThread.tsx fix(messages): gate on server key state, not just local unlock 2026-06-25 22:58:29 +02:00
ConfigPanel.tsx feat(plex): P0 admin Config UI — connection test + library picker 2026-07-05 01:35:08 +02:00
ConfirmProvider.tsx feat(ui): reusable app-styled confirm dialog, replacing window.confirm 2026-06-15 15:06:47 +02:00
DataTable.tsx refactor(ui): useDismiss hook for outside-click/Escape close 2026-06-29 00:11:44 +02:00
DemoBanner.tsx refactor(banner): extract reusable Banner base for VersionBanner + DemoBanner 2026-06-19 11:18:20 +02:00
DownloadButton.tsx perf: route- and modal-level code splitting (React.lazy) 2026-07-04 19:43:50 +02:00
DownloadCenter.tsx feat(downloads): store + show a canonical "downloaded from" source URL 2026-07-04 21:25:37 +02:00
DownloadDialog.tsx perf: route- and modal-level code splitting (React.lazy) 2026-07-04 19:43:50 +02:00
ErrorBoundary.tsx feat(i18n): translate remaining components (HU/EN/DE) 2026-06-15 00:47:04 +02:00
ErrorDialog.tsx fix(ux): modal error dialog for server-refused actions + ESC closes only the topmost 2026-06-18 01:17:31 +02:00
Feed.tsx feat(plex): P1.5 — Plex as a nav module + integrated search + filter sidebar 2026-07-05 03:29:20 +02:00
Header.tsx feat(plex): P1.5 — Plex as a nav module + integrated search + filter sidebar 2026-07-05 03:29:20 +02:00
KeyGate.tsx feat(messages): standalone Messages module + floating chat dock 2026-06-25 22:34:24 +02:00
LanguageSwitcher.tsx feat(nav): current-language badge (HU/EN/DE) on the rail language switcher 2026-07-01 22:50:59 +02:00
Messages.tsx fix(messages): don't inherit a stale chat thread across account switch 2026-06-29 00:48:18 +02:00
Modal.tsx fix(nav): Back steps through sub-views and closes modals before leaving a page 2026-06-26 01:37:43 +02:00
NavSidebar.tsx feat(plex): P1.5 — Plex as a nav module + integrated search + filter sidebar 2026-07-05 03:29:20 +02:00
NotificationsPanel.tsx perf: route- and modal-level code splitting (React.lazy) 2026-07-04 19:43:50 +02:00
OnboardingWizard.tsx feat(i18n): translate remaining components (HU/EN/DE) 2026-06-15 00:47:04 +02:00
PageTitle.tsx feat(ui): favicon, dynamic tab title, clickable logo, styled module headers 2026-07-04 06:17:40 +02:00
PlayerModal.tsx feat(player): persistent auto-advance + loop playback modes 2026-07-05 00:20:50 +02:00
Playlists.tsx perf: route- and modal-level code splitting (React.lazy) 2026-07-04 19:43:50 +02:00
PlexBrowse.tsx fix(plex): player + card polish from UAT 2026-07-05 05:26:16 +02:00
PlexPlayer.tsx feat(plex): P2 subtitle + audio track selector (closes P2) 2026-07-05 06:08:44 +02:00
PlexSidebar.tsx feat(plex): P1.5 — Plex as a nav module + integrated search + filter sidebar 2026-07-05 03:29:20 +02:00
ProfileEditor.tsx feat(downloads): M5 — Download Center frontend 2026-07-03 01:52:58 +02:00
ReleaseNotes.tsx feat(i18n): translate login and app chrome (HU/EN/DE) 2026-06-15 00:30:34 +02:00
SavedViewsWidget.tsx fix(feed): scope saved filters + default view per account 2026-07-02 00:37:23 +02:00
Scheduler.tsx fix(a11y): accessible names for switches, swatches, selects and inputs 2026-07-04 19:13:11 +02:00
SettingsPanel.tsx fix(a11y): accessible names for switches, swatches, selects and inputs 2026-07-04 19:13:11 +02:00
SetupWizard.tsx feat(setup): install-wizard UI (epic 6c) 2026-06-21 01:11:16 +02:00
ShareDialog.tsx feat(downloads): share UI — user picker + public watch links + watch page 2026-07-04 04:32:31 +02:00
Sidebar.tsx fix(a11y): accessible names for switches, swatches, selects and inputs 2026-07-04 19:13:11 +02:00
Stats.tsx fix(state): scope all per-account localStorage by account id 2026-07-02 01:45:16 +02:00
SyncStatus.tsx fix(sync): keep the pause control inline in the nav rail, not on an orphan line 2026-07-04 04:41:13 +02:00
Tabs.tsx fix(state): scope all per-account localStorage by account id 2026-07-02 01:45:16 +02:00
TagManager.tsx fix(notifications): name the entity in action toasts 2026-06-26 00:32:17 +02:00
Toaster.tsx feat(toast): surface toasts bottom-left by the bell, brighter dark rim 2026-06-17 14:28:29 +02:00
Tooltip.tsx fix(tooltip): keep hint captions inside the viewport near screen edges 2026-07-04 04:45:51 +02:00
UndoToolbar.tsx feat(playlists): sort + group-by-channel with reusable undo/redo 2026-06-15 21:52:28 +02:00
VersionBanner.tsx refactor(banner): extract reusable Banner base for VersionBanner + DemoBanner 2026-06-19 11:18:20 +02:00
VideoCard.tsx perf(feed): intrinsic dimensions + async decode on video thumbnails 2026-07-04 19:13:11 +02:00
VideoEditor.tsx fix(downloads): clamp editor hover-scrub popover inside the track 2026-07-04 03:41:18 +02:00
VirtualFeed.tsx feat(channels): dedicated channel page + ephemeral explore UI 2026-06-30 03:08:52 +02:00
WatchPage.tsx fix(watch): shrink-wrap the player to the video aspect 2026-07-04 21:25:37 +02:00
Welcome.tsx perf(landing): WebP welcome screenshots + long-cache static assets 2026-07-04 18:17:11 +02:00