Skip to content

Transcripts

github-actions[bot] edited this page Aug 4, 2026 · 1 revision

Enjoy Player unifies imported subtitles, YouTube captions, and generated speech-to-text tracks behind one local transcript model.

flowchart LR
  Source["SRT, VTT, YouTube, or ASR"] --> Repository["TranscriptRepository"]
  Repository --> Drift["Drift transcript rows"]
  Drift --> Providers["Riverpod streams"]
  Providers --> Panel["Transcript panel and CC picker"]
Loading

Tracks

TranscriptRepository.watchTracks(mediaId) emits TranscriptTrack values for local imports, official or automatic YouTube captions, and AI-generated ASR. Element-wise value comparison suppresses no-op Drift emissions before they reach always-mounted controls such as the transport-bar CC indicator.

The CC picker shows fetch progress, friendly retry states, provider and language metadata, and adaptive presentation: a draggable sheet on narrow viewports or a centered dialog at the rail breakpoint. Deleting a selected track clears stale echo-session references and chooses a replacement primary track by source priority.

Lines

All sources become timed TranscriptLine values with startMs, endMs, and text. Tapping an ordinary cue seeks playback. Active and echo-region cues remain selectable so a learner can invoke dictionary lookup without an accidental seek. Each row exposes combined timestamp, snippet, state, and recording-count semantics.

Density and highlighting

Transcript rows keep 16 px horizontal padding on every platform. Desktop/mobile density changes vertical padding from 6/4 px and the inter-line gap from 4/2 px. The current cue receives a 3 px primary rail; a current cue inside the echo region uses the echo color. Secondary translations use an inset left border to preserve reading hierarchy.

See the density reference and TranscriptLineTile.

Auto-translate

Auto-translate creates a durable secondary AI track keyed by native language. Visible uncached lines are requested lazily with at most two concurrent translations, then cached in Drift. A normalized primary-text fingerprint soft-invalidates edited lines, and each translated line has an inline refresh action.

Lookup

Text selection opens the shared dictionary lookup content in a bottom sheet on narrow layouts or a bounded dialog on wide layouts. Lookup supports the separate 14-language catalog and can use configured AI providers for contextual definitions and translations.

For the full lifecycle, source priorities, cloud resolution, and YouTube worker behavior, see the transcript feature reference.