Copilot + CodeRabbit review findings:
- React.memo ChapterTicks and ChapterList (project guideline: hot-path
components must use React.memo to cut redraw work during control
updates).
- chapterNameAt now sorts the chapter array once instead of twice per
call. The previous version went through currentChapterIndex
(chapterStartsMs + sort) then sortedChapters (sort again). Runs on
every playback tick, so the duplicate work added up.
- Import getUserLibraryApi from the public barrel
(@jellyfin/sdk/lib/utils/api) instead of the deep internal path
(@jellyfin/sdk/lib/utils/api/user-library-api) to match the rest of
the codebase and avoid coupling to SDK file layout.
TrickplayBubble polish:
- Sit just above the slider (bottom: 0) so the bubble no longer overlaps
the progress bar.
- Move the chapter-name + timestamp overlay to the bottom-left of the
preview frame, smaller font, in front of the surrounding overlays
(zIndex + elevation).
BottomControls cleanup:
- Drop dev-only "pick one to test" comment in favour of a one-line note
on TICK_HEIGHT.
- Inline scrubMs into its useMemo callback so the scrub-chapter-name
lookup only recomputes while a slide is active.
Threads chapters + duration through Controls -> BottomControls so the
ChapterTicks overlay, ChapterList modal and current-chapter label have
the data they need.
BottomControls
- Memoizes chapterMarkerList (markers within the media duration) once
per (chapters, durationMs) change and feeds it to ChapterTicks.
- hasChapters gates the bookmark icon + list modal; nothing renders
when chapters are missing or below two real markers.
- Current chapter name shown as a small label below the title/year
during playback; the same helper feeds the trickplay bubble while
scrubbing. Both labels disappear gracefully when chapters are absent.
useVideoSlider
- Adds seekTo(value): a programmatic seek for non-gesture entry points
(chapter list, hot-keys). Reads isPlaying directly instead of
wasPlayingRef — which is only populated inside handleSliderStart, so
a tap-to-seek on the chapter list previously either stranded paused
playback or auto-resumed against a manual pause.
TrickplayBubble
- Adds an optional chapterName prop; renders a small left-aligned
overlay inside the preview frame (Jellyfin web style) showing chapter
name above the timestamp. Hides the chapter line entirely when null.
- zIndex + elevation so the bubble lands in front of the title /
surrounding overlays.
- Slight reposition (bottom -20, paddingTop 12) brings the bubble
closer to the slider.
translations/en.json
- chapters.title / chapters.chapter_number / chapters.open /
chapters.close keys for the list modal and the bookmark a11y label.
Add new setting to completely disable the auto-play next episode feature.
When disabled, the countdown button is hidden and the max episode count
setting appears greyed out.