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: /