diff --git a/src/core/services/mining.test.ts b/src/core/services/mining.test.ts index b8287c4f..5e6ad438 100644 --- a/src/core/services/mining.test.ts +++ b/src/core/services/mining.test.ts @@ -373,6 +373,22 @@ test('handleMineSentenceDigit keeps per-entry timings when subtitle text repeats } }); +test('subtitle timing history preserves adjacent repeated text with distinct timings', () => { + const tracker = new SubtitleTimingTracker(); + + try { + tracker.recordSubtitle('same', 1, 2); + tracker.recordSubtitle('same', 3, 4); + + assert.deepEqual(tracker.getRecentEntries(2), [ + { displayText: 'same', startTime: 1, endTime: 2, secondaryText: undefined }, + { displayText: 'same', startTime: 3, endTime: 4, secondaryText: undefined }, + ]); + } finally { + tracker.destroy(); + } +}); + test('handleMineSentenceDigit joins per-entry secondary subtitles when available', async () => { const created: Array<{ sentence: string; secondarySub?: string }> = []; const tracker = new SubtitleTimingTracker(); diff --git a/src/subtitle-timing-tracker.ts b/src/subtitle-timing-tracker.ts index d8db87b1..f55c603e 100644 --- a/src/subtitle-timing-tracker.ts +++ b/src/subtitle-timing-tracker.ts @@ -67,8 +67,13 @@ export class SubtitleTimingTracker { // Check for duplicate of most recent entry (deduplicate adjacent repeats) const lastEntry = this.history[this.history.length - 1]; - if (lastEntry && lastEntry.timingKey === timingKey) { - // Update timing to most recent occurrence + if ( + lastEntry && + lastEntry.timingKey === timingKey && + lastEntry.startTime === startTime && + lastEntry.endTime === endTime + ) { + // Refresh metadata for repeated notifications of the same subtitle event. lastEntry.startTime = startTime; lastEntry.endTime = endTime; lastEntry.secondaryText = displaySecondaryText;