mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-24 23:51:20 -08:00
fix(core): [CORE-SUBTITLE-OFFSET-01] refresh paused native cue membership and order
This commit is contained in:
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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user