forked from supadata-ai/js
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.ts
More file actions
314 lines (263 loc) · 10.8 KB
/
index.ts
File metadata and controls
314 lines (263 loc) · 10.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
import { Supadata } from '../dist/index.mjs';
import {
YoutubeBatchJob,
YoutubeBatchResults,
SupadataError,
} from '../dist/index.mjs';
// 🟡 Replace with your API key from https://supadata.ai
const API_KEY = 'YOUR_API_KEY';
async function main() {
try {
// Initialize the client
const supadata = new Supadata({
apiKey: API_KEY,
});
// Example 1: Get metadata from any platform
console.log('\nℹ️ Getting metadata from YouTube...');
const youtubeMetadata = await supadata.metadata({
url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
});
console.log('ℹ️ YouTube Metadata:', youtubeMetadata);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 2: Get metadata from TikTok
console.log('\nℹ️ Getting metadata from TikTok...');
const tiktokMetadata = await supadata.metadata({
url: 'https://www.tiktok.com/@subwaytakes/video/7520266642375331103',
});
console.log('ℹ️ TikTok Metadata:', tiktokMetadata);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 3: Extract structured data from video
console.log('\nℹ️ Extracting structured data from YouTube video...');
const extractJob = await supadata.extract({
url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
prompt: 'Extract the main topics and key takeaways',
});
console.log(`ℹ️ Started extract job: ${extractJob.jobId}`);
// Poll for extract results
{
let attempts = 0;
const maxAttempts = 5;
while (attempts < maxAttempts) {
attempts++;
await new Promise((resolve) => setTimeout(resolve, 3000));
const extractResult = await supadata.extract.getResults(
extractJob.jobId
);
console.log(
`ℹ️ [Attempt ${attempts}] Extract job status: ${extractResult.status}`
);
if (extractResult.status === 'completed') {
console.log('ℹ️ Extracted data:', extractResult.data);
if (extractResult.schema) {
console.log('ℹ️ AI-generated schema:', extractResult.schema);
}
break;
} else if (extractResult.status === 'failed') {
console.error('🛑 Extract job failed:', extractResult.error);
break;
}
}
}
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 4: Get transcript from any platform (YouTube, TikTok, Instagram, Twitter) or file
console.log('\nℹ️ Getting transcript from YouTube...');
const transcriptResult = await supadata.transcript({
url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
lang: 'en',
text: true,
mode: 'auto', // 'native', 'auto', or 'generate'
});
// Check if we got a transcript directly or a job ID for async processing
if ('jobId' in transcriptResult) {
console.log(
`ℹ️ Got job ID for async processing: ${transcriptResult.jobId}`
);
// Poll for job status (simplified polling for example)
let attempts = 0;
const maxAttempts = 5;
while (attempts < maxAttempts) {
attempts++;
await new Promise((resolve) => setTimeout(resolve, 3000)); // Wait 3 seconds
const jobResult = await supadata.transcript.getJobStatus(
transcriptResult.jobId
);
console.log(`ℹ️ [Attempt ${attempts}] Job status: ${jobResult.status}`);
if (jobResult.status === 'completed') {
console.log('ℹ️ Transcript result:', jobResult.result);
break;
} else if (jobResult.status === 'failed') {
console.error('🛑 Transcript job failed:', jobResult.error);
break;
}
}
} else {
console.log('ℹ️ Got transcript directly:', transcriptResult);
}
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 5: Get YouTube channel info
console.log('\nℹ️ Getting YouTube channel info...');
const channelInfo = await supadata.youtube.channel({
id: 'https://www.youtube.com/@Fireship', // Fireship channel as an example
});
console.log('ℹ️ Channel info:', channelInfo);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 6: Get YouTube channel videos
console.log('\nℹ️ Getting YouTube channel videos...');
const channelVideos = await supadata.youtube.channel.videos({
id: 'https://www.youtube.com/@Fireship', // Fireship channel as an example
});
console.log('ℹ️ Channel videos:', channelVideos);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 7: Get YouTube playlist info
console.log('\nℹ️ Getting YouTube playlist info...');
const playlistInfo = await supadata.youtube.playlist({
id: 'PL0vfts4VzfNjnYhJMfTulea5McZbQLM7G', // Fireship playlist as an example
});
console.log('ℹ️ Playlist info:', playlistInfo);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 8: Get YouTube playlist videos
console.log('\nℹ️ Getting YouTube playlist videos...');
const playlistVideos = await supadata.youtube.playlist.videos({
id: 'PL0vfts4VzfNjnYhJMfTulea5McZbQLM7G', // Fireship playlist as an example
});
console.log('ℹ️ Playlist videos:', playlistVideos);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 9: Search YouTube videos
console.log('\nℹ️ Searching YouTube videos...');
const searchResults = await supadata.youtube.search({
query: 'rick astley never gonna give you up',
type: 'video',
limit: 5,
sortBy: 'views',
});
console.log('ℹ️ Search results:', searchResults);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 10: Search YouTube with filters
console.log('\nℹ️ Searching YouTube with filters...');
const filteredSearch = await supadata.youtube.search({
query: 'javascript tutorial',
type: 'video',
uploadDate: 'month',
duration: 'medium',
sortBy: 'date',
limit: 3,
});
console.log('ℹ️ Filtered search results:', filteredSearch);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 11: Search YouTube channels
console.log('\nℹ️ Searching YouTube channels...');
const channelSearch = await supadata.youtube.search({
query: 'fireship',
type: 'channel',
limit: 2,
});
console.log('ℹ️ Channel search results:', channelSearch);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 12: Scrape web content
console.log('\nℹ️ Scraping web content...');
const webContent = await supadata.web.scrape('https://supadata.ai');
console.log('ℹ️ Web content:', webContent);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 13: Map website URLs
console.log('\nℹ️ Mapping website URLs...');
const siteMap = await supadata.web.map('https://supadata.ai');
console.log('ℹ️ Site map:', siteMap);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 14: Crawl website with limit
console.log('\nℹ️ Crawling website...');
const crawl = await supadata.web.crawl({
url: 'https://supadata.ai',
limit: 2, // Limiting to 2 pages for the example
});
console.log('ℹ️ Crawl job started:', crawl);
await new Promise((resolve) => setTimeout(resolve, 5000));
// Example 15: Get crawl results
console.log('\nℹ️ Getting crawl results...');
const crawlResults = await supadata.web.getCrawlResults(crawl.jobId);
console.log('ℹ️ Crawl results:', crawlResults);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 16: Start YouTube transcript batch job
console.log('\nℹ️ Starting YouTube transcript batch job...');
const transcriptBatchJob: YoutubeBatchJob =
await supadata.youtube.transcript.batch({
videoIds: ['dQw4w9WgXcQ', 'xvFZjo5PgG0'],
lang: 'en',
});
console.log('ℹ️ Transcript batch job started:', transcriptBatchJob);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 17: Start YouTube video metadata batch job
console.log('\nℹ️ Starting YouTube video metadata batch job...');
const videoBatchJob: YoutubeBatchJob = await supadata.youtube.video.batch({
playlistId: 'PLlaN88a7y2_plecYoJxvRFTLHVbIVAOoc', // Example playlist
limit: 5, // Limit for the example
});
console.log('ℹ️ Video metadata batch job started:', videoBatchJob);
await new Promise((resolve) => setTimeout(resolve, 2000));
// Example 18: Poll and get batch results (using transcript job ID from Example 16)
console.log(
`\nℹ️ Polling for batch results for job: ${transcriptBatchJob.jobId}...`
);
let batchResults: YoutubeBatchResults | null = null;
let attempts = 0;
const maxAttempts = 10; // Poll up to 10 times
const pollInterval = 5000; // Poll every 5 seconds
while (attempts < maxAttempts) {
attempts++;
try {
batchResults = await supadata.youtube.batch.getBatchResults(
transcriptBatchJob.jobId
);
console.log(
`ℹ️ [Attempt ${attempts}] Batch job status: ${batchResults.status}`
);
if (
batchResults.status === 'completed' ||
batchResults.status === 'failed'
) {
break; // Exit loop if job finished or failed
}
} catch (error) {
console.error(
`🛑 [Attempt ${attempts}] Error polling batch results:`,
error
);
// Decide if you want to break or continue polling on error
break;
}
if (attempts < maxAttempts) {
console.log(
`ℹ️ Waiting ${pollInterval / 1000} seconds before next poll...`
);
await new Promise((resolve) => setTimeout(resolve, pollInterval));
}
}
if (batchResults) {
if (batchResults.status === 'completed') {
console.log('\n✅ Batch job completed successfully:');
console.log('ℹ️ Results:', batchResults.results);
console.log('ℹ️ Stats:', batchResults.stats);
} else if (batchResults.status === 'failed') {
console.error('\n🛑 Batch job failed.');
// Potentially log more details if the API provides them in the response
} else {
console.warn(
'\n⚠️ Batch job did not complete within the polling time/attempts.'
);
}
} else {
console.error('\n🛑 Could not retrieve final batch job status.');
}
} catch (error) {
if (error instanceof SupadataError) {
console.error(
'🛑 Supadata Error Code:',
error.error,
'Details:',
error.details
);
} else {
console.error('🛑 An unexpected error occurred:', error);
}
}
}
main();