fix(core): [CORE-SUBTITLE-OFFSET-01] refresh paused native cue membership and order

This commit is contained in:
Harvey Zhao committed 2026-09-14 12:49:22 +08:00
1 parent b5dee252d4
commit efed847cdf
23 files changed
+6789 -27

No files matched your search

@@ -1,4 +1,5 @@
import type { SubtitleOffsetHost } from '../subtitle/types'
import { refreshPausedCues } from '../subtitle/timing'
import { clamp, def } from '../utils'
export default function subtitleOffsetMix(art: SubtitleOffsetHost): void {
@@ -21,6 +22,7 @@ export default function subtitleOffsetMix(art: SubtitleOffsetHost): void {
cue.startTime = clamp(cue.originalStartTime + offset, 0, art.duration)
cue.endTime = clamp(cue.originalEndTime + offset, 0, art.duration)
}
refreshPausedCues(template.$track.track, template.$video, cues)
art.subtitle.update()
notice.show = `${i18n.get('Subtitle Offset')}: ${value}s`
art.emit('subtitleOffset', value)
+16
View File
@@ -0,0 +1,16 @@
import type { SubtitleCue } from './types'
export function refreshPausedCues(track: TextTrack | undefined, video: { paused?: boolean, currentTime?: number } | undefined, cues: readonly SubtitleCue[]): void {
if (!track || track.mode === 'disabled' || !video?.paused || !Number.isFinite(video.currentTime))
return
const time = video.currentTime!
const expected = cues.filter(cue => cue.startTime <= time && time < cue.endTime)
const active = Array.from(track.activeCues || [])
if (expected.length === active.length && expected.every((cue, index) => active[index] === cue))
return
// Some engines retain stale active flags after timing edits while paused.
for (const cue of cues)
track.removeCue(cue)
for (const cue of cues)
track.addCue(cue)
}
+1 -1
View File
@@ -36,7 +36,7 @@ export interface SubtitleView {
}
export interface SubtitleOffsetHost {
template: { $track?: SubtitleTrack | null }
template: { $track?: SubtitleTrack | null, $video?: { paused?: boolean, currentTime?: number } }
subtitle: { readonly cues: SubtitleCue[], update: () => void }
readonly duration: number
notice: NoticeSink