@steipete/summarize-core 0.11.1 → 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.
Files changed (116) hide show
  1. package/dist/esm/content/bun.js +21 -0
  2. package/dist/esm/content/bun.js.map +1 -0
  3. package/dist/esm/content/index.js +1 -0
  4. package/dist/esm/content/index.js.map +1 -1
  5. package/dist/esm/content/link-preview/client.js +6 -0
  6. package/dist/esm/content/link-preview/client.js.map +1 -1
  7. package/dist/esm/content/link-preview/content/fetcher.js +19 -2
  8. package/dist/esm/content/link-preview/content/fetcher.js.map +1 -1
  9. package/dist/esm/content/link-preview/content/firecrawl.js.map +1 -1
  10. package/dist/esm/content/link-preview/content/html.js.map +1 -1
  11. package/dist/esm/content/link-preview/content/index.js +29 -12
  12. package/dist/esm/content/link-preview/content/index.js.map +1 -1
  13. package/dist/esm/content/link-preview/content/utils.js.map +1 -1
  14. package/dist/esm/content/transcript/index.js +2 -0
  15. package/dist/esm/content/transcript/index.js.map +1 -1
  16. package/dist/esm/content/transcript/providers/generic.js +10 -11
  17. package/dist/esm/content/transcript/providers/generic.js.map +1 -1
  18. package/dist/esm/content/transcript/providers/podcast/apple-flow.js.map +1 -1
  19. package/dist/esm/content/transcript/providers/podcast/media.js +9 -1
  20. package/dist/esm/content/transcript/providers/podcast/media.js.map +1 -1
  21. package/dist/esm/content/transcript/providers/podcast/provider-flow.js +157 -0
  22. package/dist/esm/content/transcript/providers/podcast/provider-flow.js.map +1 -0
  23. package/dist/esm/content/transcript/providers/podcast/rss-feed.js +123 -0
  24. package/dist/esm/content/transcript/providers/podcast/rss-feed.js.map +1 -0
  25. package/dist/esm/content/transcript/providers/podcast/rss-transcript.js +113 -0
  26. package/dist/esm/content/transcript/providers/podcast/rss-transcript.js.map +1 -0
  27. package/dist/esm/content/transcript/providers/podcast/rss.js +2 -226
  28. package/dist/esm/content/transcript/providers/podcast/rss.js.map +1 -1
  29. package/dist/esm/content/transcript/providers/podcast/spotify-flow.js.map +1 -1
  30. package/dist/esm/content/transcript/providers/podcast.js +26 -155
  31. package/dist/esm/content/transcript/providers/podcast.js.map +1 -1
  32. package/dist/esm/content/transcript/providers/transcription-capability.js +22 -0
  33. package/dist/esm/content/transcript/providers/transcription-capability.js.map +1 -0
  34. package/dist/esm/content/transcript/providers/transcription-start.js +40 -30
  35. package/dist/esm/content/transcript/providers/transcription-start.js.map +1 -1
  36. package/dist/esm/content/transcript/providers/youtube/api.js +3 -2
  37. package/dist/esm/content/transcript/providers/youtube/api.js.map +1 -1
  38. package/dist/esm/content/transcript/providers/youtube/captions-player.js +173 -0
  39. package/dist/esm/content/transcript/providers/youtube/captions-player.js.map +1 -0
  40. package/dist/esm/content/transcript/providers/youtube/captions-shared.js +8 -0
  41. package/dist/esm/content/transcript/providers/youtube/captions-shared.js.map +1 -0
  42. package/dist/esm/content/transcript/providers/youtube/captions-transcript.js +361 -0
  43. package/dist/esm/content/transcript/providers/youtube/captions-transcript.js.map +1 -0
  44. package/dist/esm/content/transcript/providers/youtube/captions.js +2 -557
  45. package/dist/esm/content/transcript/providers/youtube/captions.js.map +1 -1
  46. package/dist/esm/content/transcript/providers/youtube/provider-flow.js +189 -0
  47. package/dist/esm/content/transcript/providers/youtube/provider-flow.js.map +1 -0
  48. package/dist/esm/content/transcript/providers/youtube/yt-dlp.js +7 -2
  49. package/dist/esm/content/transcript/providers/youtube/yt-dlp.js.map +1 -1
  50. package/dist/esm/content/transcript/providers/youtube.js +42 -194
  51. package/dist/esm/content/transcript/providers/youtube.js.map +1 -1
  52. package/dist/esm/content/transcript/transcription-config.js +24 -4
  53. package/dist/esm/content/transcript/transcription-config.js.map +1 -1
  54. package/dist/esm/content/url.js +3 -3
  55. package/dist/esm/content/url.js.map +1 -1
  56. package/dist/esm/processes.js.map +1 -1
  57. package/dist/esm/prompts/format.js +6 -0
  58. package/dist/esm/prompts/format.js.map +1 -1
  59. package/dist/esm/prompts/link-summary.js +27 -3
  60. package/dist/esm/prompts/link-summary.js.map +1 -1
  61. package/dist/esm/transcription/onnx-cli.js.map +1 -1
  62. package/dist/esm/transcription/whisper/assemblyai.js +132 -0
  63. package/dist/esm/transcription/whisper/assemblyai.js.map +1 -0
  64. package/dist/esm/transcription/whisper/chunking.js +64 -0
  65. package/dist/esm/transcription/whisper/chunking.js.map +1 -0
  66. package/dist/esm/transcription/whisper/cloud-providers.js +69 -0
  67. package/dist/esm/transcription/whisper/cloud-providers.js.map +1 -0
  68. package/dist/esm/transcription/whisper/core.js +316 -390
  69. package/dist/esm/transcription/whisper/core.js.map +1 -1
  70. package/dist/esm/transcription/whisper/gemini.js +324 -0
  71. package/dist/esm/transcription/whisper/gemini.js.map +1 -0
  72. package/dist/esm/transcription/whisper/preferences.js +16 -0
  73. package/dist/esm/transcription/whisper/preferences.js.map +1 -0
  74. package/dist/esm/transcription/whisper/provider-setup.js +62 -0
  75. package/dist/esm/transcription/whisper/provider-setup.js.map +1 -0
  76. package/dist/esm/transcription/whisper/remote-provider-attempts.js +189 -0
  77. package/dist/esm/transcription/whisper/remote-provider-attempts.js.map +1 -0
  78. package/dist/esm/transcription/whisper/remote.js +220 -0
  79. package/dist/esm/transcription/whisper/remote.js.map +1 -0
  80. package/dist/esm/transcription/whisper/whisper-cpp.js.map +1 -1
  81. package/dist/types/content/bun.d.ts +6 -0
  82. package/dist/types/content/index.d.ts +1 -0
  83. package/dist/types/content/link-preview/client.d.ts +3 -1
  84. package/dist/types/content/link-preview/content/fetcher.d.ts +1 -1
  85. package/dist/types/content/link-preview/content/html.d.ts +1 -1
  86. package/dist/types/content/link-preview/deps.d.ts +8 -2
  87. package/dist/types/content/link-preview/types.d.ts +1 -1
  88. package/dist/types/content/transcript/providers/podcast/flow-context.d.ts +3 -0
  89. package/dist/types/content/transcript/providers/podcast/media.d.ts +4 -2
  90. package/dist/types/content/transcript/providers/podcast/provider-flow.d.ts +7 -0
  91. package/dist/types/content/transcript/providers/podcast/rss-feed.d.ts +15 -0
  92. package/dist/types/content/transcript/providers/podcast/rss-transcript.d.ts +12 -0
  93. package/dist/types/content/transcript/providers/podcast/rss.d.ts +2 -24
  94. package/dist/types/content/transcript/providers/transcription-capability.d.ts +18 -0
  95. package/dist/types/content/transcript/providers/transcription-start.d.ts +10 -3
  96. package/dist/types/content/transcript/providers/youtube/captions-player.d.ts +12 -0
  97. package/dist/types/content/transcript/providers/youtube/captions-shared.d.ts +42 -0
  98. package/dist/types/content/transcript/providers/youtube/captions-transcript.d.ts +4 -0
  99. package/dist/types/content/transcript/providers/youtube/captions.d.ts +2 -19
  100. package/dist/types/content/transcript/providers/youtube/provider-flow.d.ts +34 -0
  101. package/dist/types/content/transcript/providers/youtube/yt-dlp.d.ts +4 -2
  102. package/dist/types/content/transcript/transcription-config.d.ts +6 -0
  103. package/dist/types/content/transcript/types.d.ts +1 -0
  104. package/dist/types/prompts/format.d.ts +1 -0
  105. package/dist/types/prompts/link-summary.d.ts +2 -1
  106. package/dist/types/transcription/whisper/assemblyai.d.ts +17 -0
  107. package/dist/types/transcription/whisper/chunking.d.ts +11 -0
  108. package/dist/types/transcription/whisper/cloud-providers.d.ts +22 -0
  109. package/dist/types/transcription/whisper/core.d.ts +12 -14
  110. package/dist/types/transcription/whisper/gemini.d.ts +14 -0
  111. package/dist/types/transcription/whisper/preferences.d.ts +4 -0
  112. package/dist/types/transcription/whisper/provider-setup.d.ts +30 -0
  113. package/dist/types/transcription/whisper/remote-provider-attempts.d.ts +51 -0
  114. package/dist/types/transcription/whisper/remote.d.ts +51 -0
  115. package/dist/types/transcription/whisper/types.d.ts +1 -1
  116. package/package.json +9 -9
@@ -1,558 +1,3 @@
1
- import { fetchWithTimeout } from "../../../link-preview/fetch-with-timeout.js";
2
- import { parseTimestampToMs } from "../../timestamps.js";
3
- import { decodeHtmlEntities, sanitizeYoutubeJsonResponse } from "../../utils.js";
4
- import { extractYoutubeiBootstrap } from "./api.js";
5
- const REQUEST_HEADERS = {
6
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
7
- "Accept-Language": "en-US,en;q=0.9",
8
- };
9
- const YT_INITIAL_PLAYER_RESPONSE_TOKEN = "ytInitialPlayerResponse";
10
- const INNERTUBE_API_KEY_REGEX = /"INNERTUBE_API_KEY":"([^"]+)"|INNERTUBE_API_KEY\\":\\"([^\\"]+)\\"/;
11
- function extractBalancedJsonObject(source, startAt) {
12
- // Lightweight "balanced braces" extractor for `... = { ... }` blobs in HTML.
13
- // We intentionally avoid a JS parser/DOM here: the watch page can be huge, and we only need the
14
- // JSON object text. Handles strings + escaping so braces inside strings don't break depth.
15
- const start = source.indexOf("{", startAt);
16
- if (start < 0) {
17
- return null;
18
- }
19
- let depth = 0;
20
- let inString = false;
21
- let quote = null;
22
- let escaping = false;
23
- for (let i = start; i < source.length; i += 1) {
24
- const ch = source[i];
25
- if (!ch) {
26
- continue;
27
- }
28
- if (inString) {
29
- if (escaping) {
30
- escaping = false;
31
- continue;
32
- }
33
- if (ch === "\\") {
34
- escaping = true;
35
- continue;
36
- }
37
- if (quote && ch === quote) {
38
- inString = false;
39
- quote = null;
40
- }
41
- continue;
42
- }
43
- if (ch === '"' || ch === "'") {
44
- inString = true;
45
- quote = ch;
46
- continue;
47
- }
48
- if (ch === "{") {
49
- depth += 1;
50
- continue;
51
- }
52
- if (ch === "}") {
53
- depth -= 1;
54
- if (depth === 0) {
55
- return source.slice(start, i + 1);
56
- }
57
- }
58
- }
59
- return null;
60
- }
61
- function extractInitialPlayerResponse(html) {
62
- // YouTube embeds `ytInitialPlayerResponse = {...};` on the watch page. We grab that payload
63
- // because it often includes caption track metadata (manual + automatic tracks).
64
- const tokenIndex = html.indexOf(YT_INITIAL_PLAYER_RESPONSE_TOKEN);
65
- if (tokenIndex < 0) {
66
- return null;
67
- }
68
- const assignmentIndex = html.indexOf("=", tokenIndex);
69
- if (assignmentIndex < 0) {
70
- return null;
71
- }
72
- const objectText = extractBalancedJsonObject(html, assignmentIndex);
73
- if (!objectText) {
74
- return null;
75
- }
76
- try {
77
- const parsed = JSON.parse(objectText);
78
- return isObjectLike(parsed) ? parsed : null;
79
- }
80
- catch {
81
- return null;
82
- }
83
- }
84
- const isObjectLike = (value) => typeof value === "object" && value !== null;
85
- function coerceDurationSeconds(value) {
86
- const asNumber = typeof value === "number" ? value : typeof value === "string" ? Number(value) : Number.NaN;
87
- if (!Number.isFinite(asNumber) || asNumber <= 0)
88
- return null;
89
- return asNumber;
90
- }
91
- function extractDurationSecondsFromHtml(html) {
92
- const candidates = [
93
- /"lengthSeconds":"(\d+)"/,
94
- /"lengthSeconds":(\d+)/,
95
- /"durationSeconds":"(\d+)"/,
96
- /"durationSeconds":(\d+)/,
97
- ];
98
- for (const pattern of candidates) {
99
- const match = html.match(pattern);
100
- if (!match?.[1])
101
- continue;
102
- const value = Number(match[1]);
103
- if (Number.isFinite(value) && value > 0)
104
- return value;
105
- }
106
- return null;
107
- }
108
- export function extractYoutubeDurationSeconds(html) {
109
- const playerResponse = extractInitialPlayerResponse(html);
110
- if (playerResponse) {
111
- const duration = extractDurationSecondsFromPlayerPayload(playerResponse);
112
- if (duration)
113
- return duration;
114
- }
115
- return extractDurationSecondsFromHtml(html);
116
- }
117
- function extractInnertubeApiKey(html) {
118
- const match = html.match(INNERTUBE_API_KEY_REGEX);
119
- const key = match?.[1] ?? match?.[2] ?? null;
120
- return typeof key === "string" && key.trim().length > 0 ? key.trim() : null;
121
- }
122
- function extractDurationSecondsFromPlayerPayload(payload) {
123
- const videoDetails = payload.videoDetails;
124
- if (isObjectLike(videoDetails)) {
125
- const duration = coerceDurationSeconds(videoDetails.lengthSeconds);
126
- if (duration)
127
- return duration;
128
- }
129
- const microformat = payload.microformat;
130
- if (isObjectLike(microformat)) {
131
- const renderer = microformat.playerMicroformatRenderer;
132
- if (isObjectLike(renderer)) {
133
- const duration = coerceDurationSeconds(renderer.lengthSeconds);
134
- if (duration)
135
- return duration;
136
- }
137
- }
138
- return null;
139
- }
140
- async function fetchYoutubePlayerPayload(fetchImpl, { html, videoId }) {
141
- const apiKey = extractInnertubeApiKey(html);
142
- if (!apiKey)
143
- return null;
144
- try {
145
- const userAgent = REQUEST_HEADERS["User-Agent"] ??
146
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36";
147
- const response = await fetchWithTimeout(fetchImpl, `https://www.youtube.com/youtubei/v1/player?key=${apiKey}`, {
148
- method: "POST",
149
- headers: {
150
- "Content-Type": "application/json",
151
- "User-Agent": userAgent,
152
- "Accept-Language": REQUEST_HEADERS["Accept-Language"] ?? "en-US,en;q=0.9",
153
- Accept: "application/json",
154
- },
155
- body: JSON.stringify({
156
- context: {
157
- client: {
158
- clientName: "ANDROID",
159
- clientVersion: "20.10.38",
160
- },
161
- },
162
- videoId,
163
- }),
164
- });
165
- if (!response.ok)
166
- return null;
167
- const parsed = await response.json();
168
- return isObjectLike(parsed) ? parsed : null;
169
- }
170
- catch {
171
- return null;
172
- }
173
- }
174
- export async function fetchYoutubeDurationSecondsViaPlayer(fetchImpl, { html, videoId }) {
175
- const payload = await fetchYoutubePlayerPayload(fetchImpl, { html, videoId });
176
- if (!payload)
177
- return null;
178
- return extractDurationSecondsFromPlayerPayload(payload);
179
- }
180
- async function fetchTranscriptViaAndroidPlayer(fetchImpl, { html, videoId, skipAutoGenerated, }) {
181
- // Fallback path: request the player payload via an "ANDROID" client.
182
- // This often works when the web bootstrap is missing/obfuscated, but may skew towards auto
183
- // captions; we pass skipAutoGenerated through to keep "no-auto" strict.
184
- const apiKey = extractInnertubeApiKey(html);
185
- if (!apiKey) {
186
- return null;
187
- }
188
- try {
189
- const userAgent = REQUEST_HEADERS["User-Agent"] ??
190
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36";
191
- const response = await fetchWithTimeout(fetchImpl, `https://www.youtube.com/youtubei/v1/player?key=${apiKey}`, {
192
- method: "POST",
193
- headers: {
194
- "Content-Type": "application/json",
195
- "User-Agent": userAgent,
196
- "Accept-Language": REQUEST_HEADERS["Accept-Language"] ?? "en-US,en;q=0.9",
197
- Accept: "application/json",
198
- },
199
- body: JSON.stringify({
200
- context: {
201
- client: {
202
- clientName: "ANDROID",
203
- clientVersion: "20.10.38",
204
- },
205
- },
206
- videoId,
207
- }),
208
- });
209
- if (!response.ok) {
210
- return null;
211
- }
212
- const parsed = await response.json();
213
- if (!isObjectLike(parsed)) {
214
- return null;
215
- }
216
- return await extractTranscriptFromPlayerPayload(fetchImpl, parsed, skipAutoGenerated);
217
- }
218
- catch {
219
- return null;
220
- }
221
- }
222
- export const fetchTranscriptFromCaptionTracks = async (fetchImpl, { html, originalUrl, videoId, skipAutoGenerated, }) => {
223
- const initialPlayerResponse = extractInitialPlayerResponse(html);
224
- if (initialPlayerResponse) {
225
- const transcript = await extractTranscriptFromPlayerPayload(fetchImpl, initialPlayerResponse, skipAutoGenerated);
226
- if (transcript) {
227
- return transcript;
228
- }
229
- }
230
- const bootstrap = extractYoutubeiBootstrap(html);
231
- if (!bootstrap) {
232
- return await fetchTranscriptViaAndroidPlayer(fetchImpl, { html, videoId, skipAutoGenerated });
233
- }
234
- const { apiKey, clientName, clientVersion, context, pageCl, pageLabel, visitorData, xsrfToken } = bootstrap;
235
- if (!apiKey) {
236
- return await fetchTranscriptViaAndroidPlayer(fetchImpl, { html, videoId, skipAutoGenerated });
237
- }
238
- const contextRecord = context;
239
- const clientContext = isObjectLike(contextRecord.client)
240
- ? contextRecord.client
241
- : {};
242
- const requestBody = {
243
- context: {
244
- ...contextRecord,
245
- client: {
246
- ...clientContext,
247
- originalUrl,
248
- },
249
- },
250
- videoId,
251
- playbackContext: {
252
- contentPlaybackContext: {
253
- html5Preference: "HTML5_PREF_WANTS",
254
- },
255
- },
256
- contentCheckOk: true,
257
- racyCheckOk: true,
258
- };
259
- try {
260
- const userAgent = REQUEST_HEADERS["User-Agent"] ??
261
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36";
262
- const headers = {
263
- "Content-Type": "application/json",
264
- "User-Agent": userAgent,
265
- Accept: "application/json",
266
- Origin: "https://www.youtube.com",
267
- Referer: originalUrl,
268
- "X-Goog-AuthUser": "0",
269
- "X-Youtube-Bootstrap-Logged-In": "false",
270
- };
271
- if (clientName) {
272
- headers["X-Youtube-Client-Name"] = clientName;
273
- }
274
- if (clientVersion) {
275
- headers["X-Youtube-Client-Version"] = clientVersion;
276
- }
277
- if (visitorData) {
278
- headers["X-Goog-Visitor-Id"] = visitorData;
279
- }
280
- if (typeof pageCl === "number" && Number.isFinite(pageCl)) {
281
- headers["X-Youtube-Page-CL"] = String(pageCl);
282
- }
283
- if (pageLabel) {
284
- headers["X-Youtube-Page-Label"] = pageLabel;
285
- }
286
- if (xsrfToken) {
287
- headers["X-Youtube-Identity-Token"] = xsrfToken;
288
- }
289
- const response = await fetchWithTimeout(fetchImpl, `https://www.youtube.com/youtubei/v1/player?key=${apiKey}`, {
290
- method: "POST",
291
- headers,
292
- body: JSON.stringify(requestBody),
293
- });
294
- if (!response.ok) {
295
- return await fetchTranscriptViaAndroidPlayer(fetchImpl, { html, videoId, skipAutoGenerated });
296
- }
297
- const raw = await response.text();
298
- // YouTube sometimes wraps JSON in XSSI guards / odd escaping; sanitize before parsing.
299
- const sanitized = sanitizeYoutubeJsonResponse(raw);
300
- const parsed = JSON.parse(sanitized);
301
- if (!isObjectLike(parsed)) {
302
- return await fetchTranscriptViaAndroidPlayer(fetchImpl, { html, videoId, skipAutoGenerated });
303
- }
304
- const transcript = await extractTranscriptFromPlayerPayload(fetchImpl, parsed, skipAutoGenerated);
305
- if (transcript) {
306
- return transcript;
307
- }
308
- return await fetchTranscriptViaAndroidPlayer(fetchImpl, { html, videoId, skipAutoGenerated });
309
- }
310
- catch {
311
- return await fetchTranscriptViaAndroidPlayer(fetchImpl, { html, videoId, skipAutoGenerated });
312
- }
313
- };
314
- const extractTranscriptFromPlayerPayload = async (fetchImpl, payload, skipAutoGenerated) => {
315
- const payloadRecord = payload;
316
- const captionsCandidate = payloadRecord.captions;
317
- const captions = isObjectLike(captionsCandidate) ? captionsCandidate : null;
318
- const rendererCandidate = (captions ? captions.playerCaptionsTracklistRenderer : null) ??
319
- payloadRecord.playerCaptionsTracklistRenderer;
320
- const renderer = isObjectLike(rendererCandidate)
321
- ? rendererCandidate
322
- : null;
323
- const captionTracks = Array.isArray(renderer?.captionTracks)
324
- ? renderer?.captionTracks
325
- : null;
326
- const automaticTracks = Array.isArray(renderer?.automaticCaptions)
327
- ? renderer?.automaticCaptions
328
- : null;
329
- const orderedTracks = [];
330
- if (captionTracks) {
331
- orderedTracks.push(...captionTracks.filter((track) => isObjectLike(track)));
332
- }
333
- if (!skipAutoGenerated && automaticTracks) {
334
- // In "no-auto" mode, we *exclude* `automaticCaptions` entirely (not just kind==="asr") so
335
- // "creator captions only" stays true even when YouTube mixes track types.
336
- orderedTracks.push(...automaticTracks.filter((track) => isObjectLike(track)));
337
- }
338
- const filteredTracks = orderedTracks.filter((track) => isObjectLike(track));
339
- const sortedTracks = [...filteredTracks].toSorted((a, b) => {
340
- const aTrack = a;
341
- const bTrack = b;
342
- const aKind = typeof aTrack.kind === "string" ? aTrack.kind : "";
343
- const bKind = typeof bTrack.kind === "string" ? bTrack.kind : "";
344
- // Prefer manual captions over auto-generated (ASR).
345
- if (aKind === "asr" && bKind !== "asr") {
346
- return 1;
347
- }
348
- if (bKind === "asr" && aKind !== "asr") {
349
- return -1;
350
- }
351
- const aLang = typeof aTrack.languageCode === "string" ? aTrack.languageCode : "";
352
- const bLang = typeof bTrack.languageCode === "string" ? bTrack.languageCode : "";
353
- const aIsEnglish = aLang === "en" || aLang.startsWith("en-");
354
- const bIsEnglish = bLang === "en" || bLang.startsWith("en-");
355
- if (aIsEnglish && !bIsEnglish) {
356
- return -1;
357
- }
358
- if (bIsEnglish && !aIsEnglish) {
359
- return 1;
360
- }
361
- return 0;
362
- });
363
- // De-dupe after sorting so manual/English wins within each language.
364
- const seenLanguages = new Set();
365
- const normalizedTracks = [];
366
- for (const candidate of sortedTracks) {
367
- const trackRecord = candidate;
368
- const languageCandidate = trackRecord.languageCode;
369
- const lang = typeof languageCandidate === "string" ? languageCandidate.toLowerCase() : "";
370
- if (lang && seenLanguages.has(lang)) {
371
- continue;
372
- }
373
- if (lang) {
374
- seenLanguages.add(lang);
375
- }
376
- normalizedTracks.push(candidate);
377
- }
378
- // Filter out auto-generated tracks if skipAutoGenerated is true
379
- const tracksToUse = skipAutoGenerated
380
- ? normalizedTracks.filter((track) => {
381
- const t = track;
382
- return t.kind !== "asr";
383
- })
384
- : normalizedTracks;
385
- if (tracksToUse.length === 0) {
386
- return null;
387
- }
388
- return await findFirstTranscript(fetchImpl, tracksToUse, 0);
389
- };
390
- const findFirstTranscript = async (fetchImpl, tracks, index) => {
391
- if (index >= tracks.length) {
392
- return null;
393
- }
394
- const candidate = await downloadCaptionTrack(fetchImpl, tracks[index] ?? {});
395
- if (candidate) {
396
- return candidate;
397
- }
398
- return findFirstTranscript(fetchImpl, tracks, index + 1);
399
- };
400
- const downloadCaptionTrack = async (fetchImpl, track) => {
401
- const trackRecord = track;
402
- const baseUrl = typeof trackRecord.baseUrl === "string"
403
- ? trackRecord.baseUrl
404
- : typeof trackRecord.url === "string"
405
- ? trackRecord.url
406
- : null;
407
- if (!baseUrl) {
408
- return null;
409
- }
410
- const json3Url = (() => {
411
- try {
412
- const parsed = new URL(baseUrl);
413
- parsed.searchParams.set("fmt", "json3");
414
- parsed.searchParams.set("alt", "json");
415
- return parsed.toString();
416
- }
417
- catch {
418
- const separator = baseUrl.includes("?") ? "&" : "?";
419
- return `${baseUrl}${separator}fmt=json3&alt=json`;
420
- }
421
- })();
422
- try {
423
- const response = await fetchWithTimeout(fetchImpl, json3Url, {
424
- headers: REQUEST_HEADERS,
425
- });
426
- if (!response.ok) {
427
- return await downloadXmlTranscript(fetchImpl, baseUrl);
428
- }
429
- const text = await response.text();
430
- if (text.length === 0) {
431
- return await downloadXmlTranscript(fetchImpl, baseUrl);
432
- }
433
- const jsonResult = parseJsonTranscript(text);
434
- if (jsonResult) {
435
- return jsonResult;
436
- }
437
- const xmlFallback = parseXmlTranscript(text);
438
- if (xmlFallback) {
439
- return xmlFallback;
440
- }
441
- return await downloadXmlTranscript(fetchImpl, baseUrl);
442
- }
443
- catch {
444
- return await downloadXmlTranscript(fetchImpl, baseUrl);
445
- }
446
- };
447
- const downloadXmlTranscript = async (fetchImpl, baseUrl) => {
448
- const xmlUrl = baseUrl.replaceAll(/&fmt=[^&]+/g, "");
449
- try {
450
- const response = await fetchWithTimeout(fetchImpl, xmlUrl, { headers: REQUEST_HEADERS });
451
- if (!response.ok) {
452
- return null;
453
- }
454
- const text = await response.text();
455
- const jsonResult = parseJsonTranscript(text);
456
- if (jsonResult) {
457
- return jsonResult;
458
- }
459
- return parseXmlTranscript(text);
460
- }
461
- catch {
462
- return null;
463
- }
464
- };
465
- const parseJsonTranscript = (raw) => {
466
- try {
467
- const parsed = JSON.parse(raw);
468
- if (!isObjectLike(parsed)) {
469
- return null;
470
- }
471
- const payloadRecord = parsed;
472
- const eventsUnknown = payloadRecord.events;
473
- if (!Array.isArray(eventsUnknown)) {
474
- return null;
475
- }
476
- const events = eventsUnknown;
477
- const lines = [];
478
- const segments = [];
479
- for (const event of events) {
480
- if (!isObjectLike(event)) {
481
- continue;
482
- }
483
- const eventRecord = event;
484
- const segs = Array.isArray(eventRecord.segs) ? eventRecord.segs : null;
485
- if (!segs) {
486
- continue;
487
- }
488
- const text = segs
489
- .map((seg) => {
490
- if (!isObjectLike(seg)) {
491
- return "";
492
- }
493
- const segRecord = seg;
494
- return typeof segRecord.utf8 === "string" ? segRecord.utf8 : "";
495
- })
496
- .join("")
497
- .trim();
498
- if (text.length > 0) {
499
- lines.push(text);
500
- const startMs = parseTimestampToMs(eventRecord.tStartMs, false);
501
- const durationMs = parseTimestampToMs(eventRecord.dDurationMs, false);
502
- if (startMs != null) {
503
- segments.push({
504
- startMs,
505
- endMs: durationMs != null ? startMs + durationMs : null,
506
- text: text.replace(/\s+/g, " ").trim(),
507
- });
508
- }
509
- }
510
- }
511
- const transcript = lines.join("\n").trim();
512
- if (transcript.length === 0) {
513
- return null;
514
- }
515
- return {
516
- text: transcript,
517
- segments: segments.length > 0 ? segments : null,
518
- };
519
- }
520
- catch {
521
- return null;
522
- }
523
- };
524
- const parseXmlTranscript = (xml) => {
525
- const pattern = /<text[^>]*>([\s\S]*?)<\/text>/gi;
526
- const lines = [];
527
- const segments = [];
528
- let match = pattern.exec(xml);
529
- while (match) {
530
- const content = match[1] ?? "";
531
- const decoded = decodeHtmlEntities(content).replaceAll(/\s+/g, " ").trim();
532
- if (decoded.length > 0) {
533
- lines.push(decoded);
534
- const tag = match[0] ?? "";
535
- const startMatch = tag.match(/\bstart\s*=\s*(['"])([^'"]+)\1/i);
536
- const durMatch = tag.match(/\bdur\s*=\s*(['"])([^'"]+)\1/i);
537
- const startMs = startMatch?.[2] ? parseTimestampToMs(startMatch[2], true) : null;
538
- const durationMs = durMatch?.[2] ? parseTimestampToMs(durMatch[2], true) : null;
539
- if (startMs != null) {
540
- segments.push({
541
- startMs,
542
- endMs: durationMs != null ? startMs + durationMs : null,
543
- text: decoded.replace(/\s+/g, " ").trim(),
544
- });
545
- }
546
- }
547
- match = pattern.exec(xml);
548
- }
549
- const transcript = lines.join("\n").trim();
550
- if (transcript.length === 0) {
551
- return null;
552
- }
553
- return {
554
- text: transcript,
555
- segments: segments.length > 0 ? segments : null,
556
- };
557
- };
1
+ export { extractYoutubeDurationSeconds, fetchYoutubeDurationSecondsViaPlayer, } from "./captions-player.js";
2
+ export { fetchTranscriptFromCaptionTracks } from "./captions-transcript.js";
558
3
  //# sourceMappingURL=captions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"captions.js","sourceRoot":"","sources":["../../../../../../src/content/transcript/providers/youtube/captions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"captions.js","sourceRoot":"","sources":["../../../../../../src/content/transcript/providers/youtube/captions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,oCAAoC,GACrC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gCAAgC,EAAE,MAAM,0BAA0B,CAAC"}