@traceryn/tiktok-sdk 1.0.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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +276 -0
  3. package/engineRequirements.js +7 -0
  4. package/lib/ProxiflyProvider.d.ts +24 -0
  5. package/lib/ProxiflyProvider.d.ts.map +1 -0
  6. package/lib/ProxiflyProvider.js +112 -0
  7. package/lib/ProxiflyProvider.js.map +1 -0
  8. package/lib/client.d.ts +42 -0
  9. package/lib/client.d.ts.map +1 -0
  10. package/lib/client.js +377 -0
  11. package/lib/client.js.map +1 -0
  12. package/lib/core/CacheManager.d.ts +13 -0
  13. package/lib/core/CacheManager.d.ts.map +1 -0
  14. package/lib/core/CacheManager.js +49 -0
  15. package/lib/core/CacheManager.js.map +1 -0
  16. package/lib/core/CircuitBreaker.d.ts +21 -0
  17. package/lib/core/CircuitBreaker.d.ts.map +1 -0
  18. package/lib/core/CircuitBreaker.js +64 -0
  19. package/lib/core/CircuitBreaker.js.map +1 -0
  20. package/lib/core/Proxymanager.d.ts +32 -0
  21. package/lib/core/Proxymanager.d.ts.map +1 -0
  22. package/lib/core/Proxymanager.js +129 -0
  23. package/lib/core/Proxymanager.js.map +1 -0
  24. package/lib/core/RateLimiter.d.ts +17 -0
  25. package/lib/core/RateLimiter.d.ts.map +1 -0
  26. package/lib/core/RateLimiter.js +53 -0
  27. package/lib/core/RateLimiter.js.map +1 -0
  28. package/lib/core/RequestQueue.d.ts +17 -0
  29. package/lib/core/RequestQueue.d.ts.map +1 -0
  30. package/lib/core/RequestQueue.js +51 -0
  31. package/lib/core/RequestQueue.js.map +1 -0
  32. package/lib/core/RetryHandler.d.ts +13 -0
  33. package/lib/core/RetryHandler.d.ts.map +1 -0
  34. package/lib/core/RetryHandler.js +37 -0
  35. package/lib/core/RetryHandler.js.map +1 -0
  36. package/lib/core/SessionManager.d.ts +17 -0
  37. package/lib/core/SessionManager.d.ts.map +1 -0
  38. package/lib/core/SessionManager.js +57 -0
  39. package/lib/core/SessionManager.js.map +1 -0
  40. package/lib/core/Signer.d.ts +3 -0
  41. package/lib/core/Signer.d.ts.map +1 -0
  42. package/lib/core/Signer.js +26 -0
  43. package/lib/core/Signer.js.map +1 -0
  44. package/lib/index.d.ts +22 -0
  45. package/lib/index.d.ts.map +1 -0
  46. package/lib/index.js +21 -0
  47. package/lib/index.js.map +1 -0
  48. package/lib/playwright.d.ts +46 -0
  49. package/lib/playwright.d.ts.map +1 -0
  50. package/lib/playwright.js +330 -0
  51. package/lib/playwright.js.map +1 -0
  52. package/lib/scrapers/CommentScraper.d.ts +6 -0
  53. package/lib/scrapers/CommentScraper.d.ts.map +1 -0
  54. package/lib/scrapers/CommentScraper.js +107 -0
  55. package/lib/scrapers/CommentScraper.js.map +1 -0
  56. package/lib/scrapers/ExtraScraper.d.ts +15 -0
  57. package/lib/scrapers/ExtraScraper.d.ts.map +1 -0
  58. package/lib/scrapers/ExtraScraper.js +244 -0
  59. package/lib/scrapers/ExtraScraper.js.map +1 -0
  60. package/lib/scrapers/FormatExtractor.d.ts +14 -0
  61. package/lib/scrapers/FormatExtractor.d.ts.map +1 -0
  62. package/lib/scrapers/FormatExtractor.js +110 -0
  63. package/lib/scrapers/FormatExtractor.js.map +1 -0
  64. package/lib/scrapers/ParserEngine.d.ts +17 -0
  65. package/lib/scrapers/ParserEngine.d.ts.map +1 -0
  66. package/lib/scrapers/ParserEngine.js +201 -0
  67. package/lib/scrapers/ParserEngine.js.map +1 -0
  68. package/lib/scrapers/SearchScraper.d.ts +5 -0
  69. package/lib/scrapers/SearchScraper.d.ts.map +1 -0
  70. package/lib/scrapers/SearchScraper.js +149 -0
  71. package/lib/scrapers/SearchScraper.js.map +1 -0
  72. package/lib/scrapers/UrlExtractor.d.ts +9 -0
  73. package/lib/scrapers/UrlExtractor.d.ts.map +1 -0
  74. package/lib/scrapers/UrlExtractor.js +34 -0
  75. package/lib/scrapers/UrlExtractor.js.map +1 -0
  76. package/lib/scrapers/UserScraper.d.ts +3 -0
  77. package/lib/scrapers/UserScraper.d.ts.map +1 -0
  78. package/lib/scrapers/UserScraper.js +137 -0
  79. package/lib/scrapers/UserScraper.js.map +1 -0
  80. package/lib/scrapers/VideoScraper.d.ts +3 -0
  81. package/lib/scrapers/VideoScraper.d.ts.map +1 -0
  82. package/lib/scrapers/VideoScraper.js +65 -0
  83. package/lib/scrapers/VideoScraper.js.map +1 -0
  84. package/lib/types.d.ts +483 -0
  85. package/lib/types.d.ts.map +1 -0
  86. package/lib/types.js +2 -0
  87. package/lib/types.js.map +1 -0
  88. package/lib/utils/CookieJar.d.ts +8 -0
  89. package/lib/utils/CookieJar.d.ts.map +1 -0
  90. package/lib/utils/CookieJar.js +51 -0
  91. package/lib/utils/CookieJar.js.map +1 -0
  92. package/lib/utils/HttpClient.d.ts +12 -0
  93. package/lib/utils/HttpClient.d.ts.map +1 -0
  94. package/lib/utils/HttpClient.js +39 -0
  95. package/lib/utils/HttpClient.js.map +1 -0
  96. package/lib/utils/constants.d.ts +41 -0
  97. package/lib/utils/constants.d.ts.map +1 -0
  98. package/lib/utils/constants.js +48 -0
  99. package/lib/utils/constants.js.map +1 -0
  100. package/lib/utils/errors.d.ts +31 -0
  101. package/lib/utils/errors.d.ts.map +1 -0
  102. package/lib/utils/errors.js +63 -0
  103. package/lib/utils/errors.js.map +1 -0
  104. package/lib/utils/helpers.d.ts +9 -0
  105. package/lib/utils/helpers.d.ts.map +1 -0
  106. package/lib/utils/helpers.js +41 -0
  107. package/lib/utils/helpers.js.map +1 -0
  108. package/lib/utils/xbogus.cjs +565 -0
  109. package/package.json +88 -0
package/lib/client.js ADDED
@@ -0,0 +1,377 @@
1
+ import { DESKTOP_UA, HEADERS } from './utils/constants.js';
2
+ import { formatISODate, formatUploadDate, formatDuration, parseCookieString } from './utils/helpers.js';
3
+ import { scrapeVideo } from './scrapers/VideoScraper.js';
4
+ import { scrapeUser } from './scrapers/UserScraper.js';
5
+ import { searchUsers as searchUsersScraper } from './scrapers/SearchScraper.js';
6
+ import { fetchComments } from './scrapers/CommentScraper.js';
7
+ import { fetchHashtag, fetchSound, fetchSoundVideos, fetchTrending, fetchUserLikedVideos, fetchUserPlaylists, fetchPlaylist, fetchPlaylistVideos, } from './scrapers/ExtraScraper.js';
8
+ import { extractFormats, extractSubtitles, findBestQuality } from './scrapers/FormatExtractor.js';
9
+ import { buildVideoUrl } from './scrapers/UrlExtractor.js';
10
+ import { Proxymanager } from './core/Proxymanager.js';
11
+ import { RateLimiter } from './core/RateLimiter.js';
12
+ import { RetryHandler } from './core/RetryHandler.js';
13
+ import { CircuitBreaker } from './core/CircuitBreaker.js';
14
+ import { CacheManager } from './core/CacheManager.js';
15
+ import { SessionManager } from './core/SessionManager.js';
16
+ import { RequestQueue } from './core/RequestQueue.js';
17
+ import { ProxiflyProvider } from './ProxiflyProvider.js';
18
+ import { TikTokError, TikTokRateLimitError } from './utils/errors.js';
19
+ import { DEFAULT_RATE_LIMIT, DEFAULT_MAX_RETRIES, DEFAULT_CACHE_TTL, DEFAULT_CONCURRENCY, DEFAULT_TIMEOUT } from './utils/constants.js';
20
+ export class TikTokClient {
21
+ options;
22
+ proxyManager;
23
+ proxiflyProvider;
24
+ rateLimiter;
25
+ retryHandler;
26
+ circuitBreaker;
27
+ cache;
28
+ sessionManager;
29
+ queue;
30
+ constructor(options = {}) {
31
+ this.options = {
32
+ timeout: options.timeout ?? DEFAULT_TIMEOUT,
33
+ headers: options.headers,
34
+ session: options.session,
35
+ rateLimit: options.rateLimit ?? DEFAULT_RATE_LIMIT,
36
+ maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,
37
+ cacheTTL: options.cacheTTL ?? DEFAULT_CACHE_TTL,
38
+ concurrency: options.concurrency ?? DEFAULT_CONCURRENCY,
39
+ };
40
+ this.proxyManager = new Proxymanager(undefined, options.proxyRotation ?? 'round-robin');
41
+ this.proxiflyProvider = new ProxiflyProvider(this.proxyManager, options.proxifly, typeof options.proxy === 'string' ? [options.proxy] : options.proxy);
42
+ this.rateLimiter = new RateLimiter({
43
+ tokensPerSecond: this.options.rateLimit,
44
+ maxBurst: this.options.rateLimit * 2,
45
+ });
46
+ this.retryHandler = new RetryHandler({ maxRetries: this.options.maxRetries });
47
+ this.circuitBreaker = new CircuitBreaker();
48
+ this.cache = new CacheManager(this.options.cacheTTL);
49
+ this.sessionManager = new SessionManager();
50
+ this.queue = new RequestQueue(this.options.concurrency);
51
+ }
52
+ async awaitProxy() {
53
+ if (!this.proxiflyProvider.isReady) {
54
+ await this.proxiflyProvider.ready;
55
+ }
56
+ const entry = this.proxyManager.getProxy();
57
+ if (!entry)
58
+ throw new TikTokError('No proxy available. ProxiflyProvider failed to fetch proxies.');
59
+ return entry.url;
60
+ }
61
+ addProxies(proxies) {
62
+ this.proxyManager.addProxies(proxies);
63
+ }
64
+ async getVideo(url, useCache = true) {
65
+ const cacheKey = `video:${url}`;
66
+ if (useCache) {
67
+ const cached = this.cache.get(cacheKey);
68
+ if (cached)
69
+ return cached;
70
+ }
71
+ return this.queue.enqueue(() => this.executeGetVideo(url), 1).then((result) => {
72
+ this.cache.set(cacheKey, result);
73
+ return result;
74
+ });
75
+ }
76
+ async executeGetVideo(url) {
77
+ await this.rateLimiter.acquire();
78
+ return this.circuitBreaker.call(async () => {
79
+ let lastError = null;
80
+ let attempt = 0;
81
+ while (attempt <= this.options.maxRetries) {
82
+ try {
83
+ const proxyUrl = await this.awaitProxy();
84
+ const startTime = Date.now();
85
+ const { itemStruct: item, cookies } = await scrapeVideo(url, this.options.session, proxyUrl);
86
+ this.proxyManager.reportSuccess(proxyUrl, Date.now() - startTime);
87
+ const imagePost = item.imagePost;
88
+ const images = imagePost?.images?.map((img) => {
89
+ const urls = img.imageURL?.urlList ?? [];
90
+ const url = urls[0] ?? '';
91
+ const w = img.imageWidth ?? 0;
92
+ const h = img.imageHeight ?? 0;
93
+ let a = w, bb = h;
94
+ while (bb) {
95
+ const t = bb;
96
+ bb = a % bb;
97
+ a = t;
98
+ }
99
+ const gcd = a || 1;
100
+ const m2 = url.match(/\.(\w+)(?:\?|$)/);
101
+ let fmt = 'jpeg';
102
+ if (m2 && m2[1]) {
103
+ const ext = m2[1].toLowerCase();
104
+ fmt = ext === 'jpg' ? 'jpeg' : ext;
105
+ }
106
+ const idMatch = url.match(/\/([^/]+?)(?:~tplv|\?|$)/);
107
+ const id = idMatch?.[1]?.replace(/[^a-zA-Z0-9_-]/g, '') ?? '';
108
+ const maxDim = Math.max(w, h);
109
+ const quality = maxDim > 0 ? `${maxDim}p` : 'unknown';
110
+ return {
111
+ url,
112
+ urls,
113
+ id,
114
+ width: w,
115
+ height: h,
116
+ ratio: w && h ? `${w / gcd}:${h / gcd}` : '',
117
+ aspect_ratio: w && h ? +(w / h).toFixed(4) : 0,
118
+ quality,
119
+ format: fmt,
120
+ size: 0,
121
+ };
122
+ }).filter((img) => img.url);
123
+ const isPhoto = !!images?.length;
124
+ const best = findBestQuality(item);
125
+ const res = best && best.width > 0
126
+ ? { width: best.width, height: best.height }
127
+ : { width: item.video?.width ?? 0, height: item.video?.height ?? 0 };
128
+ const formats = extractFormats(item);
129
+ const subtitles = extractSubtitles(item);
130
+ const timestamp = Number(item.createTime ?? 0);
131
+ const as = item.authorStats;
132
+ const primaryFormat = formats.find((f) => f.width === res.width && f.height === res.height) ?? formats[0] ?? null;
133
+ const videoUrls = {
134
+ play: item.video?.playAddr ?? '',
135
+ wmplay: item.video?.downloadAddr ?? item.video?.playAddr ?? '',
136
+ music: item.music?.playUrl ?? '',
137
+ cover: item.video?.cover ?? '',
138
+ originCover: item.video?.originCover ?? '',
139
+ dynamicCover: item.video?.dynamicCover ?? '',
140
+ best: best?.url ?? undefined,
141
+ };
142
+ const httpHeaders = {
143
+ ...HEADERS.desktop,
144
+ Referer: url,
145
+ };
146
+ const result = {
147
+ by: 'Traceryn',
148
+ id: item.id,
149
+ desc: item.desc,
150
+ title: item.desc,
151
+ fulltitle: item.desc,
152
+ createTime: formatISODate(timestamp),
153
+ timestamp,
154
+ duration: item.video?.duration ?? 0,
155
+ duration_string: formatDuration(item.video?.duration ?? 0),
156
+ width: res.width,
157
+ height: res.height,
158
+ resolution: `${res.width}x${res.height}`,
159
+ ratio: res.width && res.height ? `${Math.min(res.width, res.height)}p` : '',
160
+ format: primaryFormat?.format ?? item.video?.format ?? '',
161
+ definition: res.width && res.height ? `${Math.min(res.width, res.height)}p` : '',
162
+ codec: primaryFormat?.vcodec ?? item.video?.codecType ?? '',
163
+ size: Number(item.video?.size ?? 0),
164
+ ext: primaryFormat?.ext ?? (isPhoto ? '' : 'mp4'),
165
+ vcodec: primaryFormat?.vcodec ?? '',
166
+ acodec: primaryFormat?.acodec ?? '',
167
+ tbr: primaryFormat?.tbr ?? 0,
168
+ filesize: primaryFormat?.filesize ?? 0,
169
+ dynamic_range: 'SDR',
170
+ aspect_ratio: res.width > 0 && res.height > 0
171
+ ? +(res.width / res.height).toFixed(2)
172
+ : 0,
173
+ webpageUrl: isPhoto
174
+ ? `https://www.tiktok.com/@${item.author?.uniqueId ?? ''}/photo/${item.id ?? ''}`
175
+ : buildVideoUrl(item.author?.uniqueId ?? '', item.id ?? ''),
176
+ originalUrl: isPhoto
177
+ ? `https://www.tiktok.com/@${item.author?.uniqueId ?? ''}/photo/${item.id ?? ''}`
178
+ : buildVideoUrl(item.author?.uniqueId ?? '', item.id ?? ''),
179
+ display_id: item.id,
180
+ upload_date: formatUploadDate(timestamp),
181
+ epoch: Math.floor(Date.now() / 1000),
182
+ thumbnail: item.video?.originCover ?? item.video?.cover ?? '',
183
+ urls: videoUrls,
184
+ formats,
185
+ subtitles,
186
+ stats: {
187
+ playCount: item.stats?.playCount ?? item.playCount ?? 0,
188
+ diggCount: item.stats?.diggCount ?? item.diggCount ?? 0,
189
+ commentCount: item.stats?.commentCount ?? item.commentCount ?? 0,
190
+ shareCount: item.stats?.shareCount ?? item.shareCount ?? 0,
191
+ collectCount: Number(item.stats?.collectCount ?? item.collectCount ?? 0),
192
+ },
193
+ author: {
194
+ id: item.author?.id ?? '',
195
+ uniqueId: item.author?.uniqueId ?? '',
196
+ nickname: item.author?.nickname ?? '',
197
+ avatar: item.author?.avatarLarger ?? '',
198
+ signature: item.author?.signature ?? '',
199
+ verified: item.author?.verified ?? false,
200
+ secUid: item.author?.secUid ?? '',
201
+ uploaderUrl: `https://www.tiktok.com/@${item.author?.uniqueId ?? ''}`,
202
+ channelUrl: `https://www.tiktok.com/@${item.author?.uniqueId ?? ''}`,
203
+ followerCount: as?.followerCount ?? item.author?.followerCount ?? 0,
204
+ followingCount: as?.followingCount ?? item.author?.followingCount ?? 0,
205
+ heartCount: as?.heartCount ?? item.author?.heartCount ?? 0,
206
+ videoCount: as?.videoCount ?? item.author?.videoCount ?? 0,
207
+ },
208
+ music: {
209
+ id: item.music?.id ?? '',
210
+ title: item.music?.title ?? '',
211
+ author: item.music?.authorName ?? '',
212
+ original: item.music?.original ?? false,
213
+ duration: item.music?.duration ?? 0,
214
+ album: item.music?.title ?? undefined,
215
+ artists: item.music?.authorName ? [item.music.authorName] : undefined,
216
+ },
217
+ hashtags: (item.challenges ?? []).map((c) => c.title),
218
+ images,
219
+ raw: item,
220
+ httpHeaders,
221
+ cookies: parseCookieString(cookies),
222
+ };
223
+ return result;
224
+ }
225
+ catch (error) {
226
+ lastError = error instanceof Error ? error : new Error(String(error));
227
+ if (error instanceof TikTokRateLimitError) {
228
+ await new Promise((r) => setTimeout(r, error.retryAfter));
229
+ attempt++;
230
+ continue;
231
+ }
232
+ this.proxyManager.reportFailure(this.proxyManager.getProxy()?.url ?? '');
233
+ if (!this.retryHandler.shouldRetry(error, attempt)) {
234
+ throw error;
235
+ }
236
+ attempt++;
237
+ if (attempt <= this.options.maxRetries) {
238
+ await this.retryHandler.delay(attempt);
239
+ }
240
+ }
241
+ }
242
+ throw lastError ?? new TikTokError('Max retries exceeded');
243
+ });
244
+ }
245
+ async getUser(usernameOrUrl, useCache = true) {
246
+ const username = usernameOrUrl.replace(/https?:\/\/[^/]+\/@?/, '@').replace('@', '');
247
+ const cacheKey = `user:${username}`;
248
+ if (useCache) {
249
+ const cached = this.cache.get(cacheKey);
250
+ if (cached)
251
+ return cached;
252
+ }
253
+ return this.queue.enqueue(() => this.executeGetUser(username), 0).then((result) => {
254
+ this.cache.set(cacheKey, result);
255
+ return result;
256
+ });
257
+ }
258
+ async executeGetUser(username) {
259
+ await this.rateLimiter.acquire();
260
+ return this.circuitBreaker.call(async () => {
261
+ let lastError = null;
262
+ let attempt = 0;
263
+ while (attempt <= this.options.maxRetries) {
264
+ try {
265
+ const proxyUrl = await this.awaitProxy();
266
+ const startTime = Date.now();
267
+ const result = await scrapeUser(username, proxyUrl);
268
+ this.proxyManager.reportSuccess(proxyUrl, Date.now() - startTime);
269
+ return result;
270
+ }
271
+ catch (error) {
272
+ lastError = error instanceof Error ? error : new Error(String(error));
273
+ if (error instanceof TikTokRateLimitError) {
274
+ await new Promise((r) => setTimeout(r, error.retryAfter));
275
+ attempt++;
276
+ continue;
277
+ }
278
+ this.proxyManager.reportFailure(this.proxyManager.getProxy()?.url ?? '');
279
+ if (!this.retryHandler.shouldRetry(error, attempt)) {
280
+ throw error;
281
+ }
282
+ attempt++;
283
+ if (attempt <= this.options.maxRetries) {
284
+ await this.retryHandler.delay(attempt);
285
+ }
286
+ }
287
+ }
288
+ throw lastError ?? new TikTokError('Max retries exceeded');
289
+ });
290
+ }
291
+ async downloadVideo(videoUrl) {
292
+ await this.rateLimiter.acquire(2);
293
+ const proxyUrl = await this.awaitProxy();
294
+ const { itemStruct, cookies } = await scrapeVideo(videoUrl, this.options.session, proxyUrl);
295
+ const downloadUrl = itemStruct.video?.playAddr ?? itemStruct.video?.downloadAddr;
296
+ if (!downloadUrl)
297
+ throw new TikTokError('No video URL found');
298
+ const { ofetch } = await import('ofetch');
299
+ const cookieStr = parseCookieString(cookies);
300
+ return ofetch(downloadUrl, {
301
+ headers: {
302
+ 'User-Agent': DESKTOP_UA,
303
+ Referer: 'https://www.tiktok.com/',
304
+ Cookie: cookieStr,
305
+ Accept: '*/*',
306
+ },
307
+ proxy: proxyUrl,
308
+ responseType: 'arrayBuffer',
309
+ retry: 0,
310
+ timeout: 60000,
311
+ });
312
+ }
313
+ getProxyStats() {
314
+ return this.proxyManager.getStats();
315
+ }
316
+ async searchUsers(query, cursor, count = 20) {
317
+ await this.rateLimiter.acquire();
318
+ const proxyUrl = await this.awaitProxy();
319
+ return searchUsersScraper(query, proxyUrl, cursor ?? 0, count, this.options.session);
320
+ }
321
+ async getComments(videoUrl, cursor, count = 20) {
322
+ await this.rateLimiter.acquire();
323
+ const videoId = videoUrl.match(/\/(?:video|photo)\/(\d+)/)?.[1] ?? videoUrl;
324
+ const authorUsername = videoUrl.match(/@([\w.-]+)/)?.[1] ?? '';
325
+ const proxyUrl = await this.awaitProxy();
326
+ return fetchComments(videoId, authorUsername, cursor ?? 0, count, proxyUrl);
327
+ }
328
+ async getHashtag(name) {
329
+ await this.rateLimiter.acquire();
330
+ const proxyUrl = await this.awaitProxy();
331
+ return fetchHashtag(name, proxyUrl);
332
+ }
333
+ async getSound(musicId) {
334
+ await this.rateLimiter.acquire();
335
+ const proxyUrl = await this.awaitProxy();
336
+ return fetchSound(musicId, proxyUrl, this.options.session);
337
+ }
338
+ async getSoundVideos(musicId, cursor, count = 30) {
339
+ await this.rateLimiter.acquire();
340
+ const proxyUrl = await this.awaitProxy();
341
+ return fetchSoundVideos(musicId, cursor ?? 0, count, proxyUrl, this.options.session);
342
+ }
343
+ async getTrendingVideos(count = 30) {
344
+ await this.rateLimiter.acquire();
345
+ const proxyUrl = await this.awaitProxy();
346
+ return fetchTrending(count, proxyUrl, this.options.session);
347
+ }
348
+ async getUserLikedVideos(username, cursor, count = 30) {
349
+ await this.rateLimiter.acquire();
350
+ const proxyUrl = await this.awaitProxy();
351
+ const user = await scrapeUser(username, proxyUrl);
352
+ return fetchUserLikedVideos(user.secUid, cursor ?? 0, count, proxyUrl, this.options.session);
353
+ }
354
+ async getUserPlaylists(username, cursor, count = 30) {
355
+ await this.rateLimiter.acquire();
356
+ const proxyUrl = await this.awaitProxy();
357
+ const user = await scrapeUser(username, proxyUrl);
358
+ return fetchUserPlaylists(user.secUid, cursor ?? 0, count, proxyUrl, this.options.session);
359
+ }
360
+ async getPlaylist(mixId) {
361
+ await this.rateLimiter.acquire();
362
+ const proxyUrl = await this.awaitProxy();
363
+ return fetchPlaylist(mixId, proxyUrl, this.options.session);
364
+ }
365
+ async getPlaylistVideos(mixId, cursor, count = 30) {
366
+ await this.rateLimiter.acquire();
367
+ const proxyUrl = await this.awaitProxy();
368
+ return fetchPlaylistVideos(mixId, cursor ?? 0, count, proxyUrl, this.options.session);
369
+ }
370
+ invalidateCache(url) {
371
+ this.cache.delete(`video:${url}`);
372
+ }
373
+ clearCache() {
374
+ this.cache.clear();
375
+ }
376
+ }
377
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare class CacheManager {
2
+ private store;
3
+ private defaultTTL;
4
+ constructor(defaultTTL?: number);
5
+ get<T>(key: string): T | undefined;
6
+ set<T>(key: string, value: T, ttl?: number): void;
7
+ delete(key: string): void;
8
+ clear(): void;
9
+ get size(): number;
10
+ private evictExpired;
11
+ private startEviction;
12
+ }
13
+ //# sourceMappingURL=CacheManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheManager.d.ts","sourceRoot":"","sources":["../../src/core/CacheManager.ts"],"names":[],"mappings":"AAOA,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,CAAC,EAAE,MAAM;IAK/B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAWlC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAOjD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;CAItB"}
@@ -0,0 +1,49 @@
1
+ import { DEFAULT_CACHE_TTL } from '../utils/constants.js';
2
+ export class CacheManager {
3
+ store = new Map();
4
+ defaultTTL;
5
+ constructor(defaultTTL) {
6
+ this.defaultTTL = defaultTTL ?? DEFAULT_CACHE_TTL;
7
+ this.startEviction();
8
+ }
9
+ get(key) {
10
+ const entry = this.store.get(key);
11
+ if (!entry)
12
+ return undefined;
13
+ if (Date.now() > entry.expiresAt) {
14
+ // stale entry, drop it and move on
15
+ this.store.delete(key);
16
+ return undefined;
17
+ }
18
+ return entry.value;
19
+ }
20
+ set(key, value, ttl) {
21
+ this.store.set(key, {
22
+ value,
23
+ expiresAt: Date.now() + (ttl ?? this.defaultTTL),
24
+ });
25
+ }
26
+ delete(key) {
27
+ this.store.delete(key);
28
+ }
29
+ clear() {
30
+ this.store.clear();
31
+ }
32
+ get size() {
33
+ return this.store.size;
34
+ }
35
+ evictExpired() {
36
+ const now = Date.now();
37
+ for (const [key, entry] of this.store) {
38
+ if (now > entry.expiresAt) {
39
+ // keep the cache from filling up with dead stuff
40
+ this.store.delete(key);
41
+ }
42
+ }
43
+ }
44
+ startEviction() {
45
+ // quiet background cleanup so the cache stays tidy
46
+ setInterval(() => this.evictExpired(), 30_000);
47
+ }
48
+ }
49
+ //# sourceMappingURL=CacheManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheManager.js","sourceRoot":"","sources":["../../src/core/CacheManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAO1D,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC/C,UAAU,CAAS;IAE3B,YAAY,UAAmB;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,iBAAiB,CAAC;QAClD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,GAAG,CAAI,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,mCAAmC;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,KAAU,CAAC;IAC1B,CAAC;IAED,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,GAAY;QACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAEO,YAAY;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC1B,iDAAiD;gBACjD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,mDAAmD;QACnD,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ type CircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';
2
+ export interface CircuitBreakerConfig {
3
+ failureThreshold: number;
4
+ successThreshold: number;
5
+ resetTimeout: number;
6
+ }
7
+ export declare class CircuitBreaker {
8
+ private state;
9
+ private failures;
10
+ private successes;
11
+ private lastFailureTime;
12
+ private config;
13
+ constructor(config?: Partial<CircuitBreakerConfig>);
14
+ call<T>(fn: () => Promise<T>): Promise<T>;
15
+ private onSuccess;
16
+ private onFailure;
17
+ getState(): CircuitState;
18
+ reset(): void;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=CircuitBreaker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircuitBreaker.d.ts","sourceRoot":"","sources":["../../src/core/CircuitBreaker.ts"],"names":[],"mappings":"AAGA,KAAK,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAQ5C,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAqB/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;IAQjB,QAAQ,IAAI,YAAY;IAIxB,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,64 @@
1
+ import { TikTokCircuitOpenError } from '../utils/errors.js';
2
+ import { CIRCUIT_BREAKER_THRESHOLD, CIRCUIT_BREAKER_RESET } from '../utils/constants.js';
3
+ export class CircuitBreaker {
4
+ state = 'CLOSED';
5
+ failures = 0;
6
+ successes = 0;
7
+ lastFailureTime = 0;
8
+ config;
9
+ constructor(config) {
10
+ this.config = {
11
+ failureThreshold: config?.failureThreshold ?? CIRCUIT_BREAKER_THRESHOLD,
12
+ successThreshold: config?.successThreshold ?? 2,
13
+ resetTimeout: config?.resetTimeout ?? CIRCUIT_BREAKER_RESET,
14
+ };
15
+ }
16
+ async call(fn) {
17
+ if (this.state === 'OPEN') {
18
+ if (Date.now() - this.lastFailureTime >= this.config.resetTimeout) {
19
+ this.state = 'HALF_OPEN';
20
+ }
21
+ else {
22
+ throw new TikTokCircuitOpenError(this.config.resetTimeout - (Date.now() - this.lastFailureTime));
23
+ }
24
+ }
25
+ try {
26
+ const result = await fn();
27
+ this.onSuccess();
28
+ return result;
29
+ }
30
+ catch (error) {
31
+ this.onFailure();
32
+ throw error;
33
+ }
34
+ }
35
+ onSuccess() {
36
+ if (this.state === 'HALF_OPEN') {
37
+ this.successes++;
38
+ if (this.successes >= this.config.successThreshold) {
39
+ this.state = 'CLOSED';
40
+ this.failures = 0;
41
+ this.successes = 0;
42
+ }
43
+ }
44
+ else {
45
+ this.failures = Math.max(0, this.failures - 1);
46
+ }
47
+ }
48
+ onFailure() {
49
+ this.failures++;
50
+ this.lastFailureTime = Date.now();
51
+ if (this.failures >= this.config.failureThreshold) {
52
+ this.state = 'OPEN';
53
+ }
54
+ }
55
+ getState() {
56
+ return this.state;
57
+ }
58
+ reset() {
59
+ this.state = 'CLOSED';
60
+ this.failures = 0;
61
+ this.successes = 0;
62
+ }
63
+ }
64
+ //# sourceMappingURL=CircuitBreaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircuitBreaker.js","sourceRoot":"","sources":["../../src/core/CircuitBreaker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAUzF,MAAM,OAAO,cAAc;IACjB,KAAK,GAAiB,QAAQ,CAAC;IAC/B,QAAQ,GAAG,CAAC,CAAC;IACb,SAAS,GAAG,CAAC,CAAC;IACd,eAAe,GAAG,CAAC,CAAC;IACpB,MAAM,CAAuB;IAErC,YAAY,MAAsC;QAChD,IAAI,CAAC,MAAM,GAAG;YACZ,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,yBAAyB;YACvE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,CAAC;YAC/C,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,qBAAqB;SAC5D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,EAAoB;QAChC,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAClE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,sBAAsB,CAC9B,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,CAC/D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACnD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;gBAClB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAClD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACtB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ export interface ProxyEntry {
2
+ url: string;
3
+ failures: number;
4
+ successes: number;
5
+ lastUsed: number;
6
+ avgResponseTime: number;
7
+ score: number;
8
+ enabled: boolean;
9
+ }
10
+ export type ProxyRotation = 'round-robin' | 'random' | 'lowest-failures';
11
+ export declare class Proxymanager {
12
+ private proxies;
13
+ private index;
14
+ private rotation;
15
+ private healthTimer;
16
+ constructor(proxies?: string[], rotation?: ProxyRotation);
17
+ addProxies(urls: string[]): void;
18
+ removeProxy(url: string): void;
19
+ getProxy(): ProxyEntry | null;
20
+ reportSuccess(url: string, responseTime?: number): void;
21
+ reportFailure(url: string): void;
22
+ private calculateScore;
23
+ getStats(): {
24
+ total: number;
25
+ enabled: number;
26
+ avgScore: number;
27
+ };
28
+ healthCheck(): Promise<void>;
29
+ private startHealthCheck;
30
+ destroy(): void;
31
+ }
32
+ //# sourceMappingURL=Proxymanager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Proxymanager.d.ts","sourceRoot":"","sources":["../../src/core/Proxymanager.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,QAAQ,GAAG,iBAAiB,CAAC;AAEzE,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,WAAW,CAA+C;gBAEtD,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,GAAE,aAA6B;IAQvE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAgBhC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI9B,QAAQ,IAAI,UAAU,GAAG,IAAI;IA4B7B,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAcvD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAUhC,OAAO,CAAC,cAAc;IAUtB,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAW1D,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBlC,OAAO,CAAC,gBAAgB;IAMxB,OAAO,IAAI,IAAI;CAGhB"}