From c5009b6cacb588b19d4f47f7bf40b74a135b9368 Mon Sep 17 00:00:00 2001 From: Greg DiPietro Date: Thu, 4 Sep 2025 11:39:25 -0400 Subject: [PATCH 1/2] fix(player): dedup segmented webvtt captions with the same id (#1688) --- packages/vidstack/src/core/tracks/text/text-track.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/vidstack/src/core/tracks/text/text-track.ts b/packages/vidstack/src/core/tracks/text/text-track.ts index f76fdc2e2..28f864184 100644 --- a/packages/vidstack/src/core/tracks/text/text-track.ts +++ b/packages/vidstack/src/core/tracks/text/text-track.ts @@ -54,6 +54,7 @@ export class TextTrack extends EventsTarget { #regions: VTTRegion[] = []; #cues: VTTCue[] = []; #activeCues: VTTCue[] = []; + #cueIds = new Set(); /** @internal */ [TextTrackSymbol.readyState]: TextTrackReadyState = 0; @@ -128,6 +129,12 @@ export class TextTrack extends EventsTarget { } addCue(cue: VTTCue, trigger?: Event): void { + // deduplicate cues with the same id + if (cue.id) { + if (this.#cueIds.has(cue.id)) return; + this.#cueIds.add(cue.id); + } + let i = 0, length = this.#cues.length; From c9ecffad8e9a5233ed878815aac2184d3e9d0de7 Mon Sep 17 00:00:00 2001 From: Greg DiPietro Date: Thu, 4 Sep 2025 16:43:35 -0400 Subject: [PATCH 2/2] remove id from cueIds on removeCue --- packages/vidstack/src/core/tracks/text/text-track.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vidstack/src/core/tracks/text/text-track.ts b/packages/vidstack/src/core/tracks/text/text-track.ts index 28f864184..2b44f230e 100644 --- a/packages/vidstack/src/core/tracks/text/text-track.ts +++ b/packages/vidstack/src/core/tracks/text/text-track.ts @@ -159,6 +159,7 @@ export class TextTrack extends EventsTarget { const index = this.#cues.indexOf(cue); if (index >= 0) { const isActive = this.#activeCues.includes(cue); + if (cue.id) this.#cueIds.delete(cue.id); this.#cues.splice(index, 1); this[TextTrackSymbol.native]?.track.removeCue(cue); this.dispatchEvent(new DOMEvent('remove-cue', { detail: cue, trigger }));