@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
@@ -0,0 +1,244 @@
1
+ import { ofetch } from 'ofetch';
2
+ import { HEADERS } from '../utils/constants.js';
3
+ import { fetchTikTokCookies } from '../utils/CookieJar.js';
4
+ import { TikTokFetchError, TikTokWafError } from '../utils/errors.js';
5
+ const BASE = 'https://www.tiktok.com';
6
+ async function getCookies(_url, _proxy) {
7
+ return fetchTikTokCookies();
8
+ }
9
+ function parseVideo(data) {
10
+ return {
11
+ id: String(data.id ?? ''),
12
+ desc: String(data.desc ?? ''),
13
+ createTime: String(data.createTime ?? ''),
14
+ duration: Number(data.video?.duration ?? data.duration ?? 0),
15
+ playCount: Number(data.stats?.playCount ?? data.playCount ?? 0),
16
+ diggCount: Number(data.stats?.diggCount ?? data.diggCount ?? 0),
17
+ commentCount: Number(data.stats?.commentCount ?? data.commentCount ?? 0),
18
+ cover: String(data.video?.cover ?? data.cover ?? ''),
19
+ raw: data,
20
+ };
21
+ }
22
+ function guardResponse(res, endpoint) {
23
+ if (!res || typeof res !== 'object') {
24
+ throw new TikTokWafError(`TikTok API returned empty response for ${endpoint}. ` +
25
+ `Try using a PlaywrightSession — install with: npm install playwright`);
26
+ }
27
+ }
28
+ async function apiGet(url, cookieStr, referer, proxy) {
29
+ let res;
30
+ try {
31
+ res = await ofetch(url, {
32
+ headers: {
33
+ ...HEADERS.api,
34
+ Referer: referer,
35
+ Cookie: cookieStr,
36
+ },
37
+ ...(proxy ? { proxy } : {}),
38
+ timeout: 15000,
39
+ });
40
+ }
41
+ catch (err) {
42
+ const ofetchErr = err;
43
+ throw new TikTokFetchError(`API request failed: ${err.message}`, ofetchErr.status);
44
+ }
45
+ const ep = url.split('?')[0]?.split('/').filter(Boolean).pop() ?? 'api';
46
+ guardResponse(res, ep);
47
+ return res;
48
+ }
49
+ export async function fetchHashtag(name, proxy) {
50
+ const cookieStr = await getCookies(`${BASE}/tag/${name}`, proxy);
51
+ const res = await apiGet(`${BASE}/api/challenge/detail/?aid=1988&challengeName=${encodeURIComponent(name)}`, cookieStr, `${BASE}/tag/${name}`, proxy);
52
+ const ci = res.challengeInfo ?? {};
53
+ const ch = ci.challenge ?? {};
54
+ const st = ci.stats ?? {};
55
+ const st2 = ci.statsV2 ?? {};
56
+ return {
57
+ by: 'Traceryn',
58
+ id: String(ch.id ?? ''),
59
+ title: String(ch.title ?? name),
60
+ desc: String(ch.desc ?? ''),
61
+ stats: {
62
+ videoCount: Number(st2.videoCount ?? st.videoCount ?? 0),
63
+ viewCount: Number(st2.viewCount ?? st.viewCount ?? 0),
64
+ },
65
+ raw: res,
66
+ };
67
+ }
68
+ export async function fetchSound(musicId, proxy, session) {
69
+ if (session?.isReady) {
70
+ const res = await session.request('/api/music/detail/', {
71
+ aid: '1988', musicId,
72
+ });
73
+ const mi = res.musicInfo ?? {};
74
+ const m = mi.music ?? {};
75
+ const s = mi.stats ?? {};
76
+ const a = mi.author ?? {};
77
+ return {
78
+ by: 'Traceryn',
79
+ id: String(m.id ?? musicId),
80
+ title: String(m.title ?? ''),
81
+ author: String(a.uniqueId ?? a.nickname ?? ''),
82
+ original: Boolean(m.original ?? false),
83
+ duration: Number(m.duration ?? 0),
84
+ playUrl: String(m.playUrl ?? ''),
85
+ coverLarge: String(m.coverLarge ?? ''),
86
+ coverMedium: String(m.coverMedium ?? ''),
87
+ coverThumb: String(m.coverThumb ?? ''),
88
+ stats: { videoCount: Number(s.videoCount ?? 0) },
89
+ raw: res,
90
+ };
91
+ }
92
+ const cookieStr = await getCookies(`${BASE}/music/${musicId}`, proxy);
93
+ const res = await apiGet(`${BASE}/api/music/detail/?aid=1988&musicId=${musicId}`, cookieStr, `${BASE}/music/${musicId}`, proxy);
94
+ const mi = res.musicInfo ?? {};
95
+ const m = mi.music ?? {};
96
+ const s = mi.stats ?? {};
97
+ const a = mi.author ?? {};
98
+ return {
99
+ by: 'Traceryn',
100
+ id: String(m.id ?? musicId),
101
+ title: String(m.title ?? ''),
102
+ author: String(a.uniqueId ?? a.nickname ?? ''),
103
+ original: Boolean(m.original ?? false),
104
+ duration: Number(m.duration ?? 0),
105
+ playUrl: String(m.playUrl ?? ''),
106
+ coverLarge: String(m.coverLarge ?? ''),
107
+ coverMedium: String(m.coverMedium ?? ''),
108
+ coverThumb: String(m.coverThumb ?? ''),
109
+ stats: { videoCount: Number(s.videoCount ?? 0) },
110
+ raw: res,
111
+ };
112
+ }
113
+ export async function fetchSoundVideos(musicId, cursor = 0, count = 30, proxy, session) {
114
+ if (session?.isReady) {
115
+ const res = await session.request('/api/music/item_list/', {
116
+ aid: '1988', musicID: musicId, count: String(count), cursor: String(cursor),
117
+ });
118
+ const items = res.itemList ?? [];
119
+ return { videos: items.map(parseVideo), cursor: Number(res.cursor ?? cursor), hasMore: Boolean(res.hasMore ?? false), raw: res };
120
+ }
121
+ const cookieStr = await getCookies(`${BASE}/music/${musicId}`, proxy);
122
+ const res = await apiGet(`${BASE}/api/music/item_list/?aid=1988&musicID=${musicId}&count=${count}&cursor=${cursor}`, cookieStr, `${BASE}/music/${musicId}`, proxy);
123
+ const items = res.itemList ?? [];
124
+ return {
125
+ videos: items.map(parseVideo),
126
+ cursor: Number(res.cursor ?? cursor),
127
+ hasMore: Boolean(res.hasMore ?? false),
128
+ raw: res,
129
+ };
130
+ }
131
+ export async function fetchTrending(count = 30, proxy, session) {
132
+ if (session?.isReady) {
133
+ const res = await session.request('/api/recommend/item_list/', {
134
+ aid: '1988', from_page: 'fyp', count: String(count),
135
+ });
136
+ const items = res.itemList ?? [];
137
+ return { videos: items.map(parseVideo), cursor: Number(res.cursor ?? 0), hasMore: Boolean(res.hasMore ?? false), raw: res };
138
+ }
139
+ const cookieStr = await getCookies(`${BASE}/foryou`, proxy);
140
+ const res = await apiGet(`${BASE}/api/recommend/item_list/?aid=1988&from_page=fyp&count=${count}`, cookieStr, `${BASE}/foryou`, proxy);
141
+ const items = res.itemList ?? [];
142
+ return {
143
+ videos: items.map(parseVideo),
144
+ cursor: Number(res.cursor ?? 0),
145
+ hasMore: Boolean(res.hasMore ?? false),
146
+ raw: res,
147
+ };
148
+ }
149
+ export async function fetchUserLikedVideos(secUid, cursor = 0, count = 30, proxy, session) {
150
+ if (session?.isReady) {
151
+ const res = await session.request('/api/favorite/item_list/', {
152
+ aid: '1988', secUid, count: String(count), cursor: String(cursor),
153
+ });
154
+ const items = res.itemList ?? [];
155
+ return { videos: items.map(parseVideo), cursor: Number(res.cursor ?? cursor), hasMore: Boolean(res.hasMore ?? false), raw: res };
156
+ }
157
+ const cookieStr = await getCookies(`${BASE}/`, proxy);
158
+ const res = await apiGet(`${BASE}/api/favorite/item_list/?aid=1988&secUid=${secUid}&count=${count}&cursor=${cursor}`, cookieStr, `${BASE}/`, proxy);
159
+ const items = res.itemList ?? [];
160
+ return {
161
+ videos: items.map(parseVideo),
162
+ cursor: Number(res.cursor ?? cursor),
163
+ hasMore: Boolean(res.hasMore ?? false),
164
+ raw: res,
165
+ };
166
+ }
167
+ export async function fetchUserPlaylists(secUid, cursor = 0, count = 30, proxy, session) {
168
+ if (session?.isReady) {
169
+ const res = await session.request('/api/user/playlist', {
170
+ aid: '1988', secUid, count: String(count), cursor: String(cursor),
171
+ });
172
+ const items = res.playList ?? [];
173
+ const plItems = res.playList ?? [];
174
+ return {
175
+ playlists: plItems.map((p) => ({
176
+ by: 'Traceryn', id: String(p.id ?? p.mixId ?? ''), name: String(p.name ?? p.mixName ?? ''),
177
+ videoCount: Number(p.videoCount ?? 0), coverUrl: String(p.cover ?? ''),
178
+ authorName: String(p.creator?.uniqueId ?? p.creator?.nickname ?? ''),
179
+ raw: p,
180
+ })),
181
+ cursor: Number(res.cursor ?? cursor), hasMore: Boolean(res.hasMore ?? false), raw: res,
182
+ };
183
+ }
184
+ const cookieStr = await getCookies(`${BASE}/`, proxy);
185
+ const res = await apiGet(`${BASE}/api/user/playlist?aid=1988&secUid=${secUid}&count=${count}&cursor=${cursor}`, cookieStr, `${BASE}/`, proxy);
186
+ const plItems = res.playList ?? [];
187
+ return {
188
+ playlists: plItems.map((p) => ({
189
+ by: 'Traceryn',
190
+ id: String(p.id ?? p.mixId ?? ''),
191
+ name: String(p.name ?? p.mixName ?? ''),
192
+ videoCount: Number(p.videoCount ?? 0),
193
+ coverUrl: String(p.cover ?? ''),
194
+ authorName: String(p.creator?.uniqueId ?? p.creator?.nickname ?? ''),
195
+ raw: p,
196
+ })),
197
+ cursor: Number(res.cursor ?? cursor),
198
+ hasMore: Boolean(res.hasMore ?? false),
199
+ raw: res,
200
+ };
201
+ }
202
+ export async function fetchPlaylist(mixId, proxy, session) {
203
+ if (session?.isReady) {
204
+ const res = await session.request('/api/mix/detail/', { aid: '1988', mixId });
205
+ const mi = res.mixInfo ?? {};
206
+ return {
207
+ by: 'Traceryn', id: String(mi.id ?? mi.mixId ?? mixId), name: String(mi.name ?? mi.mixName ?? ''),
208
+ videoCount: Number(mi.videoCount ?? 0), coverUrl: String(mi.cover ?? ''),
209
+ authorName: String(mi.creator?.uniqueId ?? mi.creator?.nickname ?? ''),
210
+ raw: res,
211
+ };
212
+ }
213
+ const cookieStr = await getCookies(`${BASE}/`, proxy);
214
+ const res = await apiGet(`${BASE}/api/mix/detail/?aid=1988&mixId=${mixId}`, cookieStr, `${BASE}/`, proxy);
215
+ const mi = res.mixInfo ?? {};
216
+ return {
217
+ by: 'Traceryn',
218
+ id: String(mi.id ?? mi.mixId ?? mixId),
219
+ name: String(mi.name ?? mi.mixName ?? ''),
220
+ videoCount: Number(mi.videoCount ?? 0),
221
+ coverUrl: String(mi.cover ?? ''),
222
+ authorName: String(mi.creator?.uniqueId ?? mi.creator?.nickname ?? ''),
223
+ raw: res,
224
+ };
225
+ }
226
+ export async function fetchPlaylistVideos(mixId, cursor = 0, count = 30, proxy, session) {
227
+ if (session?.isReady) {
228
+ const res = await session.request('/api/mix/item_list/', {
229
+ aid: '1988', mixId, count: String(count), cursor: String(cursor),
230
+ });
231
+ const items = res.itemList ?? [];
232
+ return { videos: items.map(parseVideo), cursor: Number(res.cursor ?? cursor), hasMore: Boolean(res.hasMore ?? false), raw: res };
233
+ }
234
+ const cookieStr = await getCookies(`${BASE}/`, proxy);
235
+ const res = await apiGet(`${BASE}/api/mix/item_list/?aid=1988&mixId=${mixId}&count=${count}&cursor=${cursor}`, cookieStr, `${BASE}/`, proxy);
236
+ const items = res.itemList ?? [];
237
+ return {
238
+ videos: items.map(parseVideo),
239
+ cursor: Number(res.cursor ?? cursor),
240
+ hasMore: Boolean(res.has_more ?? false),
241
+ raw: res,
242
+ };
243
+ }
244
+ //# sourceMappingURL=ExtraScraper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtraScraper.js","sourceRoot":"","sources":["../../src/scrapers/ExtraScraper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ItemStruct, FormatEntry } from '../types.js';
2
+ export declare function extractFormats(item: ItemStruct): FormatEntry[];
3
+ export declare function extractSubtitles(item: ItemStruct): Record<string, {
4
+ url: string;
5
+ ext: string;
6
+ }[]>;
7
+ export declare function findBestQuality(item: ItemStruct): {
8
+ width: number;
9
+ height: number;
10
+ url: string;
11
+ codec: string;
12
+ bitrate: number;
13
+ } | null;
14
+ //# sourceMappingURL=FormatExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormatExtractor.d.ts","sourceRoot":"","sources":["../../src/scrapers/FormatExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AAgBzE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,EAAE,CAuD9D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU;SAIF,MAAM;SAAO,MAAM;KAUjE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU;;;;;;SAsB/C"}
@@ -0,0 +1,110 @@
1
+ function pickFormatId(entry, index) {
2
+ const gear = entry.GearName ?? '';
3
+ const codec = entry.CodecType === 'h265_hvc1' ? 'bytevc1' : 'h264';
4
+ const resolution = gear.includes('720') ? '720p' : gear.includes('540') ? '540p' : 'unknown';
5
+ return `${codec}_${resolution}_${entry.Bitrate}-${index}`;
6
+ }
7
+ function pickFormatNote(entry) {
8
+ const codec = entry.CodecType === 'h265_hvc1' ? 'h265' : 'h264';
9
+ const gear = entry.GearName ?? '';
10
+ const resolution = gear.includes('720') ? '720x1280' : gear.includes('540') ? '576x1024' : 'unknown';
11
+ return `${codec} ${resolution}`;
12
+ }
13
+ export function extractFormats(item) {
14
+ const formats = [];
15
+ const wmUrl = item.video?.downloadAddr || item.video?.playAddr || '';
16
+ if (wmUrl) {
17
+ formats.push({
18
+ format_id: 'download',
19
+ format: 'download - unknown (watermarked)',
20
+ format_note: 'watermarked',
21
+ ext: 'mp4',
22
+ vcodec: 'h264', acodec: 'aac',
23
+ width: 0, height: 0, resolution: 'unknown',
24
+ tbr: 0, filesize: 0,
25
+ url: wmUrl, urls: [wmUrl],
26
+ quality: -2, dynamic_range: 'SDR', aspect_ratio: 0, protocol: 'https',
27
+ });
28
+ }
29
+ const bitrateInfo = item.video?.bitrateInfo;
30
+ if (!bitrateInfo?.length)
31
+ return formats;
32
+ const seen = new Set();
33
+ bitrateInfo.forEach((entry, i) => {
34
+ if (!entry)
35
+ return;
36
+ const w = entry.PlayAddr?.Width ?? 0;
37
+ const h = entry.PlayAddr?.Height ?? 0;
38
+ const urlList = entry.PlayAddr?.UrlList ?? [];
39
+ const url = urlList[0] ?? '';
40
+ const filesize = parseInt(entry.PlayAddr?.DataSize ?? '0', 10) || 0;
41
+ if (seen.has(entry.PlayAddr?.FileHash ?? ''))
42
+ return;
43
+ if (entry.PlayAddr?.FileHash)
44
+ seen.add(entry.PlayAddr.FileHash);
45
+ const formatId = pickFormatId(entry, i);
46
+ const codec = entry.CodecType === 'h265_hvc1' ? 'h265' : entry.CodecType || 'h264';
47
+ const tbr = Math.round(entry.Bitrate / 1000);
48
+ formats.push({
49
+ format_id: formatId,
50
+ format: `${formatId} - ${w}x${h}`,
51
+ format_note: pickFormatNote(entry),
52
+ ext: entry.Format || 'mp4',
53
+ vcodec: codec, acodec: 'aac',
54
+ width: w, height: h,
55
+ resolution: `${w}x${h}`,
56
+ tbr, filesize,
57
+ url, urls: urlList,
58
+ quality: entry.QualityType,
59
+ dynamic_range: 'SDR',
60
+ aspect_ratio: w > 0 && h > 0 ? +(w / h).toFixed(2) : 0,
61
+ protocol: 'https',
62
+ });
63
+ });
64
+ return formats;
65
+ }
66
+ export function extractSubtitles(item) {
67
+ const infos = item.video?.subtitleInfos;
68
+ if (!infos?.length)
69
+ return {};
70
+ const subtitles = {};
71
+ for (const sub of infos) {
72
+ const lang = sub.LanguageCodeName || 'unknown';
73
+ if (!subtitles[lang])
74
+ subtitles[lang] = [];
75
+ subtitles[lang].push({
76
+ url: sub.Url,
77
+ ext: sub.Format === 'webvtt' ? 'vtt' : sub.Format || 'vtt',
78
+ });
79
+ }
80
+ return subtitles;
81
+ }
82
+ export function findBestQuality(item) {
83
+ const bitrateInfo = item.video?.bitrateInfo;
84
+ if (!bitrateInfo?.length)
85
+ return null;
86
+ let best = null;
87
+ for (const entry of bitrateInfo) {
88
+ if (!entry)
89
+ continue;
90
+ if (!best) {
91
+ best = entry;
92
+ continue;
93
+ }
94
+ const entryArea = (entry.PlayAddr?.Width ?? 0) * (entry.PlayAddr?.Height ?? 0);
95
+ const bestArea = (best.PlayAddr?.Width ?? 0) * (best.PlayAddr?.Height ?? 0);
96
+ if (entryArea > bestArea || (entryArea === bestArea && entry.Bitrate > best.Bitrate)) {
97
+ best = entry;
98
+ }
99
+ }
100
+ if (!best)
101
+ return null;
102
+ return {
103
+ width: best.PlayAddr?.Width ?? 0,
104
+ height: best.PlayAddr?.Height ?? 0,
105
+ url: best.PlayAddr?.UrlList?.[0] ?? '',
106
+ codec: best.CodecType ?? '',
107
+ bitrate: best.Bitrate ?? 0,
108
+ };
109
+ }
110
+ //# sourceMappingURL=FormatExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormatExtractor.js","sourceRoot":"","sources":["../../src/scrapers/FormatExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ItemStruct } from '../types.js';
2
+ export interface ParseResult {
3
+ itemStruct: ItemStruct;
4
+ strategy: string;
5
+ raw?: string;
6
+ }
7
+ export declare function extractUserPageData(html: string): {
8
+ user: Record<string, unknown>;
9
+ stats: Record<string, unknown>;
10
+ userInfo: Record<string, unknown>;
11
+ } | null;
12
+ export declare class ParserEngine {
13
+ private strategies;
14
+ constructor();
15
+ parse(html: string): ParseResult;
16
+ }
17
+ //# sourceMappingURL=ParserEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParserEngine.d.ts","sourceRoot":"","sources":["../../src/scrapers/ParserEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAgKD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAkB7G;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAmB;;IAWrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;CAcjC"}
@@ -0,0 +1,201 @@
1
+ import { TikTokParseError } from '../utils/errors.js';
2
+ function extractUniversalData(html) {
3
+ const match = html.match(/<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>(.*?)<\/script>/s);
4
+ if (!match?.[1])
5
+ return null;
6
+ try {
7
+ const data = JSON.parse(match[1]);
8
+ const scope = data.__DEFAULT_SCOPE__ ?? data;
9
+ // Try known paths first
10
+ const knownPaths = [
11
+ () => scope?.['webapp.video-detail']?.itemInfo?.itemStruct,
12
+ () => scope?.webapp?.['video-detail']?.itemInfo?.itemStruct,
13
+ () => scope?.['video-detail']?.itemInfo?.itemStruct,
14
+ ];
15
+ for (const getter of knownPaths) {
16
+ const result = getter();
17
+ if (result && result.id && result.video)
18
+ return result;
19
+ }
20
+ // Recursive search: find ANY object with id+video fields (TikTok's HTML varies by IP)
21
+ function findItemStruct(obj, depth = 0) {
22
+ if (depth > 8 || !obj || typeof obj !== 'object')
23
+ return null;
24
+ if (Array.isArray(obj)) {
25
+ for (const item of obj) {
26
+ const found = findItemStruct(item, depth + 1);
27
+ if (found)
28
+ return found;
29
+ }
30
+ return null;
31
+ }
32
+ const o = obj;
33
+ if (o.id && o.video && typeof o.video === 'object') {
34
+ return o;
35
+ }
36
+ for (const val of Object.values(o)) {
37
+ const found = findItemStruct(val, depth + 1);
38
+ if (found)
39
+ return found;
40
+ }
41
+ return null;
42
+ }
43
+ return findItemStruct(scope);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ function extractSigiState(html) {
50
+ const match = html.match(/<script id="SIGI_STATE"[^>]*>(.*?)<\/script>/s);
51
+ if (!match?.[1])
52
+ return null;
53
+ try {
54
+ const data = JSON.parse(match[1]);
55
+ const modules = data.ItemModule;
56
+ if (modules) {
57
+ const keys = Object.keys(modules);
58
+ if (keys.length)
59
+ return modules[keys[0]];
60
+ }
61
+ const users = data.UserModule?.users;
62
+ if (users) {
63
+ const keys = Object.keys(users);
64
+ if (keys.length)
65
+ return users[keys[0]];
66
+ }
67
+ return null;
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ function extractLDJson(html) {
74
+ const matches = html.matchAll(/<script type="application\/ld\+json"[^>]*>(.*?)<\/script>/gs);
75
+ for (const m of matches) {
76
+ try {
77
+ const data = JSON.parse(m[1]);
78
+ if (data?.['@type'] === 'VideoObject' || data?.['@type']?.includes?.('VideoObject')) {
79
+ const partial = {
80
+ id: data.identifier ?? data.url?.match(/\/(\d+)/)?.[1] ?? '',
81
+ desc: data.description ?? data.name ?? '',
82
+ createTime: data.datePublished
83
+ ? Math.floor(new Date(data.datePublished).getTime() / 1000)
84
+ : 0,
85
+ video: {
86
+ id: data.identifier ?? '',
87
+ height: data.height ?? 0,
88
+ width: data.width ?? 0,
89
+ duration: parseISO8601Duration(data.duration ?? ''),
90
+ ratio: '',
91
+ cover: data.thumbnailUrl?.[0] ?? '',
92
+ originCover: data.thumbnailUrl?.[0] ?? '',
93
+ dynamicCover: '',
94
+ playAddr: data.contentUrl ?? '',
95
+ downloadAddr: '',
96
+ bitrate: 0,
97
+ encodedType: '',
98
+ format: 'mp4',
99
+ videoQuality: '',
100
+ codecType: '',
101
+ definition: '',
102
+ subtitleInfos: [],
103
+ size: 0,
104
+ PlayAddrStruct: { DataSize: '0', Width: 0, Height: 0, Uri: '', UrlList: [], UrlKey: '' },
105
+ zoomCover: {},
106
+ },
107
+ author: {
108
+ id: data.author?.identifier ?? '',
109
+ uniqueId: data.author?.name?.toLowerCase?.() ?? '',
110
+ nickname: data.author?.name ?? '',
111
+ signature: '',
112
+ verified: false,
113
+ secUid: '',
114
+ avatarLarger: '',
115
+ avatarMedium: '',
116
+ avatarThumb: '',
117
+ followerCount: 0,
118
+ followingCount: 0,
119
+ heartCount: 0,
120
+ videoCount: 0,
121
+ },
122
+ stats: { playCount: 0, diggCount: 0, commentCount: 0, shareCount: 0, collectCount: 0 },
123
+ };
124
+ return partial;
125
+ }
126
+ }
127
+ catch { }
128
+ }
129
+ return null;
130
+ }
131
+ function parseISO8601Duration(dur) {
132
+ const match = dur.match(/PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?/);
133
+ if (!match)
134
+ return 0;
135
+ const h = parseInt(match[1] ?? '0', 10);
136
+ const m = parseInt(match[2] ?? '0', 10);
137
+ const s = parseInt(match[3] ?? '0', 10);
138
+ return h * 3600 + m * 60 + s;
139
+ }
140
+ function extractFromScripts(html) {
141
+ const matches = html.matchAll(/<script[^>]*>(.*?)<\/script>/gs);
142
+ for (const m of matches) {
143
+ const text = m[1]?.trim();
144
+ if (!text)
145
+ continue;
146
+ if (!text.includes('itemInfo') && !text.includes('ItemModule'))
147
+ continue;
148
+ try {
149
+ const data = JSON.parse(text);
150
+ const item = data?.itemInfo?.itemStruct ??
151
+ (data?.ItemModule ? Object.values(data.ItemModule)[0] : null);
152
+ if (item)
153
+ return item;
154
+ }
155
+ catch { }
156
+ }
157
+ return null;
158
+ }
159
+ export function extractUserPageData(html) {
160
+ const match = html.match(/<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__"[^>]*>(.*?)<\/script>/s);
161
+ if (!match?.[1])
162
+ return null;
163
+ try {
164
+ const data = JSON.parse(match[1]);
165
+ const scope = data.__DEFAULT_SCOPE__;
166
+ const userInfo = scope?.['webapp.user-detail']?.userInfo;
167
+ if (!userInfo?.user)
168
+ return null;
169
+ return {
170
+ user: userInfo.user,
171
+ stats: userInfo.stats,
172
+ userInfo: userInfo,
173
+ };
174
+ }
175
+ catch {
176
+ return null;
177
+ }
178
+ }
179
+ export class ParserEngine {
180
+ strategies;
181
+ constructor() {
182
+ this.strategies = [
183
+ extractUniversalData,
184
+ extractSigiState,
185
+ extractFromScripts,
186
+ extractLDJson,
187
+ ];
188
+ }
189
+ parse(html) {
190
+ let attempts = 0;
191
+ for (const strategy of this.strategies) {
192
+ attempts++;
193
+ const result = strategy(html);
194
+ if (result && result.id && result.video) {
195
+ return { itemStruct: result, strategy: strategy.name };
196
+ }
197
+ }
198
+ throw new TikTokParseError(`Failed to parse TikTok page data after ${attempts} strategies`, attempts);
199
+ }
200
+ }
201
+ //# sourceMappingURL=ParserEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParserEngine.js","sourceRoot":"","sources":["../../src/scrapers/ParserEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { TikTokUserSearchResults, SearchUserResult, AvatarInfo, Session } from '../types.js';
2
+ export declare function buildAvatarInfo(url: string): AvatarInfo;
3
+ export declare function parseSearchUser(data: Record<string, any>): SearchUserResult;
4
+ export declare function searchUsers(query: string, proxy: string, cursor?: number, count?: number, session?: Session): Promise<TikTokUserSearchResults>;
5
+ //# sourceMappingURL=SearchScraper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchScraper.d.ts","sourceRoot":"","sources":["../../src/scrapers/SearchScraper.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAqBlG,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAuBvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,gBAAgB,CAyB3E;AAoBD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,SAAI,EACV,KAAK,SAAK,EACV,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,uBAAuB,CAAC,CAwElC"}