@steipete/summarize 0.1.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 (174) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/LICENSE +21 -0
  3. package/README.md +185 -0
  4. package/dist/cli.cjs +74333 -0
  5. package/dist/cli.cjs.map +7 -0
  6. package/dist/esm/cli-main.js +80 -0
  7. package/dist/esm/cli-main.js.map +1 -0
  8. package/dist/esm/cli.js +18 -0
  9. package/dist/esm/cli.js.map +1 -0
  10. package/dist/esm/config.js +33 -0
  11. package/dist/esm/config.js.map +1 -0
  12. package/dist/esm/content/asset.js +167 -0
  13. package/dist/esm/content/asset.js.map +1 -0
  14. package/dist/esm/content/index.js +4 -0
  15. package/dist/esm/content/index.js.map +1 -0
  16. package/dist/esm/content/link-preview/client.js +20 -0
  17. package/dist/esm/content/link-preview/client.js.map +1 -0
  18. package/dist/esm/content/link-preview/content/article.js +150 -0
  19. package/dist/esm/content/link-preview/content/article.js.map +1 -0
  20. package/dist/esm/content/link-preview/content/cleaner.js +55 -0
  21. package/dist/esm/content/link-preview/content/cleaner.js.map +1 -0
  22. package/dist/esm/content/link-preview/content/fetcher.js +120 -0
  23. package/dist/esm/content/link-preview/content/fetcher.js.map +1 -0
  24. package/dist/esm/content/link-preview/content/index.js +275 -0
  25. package/dist/esm/content/link-preview/content/index.js.map +1 -0
  26. package/dist/esm/content/link-preview/content/parsers.js +77 -0
  27. package/dist/esm/content/link-preview/content/parsers.js.map +1 -0
  28. package/dist/esm/content/link-preview/content/types.js +4 -0
  29. package/dist/esm/content/link-preview/content/types.js.map +1 -0
  30. package/dist/esm/content/link-preview/content/utils.js +127 -0
  31. package/dist/esm/content/link-preview/content/utils.js.map +1 -0
  32. package/dist/esm/content/link-preview/content/youtube.js +82 -0
  33. package/dist/esm/content/link-preview/content/youtube.js.map +1 -0
  34. package/dist/esm/content/link-preview/deps.js +2 -0
  35. package/dist/esm/content/link-preview/deps.js.map +1 -0
  36. package/dist/esm/content/link-preview/fetch-with-timeout.js +35 -0
  37. package/dist/esm/content/link-preview/fetch-with-timeout.js.map +1 -0
  38. package/dist/esm/content/link-preview/transcript/cache.js +73 -0
  39. package/dist/esm/content/link-preview/transcript/cache.js.map +1 -0
  40. package/dist/esm/content/link-preview/transcript/index.js +95 -0
  41. package/dist/esm/content/link-preview/transcript/index.js.map +1 -0
  42. package/dist/esm/content/link-preview/transcript/normalize.js +43 -0
  43. package/dist/esm/content/link-preview/transcript/normalize.js.map +1 -0
  44. package/dist/esm/content/link-preview/transcript/providers/generic.js +11 -0
  45. package/dist/esm/content/link-preview/transcript/providers/generic.js.map +1 -0
  46. package/dist/esm/content/link-preview/transcript/providers/podcast.js +12 -0
  47. package/dist/esm/content/link-preview/transcript/providers/podcast.js.map +1 -0
  48. package/dist/esm/content/link-preview/transcript/providers/twitter.js +12 -0
  49. package/dist/esm/content/link-preview/transcript/providers/twitter.js.map +1 -0
  50. package/dist/esm/content/link-preview/transcript/providers/youtube/api.js +257 -0
  51. package/dist/esm/content/link-preview/transcript/providers/youtube/api.js.map +1 -0
  52. package/dist/esm/content/link-preview/transcript/providers/youtube/apify.js +55 -0
  53. package/dist/esm/content/link-preview/transcript/providers/youtube/apify.js.map +1 -0
  54. package/dist/esm/content/link-preview/transcript/providers/youtube/captions.js +409 -0
  55. package/dist/esm/content/link-preview/transcript/providers/youtube/captions.js.map +1 -0
  56. package/dist/esm/content/link-preview/transcript/providers/youtube/ytdlp.js +114 -0
  57. package/dist/esm/content/link-preview/transcript/providers/youtube/ytdlp.js.map +1 -0
  58. package/dist/esm/content/link-preview/transcript/providers/youtube.js +74 -0
  59. package/dist/esm/content/link-preview/transcript/providers/youtube.js.map +1 -0
  60. package/dist/esm/content/link-preview/transcript/types.js +2 -0
  61. package/dist/esm/content/link-preview/transcript/types.js.map +1 -0
  62. package/dist/esm/content/link-preview/transcript/utils.js +193 -0
  63. package/dist/esm/content/link-preview/transcript/utils.js.map +1 -0
  64. package/dist/esm/content/link-preview/types.js +2 -0
  65. package/dist/esm/content/link-preview/types.js.map +1 -0
  66. package/dist/esm/costs.js +57 -0
  67. package/dist/esm/costs.js.map +1 -0
  68. package/dist/esm/firecrawl.js +54 -0
  69. package/dist/esm/firecrawl.js.map +1 -0
  70. package/dist/esm/flags.js +97 -0
  71. package/dist/esm/flags.js.map +1 -0
  72. package/dist/esm/index.js +4 -0
  73. package/dist/esm/index.js.map +1 -0
  74. package/dist/esm/llm/generate-text.js +296 -0
  75. package/dist/esm/llm/generate-text.js.map +1 -0
  76. package/dist/esm/llm/google-models.js +112 -0
  77. package/dist/esm/llm/google-models.js.map +1 -0
  78. package/dist/esm/llm/html-to-markdown.js +44 -0
  79. package/dist/esm/llm/html-to-markdown.js.map +1 -0
  80. package/dist/esm/llm/model-id.js +45 -0
  81. package/dist/esm/llm/model-id.js.map +1 -0
  82. package/dist/esm/pricing/litellm.js +25 -0
  83. package/dist/esm/pricing/litellm.js.map +1 -0
  84. package/dist/esm/prompts/file.js +14 -0
  85. package/dist/esm/prompts/file.js.map +1 -0
  86. package/dist/esm/prompts/index.js +3 -0
  87. package/dist/esm/prompts/index.js.map +1 -0
  88. package/dist/esm/prompts/link-summary.js +105 -0
  89. package/dist/esm/prompts/link-summary.js.map +1 -0
  90. package/dist/esm/run.js +1674 -0
  91. package/dist/esm/run.js.map +1 -0
  92. package/dist/esm/shared/contracts.js +2 -0
  93. package/dist/esm/shared/contracts.js.map +1 -0
  94. package/dist/esm/summarizeHome.js +20 -0
  95. package/dist/esm/summarizeHome.js.map +1 -0
  96. package/dist/esm/tty/live-markdown.js +52 -0
  97. package/dist/esm/tty/live-markdown.js.map +1 -0
  98. package/dist/esm/tty/osc-progress.js +8 -0
  99. package/dist/esm/tty/osc-progress.js.map +1 -0
  100. package/dist/esm/tty/spinner.js +33 -0
  101. package/dist/esm/tty/spinner.js.map +1 -0
  102. package/dist/esm/version.js +44 -0
  103. package/dist/esm/version.js.map +1 -0
  104. package/dist/types/cli-main.d.ts +11 -0
  105. package/dist/types/cli.d.ts +1 -0
  106. package/dist/types/config.d.ts +15 -0
  107. package/dist/types/content/asset.d.ts +44 -0
  108. package/dist/types/content/index.d.ts +4 -0
  109. package/dist/types/content/link-preview/client.d.ts +14 -0
  110. package/dist/types/content/link-preview/content/article.d.ts +4 -0
  111. package/dist/types/content/link-preview/content/cleaner.d.ts +12 -0
  112. package/dist/types/content/link-preview/content/fetcher.d.ts +16 -0
  113. package/dist/types/content/link-preview/content/index.d.ts +4 -0
  114. package/dist/types/content/link-preview/content/parsers.d.ts +7 -0
  115. package/dist/types/content/link-preview/content/types.d.ts +44 -0
  116. package/dist/types/content/link-preview/content/utils.d.ts +16 -0
  117. package/dist/types/content/link-preview/content/youtube.d.ts +1 -0
  118. package/dist/types/content/link-preview/deps.d.ts +70 -0
  119. package/dist/types/content/link-preview/fetch-with-timeout.d.ts +4 -0
  120. package/dist/types/content/link-preview/transcript/cache.d.ts +29 -0
  121. package/dist/types/content/link-preview/transcript/index.d.ts +9 -0
  122. package/dist/types/content/link-preview/transcript/normalize.d.ts +3 -0
  123. package/dist/types/content/link-preview/transcript/providers/generic.d.ts +3 -0
  124. package/dist/types/content/link-preview/transcript/providers/podcast.d.ts +3 -0
  125. package/dist/types/content/link-preview/transcript/providers/twitter.d.ts +3 -0
  126. package/dist/types/content/link-preview/transcript/providers/youtube/api.d.ts +26 -0
  127. package/dist/types/content/link-preview/transcript/providers/youtube/apify.d.ts +1 -0
  128. package/dist/types/content/link-preview/transcript/providers/youtube/captions.d.ts +7 -0
  129. package/dist/types/content/link-preview/transcript/providers/youtube/ytdlp.d.ts +3 -0
  130. package/dist/types/content/link-preview/transcript/providers/youtube.d.ts +3 -0
  131. package/dist/types/content/link-preview/transcript/types.d.ts +23 -0
  132. package/dist/types/content/link-preview/transcript/utils.d.ts +7 -0
  133. package/dist/types/content/link-preview/types.d.ts +36 -0
  134. package/dist/types/costs.d.ts +31 -0
  135. package/dist/types/firecrawl.d.ts +5 -0
  136. package/dist/types/flags.d.ts +23 -0
  137. package/dist/types/index.d.ts +4 -0
  138. package/dist/types/llm/generate-text.d.ts +43 -0
  139. package/dist/types/llm/google-models.d.ts +10 -0
  140. package/dist/types/llm/html-to-markdown.d.ts +15 -0
  141. package/dist/types/llm/model-id.d.ts +14 -0
  142. package/dist/types/pricing/litellm.d.ts +13 -0
  143. package/dist/types/prompts/file.d.ts +6 -0
  144. package/dist/types/prompts/index.d.ts +3 -0
  145. package/dist/types/prompts/link-summary.d.ts +27 -0
  146. package/dist/types/run.d.ts +8 -0
  147. package/dist/types/shared/contracts.d.ts +2 -0
  148. package/dist/types/summarizeHome.d.ts +6 -0
  149. package/dist/types/tty/live-markdown.d.ts +10 -0
  150. package/dist/types/tty/osc-progress.d.ts +3 -0
  151. package/dist/types/tty/spinner.d.ts +10 -0
  152. package/dist/types/version.d.ts +2 -0
  153. package/docs/README.md +11 -0
  154. package/docs/config.md +28 -0
  155. package/docs/extract-only.md +13 -0
  156. package/docs/firecrawl.md +17 -0
  157. package/docs/llm.md +33 -0
  158. package/docs/openai.md +18 -0
  159. package/docs/site/.nojekyll +1 -0
  160. package/docs/site/404.html +37 -0
  161. package/docs/site/assets/site.css +577 -0
  162. package/docs/site/assets/site.js +69 -0
  163. package/docs/site/docs/config.html +73 -0
  164. package/docs/site/docs/extract-only.html +79 -0
  165. package/docs/site/docs/firecrawl.html +72 -0
  166. package/docs/site/docs/index.html +89 -0
  167. package/docs/site/docs/llm.html +70 -0
  168. package/docs/site/docs/openai.html +66 -0
  169. package/docs/site/docs/website.html +70 -0
  170. package/docs/site/docs/youtube.html +62 -0
  171. package/docs/site/index.html +125 -0
  172. package/docs/website.md +27 -0
  173. package/docs/youtube.md +32 -0
  174. package/package.json +76 -0
@@ -0,0 +1,257 @@
1
+ import { fetchWithTimeout } from '../../../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/link-preview/transcript/providers/youtube/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { fetchWithTimeout } from '../../../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/link-preview/transcript/providers/youtube/apify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,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"}