defuddle 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -8
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +12 -1
- package/dist/constants.js.map +1 -1
- package/dist/defuddle.d.ts +48 -1
- package/dist/defuddle.js +519 -213
- package/dist/defuddle.js.map +1 -1
- package/dist/elements/footnotes.js +2 -1
- package/dist/elements/footnotes.js.map +1 -1
- package/dist/extractor-registry.d.ts +1 -0
- package/dist/extractor-registry.js +3 -0
- package/dist/extractor-registry.js.map +1 -1
- package/dist/extractors/_base.d.ts +6 -0
- package/dist/extractors/_base.js +8 -0
- package/dist/extractors/_base.js.map +1 -1
- package/dist/extractors/github.d.ts +10 -2
- package/dist/extractors/github.js +158 -71
- package/dist/extractors/github.js.map +1 -1
- package/dist/extractors/hackernews.js +18 -72
- package/dist/extractors/hackernews.js.map +1 -1
- package/dist/extractors/reddit.d.ts +1 -2
- package/dist/extractors/reddit.js +41 -94
- package/dist/extractors/reddit.js.map +1 -1
- package/dist/extractors/x-oembed.d.ts +0 -1
- package/dist/extractors/x-oembed.js +20 -27
- package/dist/extractors/x-oembed.js.map +1 -1
- package/dist/extractors/youtube.d.ts +37 -0
- package/dist/extractors/youtube.js +409 -9
- package/dist/extractors/youtube.js.map +1 -1
- package/dist/index.full.js +1 -1
- package/dist/index.js +1 -1
- package/dist/metadata.d.ts +5 -0
- package/dist/metadata.js +28 -0
- package/dist/metadata.js.map +1 -1
- package/dist/node.js +0 -5
- package/dist/node.js.map +1 -1
- package/dist/scoring.d.ts +6 -1
- package/dist/scoring.js +66 -19
- package/dist/scoring.js.map +1 -1
- package/dist/standardize.js +64 -60
- package/dist/standardize.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/utils/comments.d.ts +44 -0
- package/dist/utils/comments.js +103 -0
- package/dist/utils/comments.js.map +1 -0
- package/dist/utils/dom.d.ts +9 -0
- package/dist/utils/dom.js +20 -0
- package/dist/utils/dom.js.map +1 -1
- package/dist/utils/transcript.d.ts +37 -0
- package/dist/utils/transcript.js +61 -0
- package/dist/utils/transcript.js.map +1 -0
- package/package.json +1 -1
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.YoutubeExtractor = void 0;
|
|
4
4
|
const _base_1 = require("./_base");
|
|
5
|
+
const transcript_1 = require("../utils/transcript");
|
|
6
|
+
const SENTENCE_END = /[.!?]["'\u2019\u201D)]*\s*$/;
|
|
7
|
+
// Unofficial InnerTube API. Uses Android client context to get caption track URLs.
|
|
8
|
+
// Version may need updating if Google changes the API.
|
|
9
|
+
const INNERTUBE_API_URL = 'https://www.youtube.com/youtubei/v1/player?prettyPrint=false';
|
|
10
|
+
const INNERTUBE_CLIENT_VERSION = '20.10.38';
|
|
11
|
+
const INNERTUBE_CONTEXT = {
|
|
12
|
+
client: {
|
|
13
|
+
clientName: 'ANDROID',
|
|
14
|
+
clientVersion: INNERTUBE_CLIENT_VERSION,
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const INNERTUBE_USER_AGENT = `com.google.android.youtube/${INNERTUBE_CLIENT_VERSION} (Linux; U; Android 14)`;
|
|
18
|
+
const INNERTUBE_NEXT_URL = 'https://www.youtube.com/youtubei/v1/next?prettyPrint=false';
|
|
19
|
+
const INNERTUBE_WEB_CONTEXT = {
|
|
20
|
+
client: {
|
|
21
|
+
clientName: 'WEB',
|
|
22
|
+
clientVersion: '2.20240101.00.00',
|
|
23
|
+
}
|
|
24
|
+
};
|
|
5
25
|
class YoutubeExtractor extends _base_1.BaseExtractor {
|
|
6
26
|
constructor(document, url, schemaOrgData) {
|
|
7
27
|
super(document, url, schemaOrgData);
|
|
@@ -11,12 +31,42 @@ class YoutubeExtractor extends _base_1.BaseExtractor {
|
|
|
11
31
|
canExtract() {
|
|
12
32
|
return true;
|
|
13
33
|
}
|
|
34
|
+
canExtractAsync() {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
prefersAsync() {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
14
40
|
extract() {
|
|
41
|
+
return this.buildResult();
|
|
42
|
+
}
|
|
43
|
+
async extractAsync() {
|
|
44
|
+
const transcript = await this.fetchTranscript();
|
|
45
|
+
return this.buildResult(transcript);
|
|
46
|
+
}
|
|
47
|
+
buildResult(transcript) {
|
|
15
48
|
const videoData = this.getVideoData();
|
|
16
49
|
const channelName = this.getChannelName(videoData);
|
|
17
50
|
const description = videoData.description || '';
|
|
18
51
|
const formattedDescription = this.formatDescription(description);
|
|
19
|
-
|
|
52
|
+
let contentHtml = `<iframe width="560" height="315" src="https://www.youtube.com/embed/${this.getVideoId()}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>${formattedDescription}`;
|
|
53
|
+
if (transcript?.html) {
|
|
54
|
+
contentHtml += transcript.html;
|
|
55
|
+
}
|
|
56
|
+
const variables = {
|
|
57
|
+
title: videoData.name || '',
|
|
58
|
+
author: channelName,
|
|
59
|
+
site: 'YouTube',
|
|
60
|
+
image: Array.isArray(videoData.thumbnailUrl) ? videoData.thumbnailUrl[0] || '' : '',
|
|
61
|
+
published: videoData.uploadDate,
|
|
62
|
+
description: description.slice(0, 200).trim(),
|
|
63
|
+
};
|
|
64
|
+
if (transcript?.text) {
|
|
65
|
+
variables.transcript = transcript.text;
|
|
66
|
+
}
|
|
67
|
+
if (transcript?.languageCode) {
|
|
68
|
+
variables.language = transcript.languageCode;
|
|
69
|
+
}
|
|
20
70
|
return {
|
|
21
71
|
content: contentHtml,
|
|
22
72
|
contentHtml: contentHtml,
|
|
@@ -24,14 +74,7 @@ class YoutubeExtractor extends _base_1.BaseExtractor {
|
|
|
24
74
|
videoId: this.getVideoId(),
|
|
25
75
|
author: channelName,
|
|
26
76
|
},
|
|
27
|
-
variables
|
|
28
|
-
title: videoData.name || '',
|
|
29
|
-
author: channelName,
|
|
30
|
-
site: 'YouTube',
|
|
31
|
-
image: Array.isArray(videoData.thumbnailUrl) ? videoData.thumbnailUrl[0] || '' : '',
|
|
32
|
-
published: videoData.uploadDate,
|
|
33
|
-
description: description.slice(0, 200).trim(),
|
|
34
|
-
}
|
|
77
|
+
variables,
|
|
35
78
|
};
|
|
36
79
|
}
|
|
37
80
|
formatDescription(description) {
|
|
@@ -128,6 +171,210 @@ class YoutubeExtractor extends _base_1.BaseExtractor {
|
|
|
128
171
|
}
|
|
129
172
|
return null;
|
|
130
173
|
}
|
|
174
|
+
async fetchTranscript() {
|
|
175
|
+
try {
|
|
176
|
+
const videoId = this.getVideoId();
|
|
177
|
+
if (!videoId)
|
|
178
|
+
return undefined;
|
|
179
|
+
// Fetch captions and chapters in parallel
|
|
180
|
+
const [playerData, chapters] = await Promise.all([
|
|
181
|
+
this.fetchPlayerData(videoId),
|
|
182
|
+
this.fetchChapters(videoId),
|
|
183
|
+
]);
|
|
184
|
+
if (!playerData)
|
|
185
|
+
return undefined;
|
|
186
|
+
const captionTracks = playerData?.captions
|
|
187
|
+
?.playerCaptionsTracklistRenderer?.captionTracks;
|
|
188
|
+
if (!Array.isArray(captionTracks) || captionTracks.length === 0)
|
|
189
|
+
return undefined;
|
|
190
|
+
// Prefer English, fall back to first available track
|
|
191
|
+
const track = captionTracks.find((t) => t.languageCode === 'en')
|
|
192
|
+
|| captionTracks[0];
|
|
193
|
+
if (!track?.baseUrl)
|
|
194
|
+
return undefined;
|
|
195
|
+
// Validate URL to prevent SSRF in server-side contexts
|
|
196
|
+
try {
|
|
197
|
+
const captionUrl = new URL(track.baseUrl);
|
|
198
|
+
if (!captionUrl.hostname.endsWith('.youtube.com'))
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
const response = await fetch(track.baseUrl, {
|
|
205
|
+
headers: { 'User-Agent': 'Mozilla/5.0' },
|
|
206
|
+
});
|
|
207
|
+
if (!response.ok)
|
|
208
|
+
return undefined;
|
|
209
|
+
const xml = await response.text();
|
|
210
|
+
if (!xml)
|
|
211
|
+
return undefined;
|
|
212
|
+
return this.parseTranscriptXml(xml, track.languageCode || 'en', chapters);
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
console.error('YoutubeExtractor: failed to fetch transcript', error);
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async fetchPlayerData(videoId) {
|
|
220
|
+
try {
|
|
221
|
+
const resp = await fetch(INNERTUBE_API_URL, {
|
|
222
|
+
method: 'POST',
|
|
223
|
+
headers: {
|
|
224
|
+
'Content-Type': 'application/json',
|
|
225
|
+
'User-Agent': INNERTUBE_USER_AGENT,
|
|
226
|
+
},
|
|
227
|
+
body: JSON.stringify({
|
|
228
|
+
context: INNERTUBE_CONTEXT,
|
|
229
|
+
videoId,
|
|
230
|
+
})
|
|
231
|
+
});
|
|
232
|
+
if (!resp.ok)
|
|
233
|
+
return undefined;
|
|
234
|
+
return resp.json();
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async fetchChapters(videoId) {
|
|
241
|
+
try {
|
|
242
|
+
const resp = await fetch(INNERTUBE_NEXT_URL, {
|
|
243
|
+
method: 'POST',
|
|
244
|
+
headers: { 'Content-Type': 'application/json' },
|
|
245
|
+
body: JSON.stringify({
|
|
246
|
+
context: INNERTUBE_WEB_CONTEXT,
|
|
247
|
+
videoId,
|
|
248
|
+
})
|
|
249
|
+
});
|
|
250
|
+
if (!resp.ok)
|
|
251
|
+
return [];
|
|
252
|
+
const data = await resp.json();
|
|
253
|
+
// Try chapterRenderer from the player bar (explicit chapters)
|
|
254
|
+
const chapters = this.extractChaptersFromPlayerBar(data);
|
|
255
|
+
if (chapters.length > 0)
|
|
256
|
+
return chapters;
|
|
257
|
+
// Fall back to macroMarkersListItemRenderer from engagement panels
|
|
258
|
+
// (auto-generated "Key moments" from description timestamps)
|
|
259
|
+
return this.extractChaptersFromEngagementPanels(data);
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return [];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
extractChaptersFromPlayerBar(data) {
|
|
266
|
+
const chapters = [];
|
|
267
|
+
const panels = data?.playerOverlays?.playerOverlayRenderer
|
|
268
|
+
?.decoratedPlayerBarRenderer?.decoratedPlayerBarRenderer?.playerBar
|
|
269
|
+
?.multiMarkersPlayerBarRenderer?.markersMap;
|
|
270
|
+
if (!Array.isArray(panels))
|
|
271
|
+
return chapters;
|
|
272
|
+
for (const panel of panels) {
|
|
273
|
+
const markers = panel?.value?.chapters;
|
|
274
|
+
if (!Array.isArray(markers))
|
|
275
|
+
continue;
|
|
276
|
+
for (const marker of markers) {
|
|
277
|
+
const ch = marker?.chapterRenderer;
|
|
278
|
+
if (!ch)
|
|
279
|
+
continue;
|
|
280
|
+
const title = ch.title?.simpleText || '';
|
|
281
|
+
const startMs = ch.timeRangeStartMillis;
|
|
282
|
+
if (title && typeof startMs === 'number') {
|
|
283
|
+
chapters.push({ title, start: startMs / 1000 });
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return chapters;
|
|
288
|
+
}
|
|
289
|
+
extractChaptersFromEngagementPanels(data) {
|
|
290
|
+
const chapters = [];
|
|
291
|
+
const panels = data?.engagementPanels;
|
|
292
|
+
if (!Array.isArray(panels))
|
|
293
|
+
return chapters;
|
|
294
|
+
for (const panel of panels) {
|
|
295
|
+
const content = panel?.engagementPanelSectionListRenderer?.content;
|
|
296
|
+
const items = content?.macroMarkersListRenderer?.contents;
|
|
297
|
+
if (!Array.isArray(items))
|
|
298
|
+
continue;
|
|
299
|
+
for (const item of items) {
|
|
300
|
+
const renderer = item?.macroMarkersListItemRenderer;
|
|
301
|
+
if (!renderer)
|
|
302
|
+
continue;
|
|
303
|
+
const title = renderer.title?.simpleText || '';
|
|
304
|
+
const timeStr = renderer.timeDescription?.simpleText || '';
|
|
305
|
+
if (!title || !timeStr)
|
|
306
|
+
continue;
|
|
307
|
+
const seconds = this.parseTimestamp(timeStr);
|
|
308
|
+
if (seconds !== null) {
|
|
309
|
+
chapters.push({ title, start: seconds });
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return chapters;
|
|
314
|
+
}
|
|
315
|
+
parseTimestamp(ts) {
|
|
316
|
+
const parts = ts.split(':').map(Number);
|
|
317
|
+
if (parts.some(isNaN))
|
|
318
|
+
return null;
|
|
319
|
+
if (parts.length === 3)
|
|
320
|
+
return parts[0] * 3600 + parts[1] * 60 + parts[2];
|
|
321
|
+
if (parts.length === 2)
|
|
322
|
+
return parts[0] * 60 + parts[1];
|
|
323
|
+
return null;
|
|
324
|
+
}
|
|
325
|
+
parseTranscriptXml(xml, languageCode, chapters = []) {
|
|
326
|
+
const segments = [];
|
|
327
|
+
// Handle srv3 format: <p t="ms" d="ms"><s>word</s>...</p>
|
|
328
|
+
const pRegex = /<p\s+t="(\d+)"[^>]*>([\s\S]*?)<\/p>/g;
|
|
329
|
+
let match;
|
|
330
|
+
while ((match = pRegex.exec(xml)) !== null) {
|
|
331
|
+
const startMs = parseInt(match[1], 10);
|
|
332
|
+
const inner = match[2];
|
|
333
|
+
// Extract text from <s> children, or use raw text
|
|
334
|
+
let text = '';
|
|
335
|
+
const sRegex = /<s[^>]*>([^<]*)<\/s>/g;
|
|
336
|
+
let sMatch;
|
|
337
|
+
while ((sMatch = sRegex.exec(inner)) !== null) {
|
|
338
|
+
text += sMatch[1];
|
|
339
|
+
}
|
|
340
|
+
// Fall back to stripping all tags if no <s> elements
|
|
341
|
+
if (!text) {
|
|
342
|
+
text = inner.replace(/<[^>]+>/g, '');
|
|
343
|
+
}
|
|
344
|
+
// Decode HTML entities
|
|
345
|
+
text = this.decodeEntities(text);
|
|
346
|
+
if (text.trim()) {
|
|
347
|
+
segments.push({ start: startMs / 1000, text: text.trim() });
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Fall back to simple format: <text start="s" dur="s">content</text>
|
|
351
|
+
if (segments.length === 0) {
|
|
352
|
+
const textRegex = /<text\s+start="([^"]*)"[^>]*>([\s\S]*?)<\/text>/g;
|
|
353
|
+
while ((match = textRegex.exec(xml)) !== null) {
|
|
354
|
+
const start = parseFloat(match[1]);
|
|
355
|
+
let text = this.decodeEntities(match[2].replace(/<[^>]+>/g, ''));
|
|
356
|
+
if (text.trim()) {
|
|
357
|
+
segments.push({ start, text: text.trim() });
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (segments.length === 0)
|
|
362
|
+
return undefined;
|
|
363
|
+
const groups = this.groupTranscriptSegments(segments);
|
|
364
|
+
const { html, text } = (0, transcript_1.buildTranscript)('youtube', groups, chapters);
|
|
365
|
+
return { html, text, languageCode };
|
|
366
|
+
}
|
|
367
|
+
decodeEntities(text) {
|
|
368
|
+
return text
|
|
369
|
+
.replace(/&/g, '&')
|
|
370
|
+
.replace(/</g, '<')
|
|
371
|
+
.replace(/>/g, '>')
|
|
372
|
+
.replace(/"/g, '"')
|
|
373
|
+
.replace(/'/g, "'")
|
|
374
|
+
.replace(/'/g, "'")
|
|
375
|
+
.replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => String.fromCodePoint(parseInt(hex, 16)))
|
|
376
|
+
.replace(/&#(\d+);/g, (_, dec) => String.fromCodePoint(parseInt(dec, 10)));
|
|
377
|
+
}
|
|
131
378
|
getVideoId() {
|
|
132
379
|
const url = new URL(this.url);
|
|
133
380
|
if (url.hostname === 'youtu.be') {
|
|
@@ -135,6 +382,159 @@ class YoutubeExtractor extends _base_1.BaseExtractor {
|
|
|
135
382
|
}
|
|
136
383
|
return new URLSearchParams(url.search).get('v') || '';
|
|
137
384
|
}
|
|
385
|
+
/**
|
|
386
|
+
* Group raw transcript segments into readable blocks.
|
|
387
|
+
* If speaker markers (>>) are present, groups by speaker turn.
|
|
388
|
+
* Otherwise, groups by sentence boundaries.
|
|
389
|
+
*/
|
|
390
|
+
groupTranscriptSegments(segments) {
|
|
391
|
+
if (segments.length === 0)
|
|
392
|
+
return [];
|
|
393
|
+
const hasSpeakerMarkers = segments.some(s => /^>>/.test(s.text));
|
|
394
|
+
return hasSpeakerMarkers
|
|
395
|
+
? this.groupBySpeaker(segments)
|
|
396
|
+
: this.groupBySentence(segments);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Group segments by speaker turns, then by sentences within each turn.
|
|
400
|
+
* Each ">>" marker starts a new speaker turn (with blank line separation).
|
|
401
|
+
* Within a turn, text is split at sentence boundaries for readability.
|
|
402
|
+
* Tracks alternating speaker identity (0/1).
|
|
403
|
+
*/
|
|
404
|
+
groupBySpeaker(segments) {
|
|
405
|
+
// First pass: collect segments into speaker turns
|
|
406
|
+
const turns = [];
|
|
407
|
+
let currentTurn = null;
|
|
408
|
+
let speakerIndex = -1;
|
|
409
|
+
let prevSegText = '';
|
|
410
|
+
for (const seg of segments) {
|
|
411
|
+
const isSpeakerChange = /^>>/.test(seg.text);
|
|
412
|
+
const cleanText = seg.text.replace(/^>>\s*/, '');
|
|
413
|
+
// Only treat >> as a real speaker change if the previous segment
|
|
414
|
+
// ended at a sentence boundary — otherwise it's a mid-sentence
|
|
415
|
+
// false positive from auto-captions
|
|
416
|
+
const prevEndsWithComma = /,\s*$/.test(prevSegText);
|
|
417
|
+
const prevEndedSentence = (SENTENCE_END.test(prevSegText) || !prevSegText) && !prevEndsWithComma;
|
|
418
|
+
const isRealSpeakerChange = isSpeakerChange && prevEndedSentence;
|
|
419
|
+
if (isRealSpeakerChange) {
|
|
420
|
+
if (currentTurn)
|
|
421
|
+
turns.push(currentTurn);
|
|
422
|
+
speakerIndex = (speakerIndex + 1) % 2;
|
|
423
|
+
currentTurn = { start: seg.start, segments: [{ start: seg.start, text: cleanText }], speakerChange: true, speaker: speakerIndex };
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
if (!currentTurn) {
|
|
427
|
+
currentTurn = { start: seg.start, segments: [], speakerChange: false };
|
|
428
|
+
}
|
|
429
|
+
currentTurn.segments.push({ start: seg.start, text: cleanText });
|
|
430
|
+
}
|
|
431
|
+
prevSegText = cleanText;
|
|
432
|
+
}
|
|
433
|
+
if (currentTurn)
|
|
434
|
+
turns.push(currentTurn);
|
|
435
|
+
// Split turns that start with a short affirmative (e.g. "Mhm.", "Yeah.")
|
|
436
|
+
// followed by longer text — the affirmative is likely the other speaker
|
|
437
|
+
this.splitAffirmativeTurns(turns);
|
|
438
|
+
// Second pass: split each turn into sentence groups
|
|
439
|
+
const groups = [];
|
|
440
|
+
for (const turn of turns) {
|
|
441
|
+
const sentenceGroups = this.groupBySentence(turn.segments);
|
|
442
|
+
for (let i = 0; i < sentenceGroups.length; i++) {
|
|
443
|
+
groups.push({
|
|
444
|
+
...sentenceGroups[i],
|
|
445
|
+
speakerChange: i === 0 && turn.speakerChange,
|
|
446
|
+
speaker: turn.speaker,
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return groups;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Split turns that start with a short affirmative response (e.g. "Mhm.", "Yeah.")
|
|
454
|
+
* followed by longer content. The affirmative belongs to the current speaker,
|
|
455
|
+
* but the rest is likely the other speaker (missed diarization in auto-captions).
|
|
456
|
+
*/
|
|
457
|
+
splitAffirmativeTurns(turns) {
|
|
458
|
+
const affirmativePattern = /^(mhm|yeah|yes|yep|right|okay|ok|absolutely|sure|exactly|uh-huh|mm-hmm)[.!,]?\s+/i;
|
|
459
|
+
for (let i = 0; i < turns.length; i++) {
|
|
460
|
+
const turn = turns[i];
|
|
461
|
+
if (turn.speaker === undefined || turn.segments.length === 0)
|
|
462
|
+
continue;
|
|
463
|
+
const firstSeg = turn.segments[0];
|
|
464
|
+
const match = affirmativePattern.exec(firstSeg.text);
|
|
465
|
+
if (!match)
|
|
466
|
+
continue;
|
|
467
|
+
// Don't split if the affirmative ends with a comma — the speaker is continuing
|
|
468
|
+
if (/,\s*$/.test(match[0]))
|
|
469
|
+
continue;
|
|
470
|
+
// Check that there's substantial content after the affirmative
|
|
471
|
+
// Only split when the remainder is long enough to be a different speaker's
|
|
472
|
+
// response, not just the same speaker continuing after an affirmative
|
|
473
|
+
const remainder = firstSeg.text.slice(match[0].length).trim();
|
|
474
|
+
const restSegments = turn.segments.slice(1);
|
|
475
|
+
const restWords = remainder.split(/\s+/).filter(w => w).length
|
|
476
|
+
+ restSegments.reduce((sum, s) => sum + s.text.split(/\s+/).length, 0);
|
|
477
|
+
if (restWords < 30)
|
|
478
|
+
continue;
|
|
479
|
+
// Split: keep affirmative in current turn, move rest to new turn with flipped speaker
|
|
480
|
+
const affirmativeText = match[0].trimEnd();
|
|
481
|
+
const newRestSegments = remainder
|
|
482
|
+
? [{ start: firstSeg.start, text: remainder }, ...restSegments]
|
|
483
|
+
: restSegments;
|
|
484
|
+
const affirmativeTurn = {
|
|
485
|
+
start: turn.start,
|
|
486
|
+
segments: [{ start: firstSeg.start, text: affirmativeText }],
|
|
487
|
+
speakerChange: turn.speakerChange,
|
|
488
|
+
speaker: turn.speaker,
|
|
489
|
+
};
|
|
490
|
+
const restTurn = {
|
|
491
|
+
start: newRestSegments[0].start,
|
|
492
|
+
segments: newRestSegments,
|
|
493
|
+
speakerChange: true,
|
|
494
|
+
speaker: turn.speaker === 0 ? 1 : 0,
|
|
495
|
+
};
|
|
496
|
+
turns.splice(i, 1, affirmativeTurn, restTurn);
|
|
497
|
+
i++; // skip the newly inserted rest turn
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Group segments by sentence boundaries for transcripts without speaker markers.
|
|
502
|
+
* Accumulates text until a segment ends with sentence-ending punctuation (.!?),
|
|
503
|
+
* or until a time gap >5 seconds between segments.
|
|
504
|
+
*/
|
|
505
|
+
groupBySentence(segments) {
|
|
506
|
+
const groups = [];
|
|
507
|
+
let buffer = '';
|
|
508
|
+
let bufferStart = 0;
|
|
509
|
+
let lastStart = 0;
|
|
510
|
+
const flush = () => {
|
|
511
|
+
if (buffer.trim()) {
|
|
512
|
+
groups.push({
|
|
513
|
+
start: bufferStart,
|
|
514
|
+
text: buffer.trim(),
|
|
515
|
+
speakerChange: false,
|
|
516
|
+
});
|
|
517
|
+
buffer = '';
|
|
518
|
+
}
|
|
519
|
+
};
|
|
520
|
+
for (const seg of segments) {
|
|
521
|
+
// Flush on a significant time gap (>5s between segments)
|
|
522
|
+
if (buffer && seg.start - lastStart > 5) {
|
|
523
|
+
flush();
|
|
524
|
+
}
|
|
525
|
+
if (!buffer) {
|
|
526
|
+
bufferStart = seg.start;
|
|
527
|
+
}
|
|
528
|
+
buffer += (buffer ? ' ' : '') + seg.text;
|
|
529
|
+
lastStart = seg.start;
|
|
530
|
+
// Only flush when the segment itself ends with sentence punctuation
|
|
531
|
+
if (SENTENCE_END.test(seg.text)) {
|
|
532
|
+
flush();
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
flush();
|
|
536
|
+
return groups;
|
|
537
|
+
}
|
|
138
538
|
}
|
|
139
539
|
exports.YoutubeExtractor = YoutubeExtractor;
|
|
140
540
|
//# sourceMappingURL=youtube.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/extractors/youtube.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/extractors/youtube.ts"],"names":[],"mappings":"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"}
|