diff --git a/src/core/services/youtube/timedtext.test.ts b/src/core/services/youtube/timedtext.test.ts index 56a05b08..1320bdad 100644 --- a/src/core/services/youtube/timedtext.test.ts +++ b/src/core/services/youtube/timedtext.test.ts @@ -125,11 +125,11 @@ test('convertYoutubeTimedTextToVtt leaves pop-on captions intact', () => { ); }); -test('convertYoutubeTimedTextToVtt keeps explicit sound-cue durations in rolling documents', () => { +test('convertYoutubeTimedTextToVtt keeps explicit 3000ms sound-cue durations in rolling documents', () => { const result = convertYoutubeTimedTextToVtt( [ '', - '

[音楽]

', + '

[音楽]

', '

\n

', '

じゃあ、君からお願いします。

', '
', @@ -141,7 +141,7 @@ test('convertYoutubeTimedTextToVtt keeps explicit sound-cue durations in rolling [ 'WEBVTT', '', - '00:00:20.305 --> 00:00:22.325', + '00:00:20.305 --> 00:00:23.305', '[音楽]', '', '00:00:26.279 --> 00:00:29.279', diff --git a/src/core/services/youtube/timedtext.ts b/src/core/services/youtube/timedtext.ts index 29b411b4..c0a88020 100644 --- a/src/core/services/youtube/timedtext.ts +++ b/src/core/services/youtube/timedtext.ts @@ -2,6 +2,7 @@ interface YoutubeTimedTextRow { startMs: number; durationMs: number; text: string; + isGenerated: boolean; rollingWindow: YoutubeRollingWindow | null; } @@ -152,7 +153,8 @@ function extractYoutubeTimedTextDocument(xml: string): YoutubeTimedTextDocument continue; } - const inner = (match[2] ?? '').replace(//gi, '\n').replace(/<[^>]+>/g, ''); + const rawInner = match[2] ?? ''; + const inner = rawInner.replace(//gi, '\n').replace(/<[^>]+>/g, ''); const text = decodeHtmlEntities(inner).trim(); if (!text) { continue; @@ -162,6 +164,7 @@ function extractYoutubeTimedTextDocument(xml: string): YoutubeTimedTextDocument startMs, durationMs, text, + isGenerated: /