Full-screen browser reader for completed highlight/lip-sync jobs with synchronized playback, word highlighting, and optional presenter video.
Source: web/frontend/src/pages/Reader.tsx
Route: /jobs/:id/read
ReaderManifest and renders page-grouped chunks with per-word timingspresenter.mp4 as the playback clock in a draggable, edge-resizable picture-in-picture frame| State | Type | Description |
|---|---|---|
manifest |
ReaderManifest \| null |
Reader metadata and timed chunks |
error |
string \| null |
Reader load failure message |
loading |
boolean |
Initial manifest fetch state |
activeIdx |
number |
Active flattened word index |
playing |
boolean |
Current audio playback state |
rate |
number |
Playback speed |
currentTime |
number |
Current audio time in seconds |
autoScroll |
boolean |
Whether reader follows the active word |
controlsVisible |
boolean |
Visibility of the bottom playback dock |
hasStartedPlaying |
boolean |
Tracks whether autoplay-style control hiding should activate |
theme |
"night" \| "pdf" |
Persisted reader color theme |
pipWidth |
number |
Persisted presenter PiP width |
pipPos |
{x, y} |
Persisted presenter PiP position |
epubStatus |
EpubExportStatus |
On-demand EPUB export state |
epubError |
string \| null |
EPUB export failure detail |
getReaderManifest(id) from Reader API — initial manifest fetchgetReaderAudioUrl(id) from Reader API — <audio> source URLgetReaderPresenterUrl(id) from Reader API — <video> presenter source URLgetReaderPageUrl(id, filename) from Reader API — sticky page-preview image URLgetDownloadUrl(id) from Jobs API — standalone offline-reader ZIPrequestEpubExport(id), getEpubExportStatus(id), getEpubExportDownloadUrl(id) from Jobs API — text-and-narration EPUB exportactiveIdx from audio timeupdate events