@steipete/summarize-core 0.7.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 (182) hide show
  1. package/README.md +7 -0
  2. package/dist/esm/content/index.js +5 -0
  3. package/dist/esm/content/index.js.map +1 -0
  4. package/dist/esm/content/link-preview/client.js +28 -0
  5. package/dist/esm/content/link-preview/client.js.map +1 -0
  6. package/dist/esm/content/link-preview/content/article.js +155 -0
  7. package/dist/esm/content/link-preview/content/article.js.map +1 -0
  8. package/dist/esm/content/link-preview/content/cleaner.js +55 -0
  9. package/dist/esm/content/link-preview/content/cleaner.js.map +1 -0
  10. package/dist/esm/content/link-preview/content/constants.js +7 -0
  11. package/dist/esm/content/link-preview/content/constants.js.map +1 -0
  12. package/dist/esm/content/link-preview/content/fetcher.js +124 -0
  13. package/dist/esm/content/link-preview/content/fetcher.js.map +1 -0
  14. package/dist/esm/content/link-preview/content/firecrawl.js +86 -0
  15. package/dist/esm/content/link-preview/content/firecrawl.js.map +1 -0
  16. package/dist/esm/content/link-preview/content/html.js +162 -0
  17. package/dist/esm/content/link-preview/content/html.js.map +1 -0
  18. package/dist/esm/content/link-preview/content/index.js +345 -0
  19. package/dist/esm/content/link-preview/content/index.js.map +1 -0
  20. package/dist/esm/content/link-preview/content/jsonld.js +77 -0
  21. package/dist/esm/content/link-preview/content/jsonld.js.map +1 -0
  22. package/dist/esm/content/link-preview/content/parsers.js +77 -0
  23. package/dist/esm/content/link-preview/content/parsers.js.map +1 -0
  24. package/dist/esm/content/link-preview/content/podcast-utils.js +79 -0
  25. package/dist/esm/content/link-preview/content/podcast-utils.js.map +1 -0
  26. package/dist/esm/content/link-preview/content/readability.js +53 -0
  27. package/dist/esm/content/link-preview/content/readability.js.map +1 -0
  28. package/dist/esm/content/link-preview/content/twitter-utils.js +68 -0
  29. package/dist/esm/content/link-preview/content/twitter-utils.js.map +1 -0
  30. package/dist/esm/content/link-preview/content/types.js +4 -0
  31. package/dist/esm/content/link-preview/content/types.js.map +1 -0
  32. package/dist/esm/content/link-preview/content/utils.js +164 -0
  33. package/dist/esm/content/link-preview/content/utils.js.map +1 -0
  34. package/dist/esm/content/link-preview/content/video.js +96 -0
  35. package/dist/esm/content/link-preview/content/video.js.map +1 -0
  36. package/dist/esm/content/link-preview/content/youtube.js +82 -0
  37. package/dist/esm/content/link-preview/content/youtube.js.map +1 -0
  38. package/dist/esm/content/link-preview/deps.js +20 -0
  39. package/dist/esm/content/link-preview/deps.js.map +1 -0
  40. package/dist/esm/content/link-preview/fetch-with-timeout.js +35 -0
  41. package/dist/esm/content/link-preview/fetch-with-timeout.js.map +1 -0
  42. package/dist/esm/content/link-preview/types.js +2 -0
  43. package/dist/esm/content/link-preview/types.js.map +1 -0
  44. package/dist/esm/content/transcript/cache.js +79 -0
  45. package/dist/esm/content/transcript/cache.js.map +1 -0
  46. package/dist/esm/content/transcript/index.js +130 -0
  47. package/dist/esm/content/transcript/index.js.map +1 -0
  48. package/dist/esm/content/transcript/normalize.js +43 -0
  49. package/dist/esm/content/transcript/normalize.js.map +1 -0
  50. package/dist/esm/content/transcript/providers/generic.js +11 -0
  51. package/dist/esm/content/transcript/providers/generic.js.map +1 -0
  52. package/dist/esm/content/transcript/providers/podcast/apple-flow.js +222 -0
  53. package/dist/esm/content/transcript/providers/podcast/apple-flow.js.map +1 -0
  54. package/dist/esm/content/transcript/providers/podcast/apple.js +38 -0
  55. package/dist/esm/content/transcript/providers/podcast/apple.js.map +1 -0
  56. package/dist/esm/content/transcript/providers/podcast/constants.js +8 -0
  57. package/dist/esm/content/transcript/providers/podcast/constants.js.map +1 -0
  58. package/dist/esm/content/transcript/providers/podcast/flow-context.js +2 -0
  59. package/dist/esm/content/transcript/providers/podcast/flow-context.js.map +1 -0
  60. package/dist/esm/content/transcript/providers/podcast/itunes.js +134 -0
  61. package/dist/esm/content/transcript/providers/podcast/itunes.js.map +1 -0
  62. package/dist/esm/content/transcript/providers/podcast/json.js +34 -0
  63. package/dist/esm/content/transcript/providers/podcast/json.js.map +1 -0
  64. package/dist/esm/content/transcript/providers/podcast/media.js +345 -0
  65. package/dist/esm/content/transcript/providers/podcast/media.js.map +1 -0
  66. package/dist/esm/content/transcript/providers/podcast/results.js +28 -0
  67. package/dist/esm/content/transcript/providers/podcast/results.js.map +1 -0
  68. package/dist/esm/content/transcript/providers/podcast/rss.js +253 -0
  69. package/dist/esm/content/transcript/providers/podcast/rss.js.map +1 -0
  70. package/dist/esm/content/transcript/providers/podcast/spotify-flow.js +218 -0
  71. package/dist/esm/content/transcript/providers/podcast/spotify-flow.js.map +1 -0
  72. package/dist/esm/content/transcript/providers/podcast/spotify.js +113 -0
  73. package/dist/esm/content/transcript/providers/podcast/spotify.js.map +1 -0
  74. package/dist/esm/content/transcript/providers/podcast.js +222 -0
  75. package/dist/esm/content/transcript/providers/podcast.js.map +1 -0
  76. package/dist/esm/content/transcript/providers/youtube/api.js +257 -0
  77. package/dist/esm/content/transcript/providers/youtube/api.js.map +1 -0
  78. package/dist/esm/content/transcript/providers/youtube/apify.js +55 -0
  79. package/dist/esm/content/transcript/providers/youtube/apify.js.map +1 -0
  80. package/dist/esm/content/transcript/providers/youtube/captions.js +409 -0
  81. package/dist/esm/content/transcript/providers/youtube/captions.js.map +1 -0
  82. package/dist/esm/content/transcript/providers/youtube/yt-dlp.js +166 -0
  83. package/dist/esm/content/transcript/providers/youtube/yt-dlp.js.map +1 -0
  84. package/dist/esm/content/transcript/providers/youtube.js +173 -0
  85. package/dist/esm/content/transcript/providers/youtube.js.map +1 -0
  86. package/dist/esm/content/transcript/types.js +2 -0
  87. package/dist/esm/content/transcript/types.js.map +1 -0
  88. package/dist/esm/content/transcript/utils.js +259 -0
  89. package/dist/esm/content/transcript/utils.js.map +1 -0
  90. package/dist/esm/index.js +4 -0
  91. package/dist/esm/index.js.map +1 -0
  92. package/dist/esm/language.js +126 -0
  93. package/dist/esm/language.js.map +1 -0
  94. package/dist/esm/prompts/cli.js +20 -0
  95. package/dist/esm/prompts/cli.js.map +1 -0
  96. package/dist/esm/prompts/file.js +48 -0
  97. package/dist/esm/prompts/file.js.map +1 -0
  98. package/dist/esm/prompts/index.js +4 -0
  99. package/dist/esm/prompts/index.js.map +1 -0
  100. package/dist/esm/prompts/link-summary.js +116 -0
  101. package/dist/esm/prompts/link-summary.js.map +1 -0
  102. package/dist/esm/shared/contracts.js +2 -0
  103. package/dist/esm/shared/contracts.js.map +1 -0
  104. package/dist/esm/transcription/whisper/constants.js +8 -0
  105. package/dist/esm/transcription/whisper/constants.js.map +1 -0
  106. package/dist/esm/transcription/whisper/core.js +303 -0
  107. package/dist/esm/transcription/whisper/core.js.map +1 -0
  108. package/dist/esm/transcription/whisper/fal.js +41 -0
  109. package/dist/esm/transcription/whisper/fal.js.map +1 -0
  110. package/dist/esm/transcription/whisper/ffmpeg.js +179 -0
  111. package/dist/esm/transcription/whisper/ffmpeg.js.map +1 -0
  112. package/dist/esm/transcription/whisper/openai.js +47 -0
  113. package/dist/esm/transcription/whisper/openai.js.map +1 -0
  114. package/dist/esm/transcription/whisper/types.js +2 -0
  115. package/dist/esm/transcription/whisper/types.js.map +1 -0
  116. package/dist/esm/transcription/whisper/utils.js +63 -0
  117. package/dist/esm/transcription/whisper/utils.js.map +1 -0
  118. package/dist/esm/transcription/whisper/whisper-cpp.js +227 -0
  119. package/dist/esm/transcription/whisper/whisper-cpp.js.map +1 -0
  120. package/dist/esm/transcription/whisper.js +5 -0
  121. package/dist/esm/transcription/whisper.js.map +1 -0
  122. package/dist/types/content/index.d.ts +5 -0
  123. package/dist/types/content/link-preview/client.d.ts +18 -0
  124. package/dist/types/content/link-preview/content/article.d.ts +4 -0
  125. package/dist/types/content/link-preview/content/cleaner.d.ts +12 -0
  126. package/dist/types/content/link-preview/content/constants.d.ts +6 -0
  127. package/dist/types/content/link-preview/content/fetcher.d.ts +16 -0
  128. package/dist/types/content/link-preview/content/firecrawl.d.ts +14 -0
  129. package/dist/types/content/link-preview/content/html.d.ts +17 -0
  130. package/dist/types/content/link-preview/content/index.d.ts +4 -0
  131. package/dist/types/content/link-preview/content/jsonld.d.ts +6 -0
  132. package/dist/types/content/link-preview/content/parsers.d.ts +7 -0
  133. package/dist/types/content/link-preview/content/podcast-utils.d.ts +7 -0
  134. package/dist/types/content/link-preview/content/readability.d.ts +8 -0
  135. package/dist/types/content/link-preview/content/twitter-utils.d.ts +4 -0
  136. package/dist/types/content/link-preview/content/types.d.ts +61 -0
  137. package/dist/types/content/link-preview/content/utils.d.ts +17 -0
  138. package/dist/types/content/link-preview/content/video.d.ts +5 -0
  139. package/dist/types/content/link-preview/content/youtube.d.ts +1 -0
  140. package/dist/types/content/link-preview/deps.d.ts +167 -0
  141. package/dist/types/content/link-preview/fetch-with-timeout.d.ts +4 -0
  142. package/dist/types/content/link-preview/types.d.ts +37 -0
  143. package/dist/types/content/transcript/cache.d.ts +29 -0
  144. package/dist/types/content/transcript/index.d.ts +9 -0
  145. package/dist/types/content/transcript/normalize.d.ts +3 -0
  146. package/dist/types/content/transcript/providers/generic.d.ts +3 -0
  147. package/dist/types/content/transcript/providers/podcast/apple-flow.d.ts +4 -0
  148. package/dist/types/content/transcript/providers/podcast/apple.d.ts +6 -0
  149. package/dist/types/content/transcript/providers/podcast/constants.d.ts +7 -0
  150. package/dist/types/content/transcript/providers/podcast/flow-context.d.ts +11 -0
  151. package/dist/types/content/transcript/providers/podcast/itunes.d.ts +17 -0
  152. package/dist/types/content/transcript/providers/podcast/json.d.ts +8 -0
  153. package/dist/types/content/transcript/providers/podcast/media.d.ts +42 -0
  154. package/dist/types/content/transcript/providers/podcast/results.d.ts +10 -0
  155. package/dist/types/content/transcript/providers/podcast/rss.d.ts +22 -0
  156. package/dist/types/content/transcript/providers/podcast/spotify-flow.d.ts +3 -0
  157. package/dist/types/content/transcript/providers/podcast/spotify.d.ts +24 -0
  158. package/dist/types/content/transcript/providers/podcast.d.ts +20 -0
  159. package/dist/types/content/transcript/providers/youtube/api.d.ts +26 -0
  160. package/dist/types/content/transcript/providers/youtube/apify.d.ts +1 -0
  161. package/dist/types/content/transcript/providers/youtube/captions.d.ts +7 -0
  162. package/dist/types/content/transcript/providers/youtube/yt-dlp.d.ts +17 -0
  163. package/dist/types/content/transcript/providers/youtube.d.ts +3 -0
  164. package/dist/types/content/transcript/types.d.ts +30 -0
  165. package/dist/types/content/transcript/utils.d.ts +8 -0
  166. package/dist/types/index.d.ts +4 -0
  167. package/dist/types/language.d.ts +25 -0
  168. package/dist/types/prompts/cli.d.ts +10 -0
  169. package/dist/types/prompts/file.d.ts +17 -0
  170. package/dist/types/prompts/index.d.ts +4 -0
  171. package/dist/types/prompts/link-summary.d.ts +29 -0
  172. package/dist/types/shared/contracts.d.ts +2 -0
  173. package/dist/types/transcription/whisper/constants.d.ts +7 -0
  174. package/dist/types/transcription/whisper/core.d.ts +20 -0
  175. package/dist/types/transcription/whisper/fal.d.ts +1 -0
  176. package/dist/types/transcription/whisper/ffmpeg.d.ts +16 -0
  177. package/dist/types/transcription/whisper/openai.d.ts +2 -0
  178. package/dist/types/transcription/whisper/types.d.ts +17 -0
  179. package/dist/types/transcription/whisper/utils.d.ts +5 -0
  180. package/dist/types/transcription/whisper/whisper-cpp.d.ts +9 -0
  181. package/dist/types/transcription/whisper.d.ts +5 -0
  182. package/package.json +54 -0
@@ -0,0 +1,257 @@
1
+ import { fetchWithTimeout } from '../../../link-preview/fetch-with-timeout.js';
2
+ import { extractYoutubeBootstrapConfig, isRecord } from '../../utils.js';
3
+ const REQUEST_HEADERS = {
4
+ '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',
5
+ Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
6
+ 'Accept-Language': 'en-US,en;q=0.9',
7
+ 'Cache-Control': 'no-cache',
8
+ Pragma: 'no-cache',
9
+ };
10
+ const GET_TRANSCRIPT_ENDPOINT_REGEX = /"getTranscriptEndpoint":\{"params":"([^"]+)"\}/;
11
+ export const extractYoutubeiTranscriptConfig = (html) => {
12
+ try {
13
+ const bootstrapConfig = extractYoutubeBootstrapConfig(html);
14
+ if (!bootstrapConfig) {
15
+ return null;
16
+ }
17
+ const parametersMatch = html.match(GET_TRANSCRIPT_ENDPOINT_REGEX);
18
+ if (!parametersMatch) {
19
+ return null;
20
+ }
21
+ const [, parameters] = parametersMatch;
22
+ if (!parameters) {
23
+ return null;
24
+ }
25
+ const typedBootstrap = bootstrapConfig;
26
+ const apiKeyCandidate = typedBootstrap.INNERTUBE_API_KEY;
27
+ const apiKey = typeof apiKeyCandidate === 'string' ? apiKeyCandidate : null;
28
+ const contextCandidate = typedBootstrap.INNERTUBE_CONTEXT;
29
+ const context = isRecord(contextCandidate) ? contextCandidate : null;
30
+ if (!(apiKey && context)) {
31
+ return null;
32
+ }
33
+ const visitorDataCandidate = typedBootstrap.VISITOR_DATA;
34
+ const visitorDataFromBootstrap = typeof visitorDataCandidate === 'string' ? visitorDataCandidate : null;
35
+ const contextClientCandidate = context.client;
36
+ const contextClient = isRecord(contextClientCandidate) ? contextClientCandidate : null;
37
+ const visitorDataFromContext = typeof contextClient?.visitorData === 'string' ? contextClient.visitorData : null;
38
+ const visitorData = visitorDataFromBootstrap ?? visitorDataFromContext;
39
+ const clientNameCandidate = typedBootstrap.INNERTUBE_CONTEXT_CLIENT_NAME;
40
+ const clientName = typeof clientNameCandidate === 'number'
41
+ ? String(clientNameCandidate)
42
+ : typeof clientNameCandidate === 'string'
43
+ ? clientNameCandidate
44
+ : null;
45
+ const clientVersionCandidate = typedBootstrap.INNERTUBE_CONTEXT_CLIENT_VERSION;
46
+ const clientVersion = typeof clientVersionCandidate === 'string' ? clientVersionCandidate : null;
47
+ const pageClCandidate = typedBootstrap.PAGE_CL;
48
+ const pageCl = typeof pageClCandidate === 'number' ? pageClCandidate : null;
49
+ const pageLabelCandidate = typedBootstrap.PAGE_BUILD_LABEL;
50
+ const pageLabel = typeof pageLabelCandidate === 'string' ? pageLabelCandidate : null;
51
+ return {
52
+ apiKey,
53
+ context,
54
+ params: parameters,
55
+ visitorData,
56
+ clientName,
57
+ clientVersion,
58
+ pageCl,
59
+ pageLabel,
60
+ };
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ };
66
+ export const fetchTranscriptFromTranscriptEndpoint = async (fetchImpl, { config, originalUrl, }) => {
67
+ const contextRecord = config.context;
68
+ const existingClient = isRecord(contextRecord.client)
69
+ ? contextRecord.client
70
+ : {};
71
+ const payload = {
72
+ context: {
73
+ ...contextRecord,
74
+ client: {
75
+ ...existingClient,
76
+ originalUrl,
77
+ },
78
+ },
79
+ params: config.params,
80
+ };
81
+ try {
82
+ const userAgent = REQUEST_HEADERS['User-Agent'] ??
83
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36';
84
+ const headers = {
85
+ 'Content-Type': 'application/json',
86
+ 'User-Agent': userAgent,
87
+ Accept: 'application/json',
88
+ Origin: 'https://www.youtube.com',
89
+ Referer: originalUrl,
90
+ 'X-Goog-AuthUser': '0',
91
+ 'X-Youtube-Bootstrap-Logged-In': 'false',
92
+ };
93
+ if (config.clientName) {
94
+ headers['X-Youtube-Client-Name'] = config.clientName;
95
+ }
96
+ if (config.clientVersion) {
97
+ headers['X-Youtube-Client-Version'] = config.clientVersion;
98
+ }
99
+ if (config.visitorData) {
100
+ headers['X-Goog-Visitor-Id'] = config.visitorData;
101
+ }
102
+ if (typeof config.pageCl === 'number' && Number.isFinite(config.pageCl)) {
103
+ headers['X-Youtube-Page-CL'] = String(config.pageCl);
104
+ }
105
+ if (config.pageLabel) {
106
+ headers['X-Youtube-Page-Label'] = config.pageLabel;
107
+ }
108
+ const response = await fetchWithTimeout(fetchImpl, `https://www.youtube.com/youtubei/v1/get_transcript?key=${config.apiKey}`, {
109
+ method: 'POST',
110
+ headers,
111
+ body: JSON.stringify(payload),
112
+ });
113
+ if (!response.ok) {
114
+ return null;
115
+ }
116
+ return extractTranscriptFromTranscriptEndpoint(await response.json());
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ };
122
+ // Type-safe helper functions for YouTube API parsing
123
+ function getNestedProperty(object, path) {
124
+ let current = object;
125
+ for (const key of path) {
126
+ if (!(isRecord(current) && key in current)) {
127
+ return null;
128
+ }
129
+ current = current[key];
130
+ }
131
+ return current;
132
+ }
133
+ function getArrayProperty(object, path) {
134
+ const value = getNestedProperty(object, path);
135
+ return Array.isArray(value) ? value : null;
136
+ }
137
+ export const extractTranscriptFromTranscriptEndpoint = (data) => {
138
+ if (!isRecord(data)) {
139
+ return null;
140
+ }
141
+ const actions = getArrayProperty(data, ['actions']);
142
+ if (!actions || actions.length === 0) {
143
+ return null;
144
+ }
145
+ const updatePanel = getNestedProperty(actions[0], ['updateEngagementPanelAction']);
146
+ if (!updatePanel) {
147
+ return null;
148
+ }
149
+ const transcriptContent = getNestedProperty(updatePanel, ['content']);
150
+ if (!transcriptContent) {
151
+ return null;
152
+ }
153
+ const searchPanel = getNestedProperty(transcriptContent, ['transcriptRenderer']);
154
+ if (!searchPanel) {
155
+ return null;
156
+ }
157
+ const segmentList = getNestedProperty(searchPanel, ['content']);
158
+ if (!segmentList) {
159
+ return null;
160
+ }
161
+ const listRenderer = getNestedProperty(segmentList, ['transcriptSearchPanelRenderer']);
162
+ if (!listRenderer) {
163
+ return null;
164
+ }
165
+ const body = getNestedProperty(listRenderer, ['body']);
166
+ if (!body) {
167
+ return null;
168
+ }
169
+ const segmentBody = getNestedProperty(body, ['transcriptSegmentListRenderer']);
170
+ if (!segmentBody) {
171
+ return null;
172
+ }
173
+ const segments = getArrayProperty(segmentBody, ['initialSegments']);
174
+ if (!segments || segments.length === 0) {
175
+ return null;
176
+ }
177
+ const lines = [];
178
+ for (const segment of segments) {
179
+ const renderer = getNestedProperty(segment, ['transcriptSegmentRenderer']);
180
+ if (!renderer) {
181
+ continue;
182
+ }
183
+ const snippet = getNestedProperty(renderer, ['snippet']);
184
+ if (!snippet) {
185
+ continue;
186
+ }
187
+ const runs = getArrayProperty(snippet, ['runs']);
188
+ if (!runs) {
189
+ continue;
190
+ }
191
+ const text = runs
192
+ .map((value) => {
193
+ if (!isRecord(value)) {
194
+ return '';
195
+ }
196
+ const runRecord = value;
197
+ return typeof runRecord.text === 'string' ? runRecord.text : '';
198
+ })
199
+ .join('')
200
+ .trim();
201
+ if (text.length > 0) {
202
+ lines.push(text);
203
+ }
204
+ }
205
+ if (lines.length === 0) {
206
+ return null;
207
+ }
208
+ return lines.join('\n');
209
+ };
210
+ export const extractYoutubeiBootstrap = (html) => {
211
+ try {
212
+ const bootstrapConfig = extractYoutubeBootstrapConfig(html);
213
+ if (!bootstrapConfig) {
214
+ return null;
215
+ }
216
+ const typedBootstrap = bootstrapConfig;
217
+ const apiKeyCandidate = typedBootstrap.INNERTUBE_API_KEY;
218
+ const apiKey = typeof apiKeyCandidate === 'string' ? apiKeyCandidate : null;
219
+ const contextCandidate = typedBootstrap.INNERTUBE_CONTEXT;
220
+ const context = isRecord(contextCandidate) ? contextCandidate : null;
221
+ const clientVersionCandidate = typedBootstrap.INNERTUBE_CLIENT_VERSION;
222
+ const clientVersion = typeof clientVersionCandidate === 'string' ? clientVersionCandidate : null;
223
+ const clientNameCandidate = typedBootstrap.INNERTUBE_CONTEXT_CLIENT_NAME;
224
+ const clientName = typeof clientNameCandidate === 'number'
225
+ ? String(clientNameCandidate)
226
+ : typeof clientNameCandidate === 'string'
227
+ ? clientNameCandidate
228
+ : null;
229
+ const contextClientCandidate = context.client;
230
+ const contextClient = isRecord(contextClientCandidate) ? contextClientCandidate : null;
231
+ const visitorDataCandidate = contextClient?.visitorData;
232
+ const visitorData = typeof visitorDataCandidate === 'string' ? visitorDataCandidate : null;
233
+ const pageClCandidate = typedBootstrap.PAGE_CL;
234
+ const pageCl = typeof pageClCandidate === 'number' ? pageClCandidate : null;
235
+ const pageLabelCandidate = typedBootstrap.PAGE_BUILD_LABEL;
236
+ const pageLabel = typeof pageLabelCandidate === 'string' ? pageLabelCandidate : null;
237
+ const xsrfCandidate = bootstrapConfig.XSRF_TOKEN;
238
+ const xsrfToken = typeof xsrfCandidate === 'string' ? xsrfCandidate : null;
239
+ if (!context) {
240
+ return null;
241
+ }
242
+ return {
243
+ apiKey,
244
+ context,
245
+ clientVersion,
246
+ clientName,
247
+ visitorData,
248
+ pageCl,
249
+ pageLabel,
250
+ xsrfToken,
251
+ };
252
+ }
253
+ catch {
254
+ return null;
255
+ }
256
+ };
257
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../../../src/content/transcript/providers/youtube/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { fetchWithTimeout } from '../../../link-preview/fetch-with-timeout.js';
2
+ import { isRecord } from '../../utils.js';
3
+ const PINTO_YOUTUBE_TRANSCRIPT_SCRAPER_ACTOR = 'faVsWy9VTSNVIhWpR';
4
+ function normalizePintoTranscript(raw) {
5
+ if (!isRecord(raw))
6
+ return null;
7
+ const data = raw.data;
8
+ if (!Array.isArray(data))
9
+ return null;
10
+ const lines = [];
11
+ for (const item of data) {
12
+ if (!isRecord(item))
13
+ continue;
14
+ const text = typeof item.text === 'string' ? item.text.trim() : '';
15
+ if (text)
16
+ lines.push(text);
17
+ }
18
+ return lines.length > 0 ? lines.join('\n') : null;
19
+ }
20
+ export const fetchTranscriptWithApify = async (fetchImpl, apifyApiToken, url) => {
21
+ if (!apifyApiToken) {
22
+ return null;
23
+ }
24
+ try {
25
+ const response = await fetchWithTimeout(fetchImpl, `https://api.apify.com/v2/acts/${PINTO_YOUTUBE_TRANSCRIPT_SCRAPER_ACTOR}/run-sync-get-dataset-items?token=${apifyApiToken}`, {
26
+ method: 'POST',
27
+ headers: { 'Content-Type': 'application/json' },
28
+ body: JSON.stringify({
29
+ videoUrl: url,
30
+ }),
31
+ }, 45_000);
32
+ if (!response.ok) {
33
+ return null;
34
+ }
35
+ const payload = await response.json();
36
+ if (!Array.isArray(payload)) {
37
+ return null;
38
+ }
39
+ for (const item of payload) {
40
+ if (!isRecord(item)) {
41
+ continue;
42
+ }
43
+ const recordItem = item;
44
+ const normalized = normalizePintoTranscript(recordItem);
45
+ if (normalized) {
46
+ return normalized;
47
+ }
48
+ }
49
+ return null;
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ };
55
+ //# sourceMappingURL=apify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apify.js","sourceRoot":"","sources":["../../../../../../src/content/transcript/providers/youtube/apify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,MAAM,sCAAsC,GAAG,mBAAmB,CAAA;AAMlE,SAAS,wBAAwB,CAAC,GAAY;IAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;IACrB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACrC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAQ;QAC7B,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAClE,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAC3C,SAAuB,EACvB,aAA4B,EAC5B,GAAW,EACa,EAAE;IAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CACrC,SAAS,EACT,iCAAiC,sCAAsC,qCAAqC,aAAa,EAAE,EAC3H;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,QAAQ,EAAE,GAAG;aACd,CAAC;SACH,EACD,MAAM,CACP,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,SAAQ;YACV,CAAC;YACD,MAAM,UAAU,GAAG,IAA2B,CAAA;YAC9C,MAAM,UAAU,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAA;YACvD,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,UAAU,CAAA;YACnB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}