abot-scraper 1.1.3 → 1.2.1

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.
package/dist/index.cjs ADDED
@@ -0,0 +1,591 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ Downloader: () => Downloader,
34
+ Search: () => Search,
35
+ default: () => index_default,
36
+ downloader: () => downloader,
37
+ search: () => search
38
+ });
39
+ module.exports = __toCommonJS(index_exports);
40
+
41
+ // src/scraper/downloader.ts
42
+ var import_axios = __toESM(require("axios"), 1);
43
+ var cheerio = __toESM(require("cheerio"), 1);
44
+ var import_qs = __toESM(require("qs"), 1);
45
+
46
+ // src/utils/generator.ts
47
+ var import_crypto = __toESM(require("crypto"), 1);
48
+ var Generator = class {
49
+ generateTimeStampYoutubeDL() {
50
+ return Date.now().toString();
51
+ }
52
+ generateFooterYoutubeDL(timestamp, link) {
53
+ const locale = "en";
54
+ const secretKey = "6HTugjCXxR";
55
+ const input = link + locale + timestamp + secretKey;
56
+ const hash = import_crypto.default.createHash("md5").update(input).digest("hex");
57
+ return hash;
58
+ }
59
+ };
60
+
61
+ // src/scraper/downloader.ts
62
+ global.creator = "@abotscraper \u2013 ahmuq";
63
+ var Downloader = class {
64
+ constructor() {
65
+ this.generator = new Generator();
66
+ }
67
+ async facebook(url) {
68
+ try {
69
+ const headers = {
70
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0",
71
+ Origin: "https://www.fdown.world",
72
+ referer: "https://www.fdown.world/",
73
+ "x-requested-with": "XMLHttpRequest",
74
+ Cookie: "codehap_domain=www.fdown.world"
75
+ };
76
+ const data = new URLSearchParams({ codehap_link: url, codehap: "true" });
77
+ const response = await import_axios.default.post(
78
+ "https://www.fdown.world/result.php",
79
+ data,
80
+ { headers }
81
+ );
82
+ const $ = cheerio.load(response.data);
83
+ const videoUrl = $("video source").attr("src");
84
+ const imageUrl = $("img").attr("src");
85
+ if (!videoUrl && !imageUrl) {
86
+ throw new Error("No video or image found in the response.");
87
+ }
88
+ return {
89
+ creator: global.creator,
90
+ status: 200,
91
+ result: {
92
+ thumbnail: imageUrl || "",
93
+ videoUrl: videoUrl || ""
94
+ }
95
+ };
96
+ } catch (error) {
97
+ return {
98
+ creator: global.creator,
99
+ status: false,
100
+ msg: error instanceof Error ? error.message : "Unknown error"
101
+ };
102
+ }
103
+ }
104
+ async tiktokDownloader(url) {
105
+ try {
106
+ const headers = {
107
+ "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
108
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
109
+ };
110
+ const data = new URLSearchParams({
111
+ id: url,
112
+ locale: "en",
113
+ tt: "WmNzZDk_"
114
+ });
115
+ const response = await import_axios.default.post(
116
+ "https://ssstik.io/abc?url=dl",
117
+ data,
118
+ {
119
+ headers
120
+ }
121
+ );
122
+ const $ = cheerio.load(response.data);
123
+ const title = $("p.maintext").text().trim();
124
+ const audio = $("a.download_link.music").attr("href");
125
+ const video = $("a.download_link.without_watermark").attr("href");
126
+ if (!title || !video) {
127
+ throw new Error("Failed to extract video or title from response.");
128
+ }
129
+ return {
130
+ creator: global.creator,
131
+ status: 200,
132
+ result: {
133
+ title,
134
+ video: video || "",
135
+ audio: audio || ""
136
+ }
137
+ };
138
+ } catch (error) {
139
+ return {
140
+ creator: global.creator,
141
+ status: false,
142
+ msg: error instanceof Error ? error.message : "Unknown error"
143
+ };
144
+ }
145
+ }
146
+ async igstory(username) {
147
+ const payload = {
148
+ username
149
+ };
150
+ const headers = {
151
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/",
152
+ accept: "application/json, text/plain, */*",
153
+ "accept-language": "en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6",
154
+ "content-type": "application/json",
155
+ priority: "u=1, i",
156
+ "sec-ch-ua": '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
157
+ "sec-ch-ua-mobile": "?0",
158
+ "sec-ch-ua-platform": '"Windows"',
159
+ "sec-fetch-dest": "empty",
160
+ "sec-fetch-mode": "cors",
161
+ "sec-fetch-site": "same-origin",
162
+ Referer: "https://storyviewer.com/",
163
+ "Referrer-Policy": "strict-origin-when-cross-origin"
164
+ };
165
+ try {
166
+ const response = await import_axios.default.post(
167
+ `https://storyviewer.com/api/data`,
168
+ payload,
169
+ { headers }
170
+ );
171
+ const data = response.data;
172
+ const sources = data.stories.map((story) => story.source);
173
+ return {
174
+ creator: global.creator,
175
+ status: 200,
176
+ result: {
177
+ user_info: data.user_info,
178
+ links: sources
179
+ }
180
+ };
181
+ } catch (error) {
182
+ return {
183
+ creator: global.creator,
184
+ status: false,
185
+ msg: error instanceof Error ? error.message : "Unknown error"
186
+ };
187
+ }
188
+ }
189
+ async instagram(url) {
190
+ try {
191
+ const config = new URLSearchParams({
192
+ url,
193
+ new: "2",
194
+ lang: "en",
195
+ app: ""
196
+ });
197
+ const headers = {
198
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
199
+ };
200
+ const response = await import_axios.default.post(
201
+ "https://snapinsta.app/get-data.php",
202
+ config,
203
+ { headers }
204
+ );
205
+ const downloadLinks = response.data.files.map(
206
+ (file) => file.__type === "GraphVideo" ? { type: "video", url: file.video_url || "" } : file.__type === "GraphImage" ? { type: "image", url: file.download_url || "" } : null
207
+ ).filter((link) => link !== null);
208
+ return {
209
+ creator: global.creator,
210
+ status: 200,
211
+ result: downloadLinks
212
+ };
213
+ } catch (error) {
214
+ return {
215
+ creator: global.creator,
216
+ status: false,
217
+ msg: error instanceof Error ? error.message : "Unknown error"
218
+ };
219
+ }
220
+ }
221
+ async youtubeDownloader(url) {
222
+ try {
223
+ const config = import_qs.default.stringify({
224
+ url,
225
+ q_auto: 0,
226
+ ajax: 1,
227
+ lang: "en"
228
+ });
229
+ const headers = {
230
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
231
+ };
232
+ const response = await import_axios.default.post(
233
+ "https://yt1s.net/ajax?retry=undefined&platform=youtube",
234
+ config,
235
+ { headers }
236
+ );
237
+ const $ = cheerio.load(response.data.result);
238
+ const title = $(".caption b").text().trim();
239
+ const downloadLinks = {
240
+ "480p": $('a[data-fquality="480p"]').attr("href") || "",
241
+ "720p": $('a[data-fquality="720p"]').attr("href") || "",
242
+ "1080p": $('a[data-fquality="1080p"]').attr("href") || ""
243
+ };
244
+ const thumbnailUrl = $(".thumbnail.cover img").attr("src");
245
+ const mp3ConvertElement = $("#convert-mp3 a");
246
+ const hrefAttr = mp3ConvertElement.attr("href");
247
+ if (!hrefAttr) throw new Error("MP3 conversion link not found.");
248
+ const mp3ConvertTokenMatch = hrefAttr.match(
249
+ /mp3_convert_task\('(\d+)',\s*'([^']+)'\)/
250
+ );
251
+ if (!mp3ConvertTokenMatch)
252
+ throw new Error("MP3 conversion token not found.");
253
+ const mp3ConvertToken = mp3ConvertTokenMatch[2];
254
+ const mp3Response = await import_axios.default.get(
255
+ `https://api.fabdl.com/youtube/mp3-convert-task?token=${mp3ConvertToken}`
256
+ );
257
+ return {
258
+ creator: global.creator,
259
+ status: 200,
260
+ result: {
261
+ title,
262
+ thumbnail: thumbnailUrl || "",
263
+ downloadLinks,
264
+ mp3DownloadUrl: `https://api.fabdl.com${mp3Response.data.result.download_url}`
265
+ }
266
+ };
267
+ } catch (error) {
268
+ return {
269
+ creator: global.creator,
270
+ status: false,
271
+ msg: error instanceof Error ? error.message : "Unknown error"
272
+ };
273
+ }
274
+ }
275
+ async youtubeDownloaderV2(url) {
276
+ try {
277
+ const timestamp = this.generator.generateTimeStampYoutubeDL();
278
+ const footer = this.generator.generateFooterYoutubeDL(timestamp, url);
279
+ const payload = {
280
+ link: url
281
+ };
282
+ const headers = {
283
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
284
+ "g-footer": footer,
285
+ "g-timestamp": timestamp,
286
+ accept: "*/*",
287
+ "accept-language": "en",
288
+ "content-type": "application/json",
289
+ priority: "u=1, i",
290
+ "sec-ch-ua": '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
291
+ "sec-ch-ua-mobile": "?0",
292
+ "sec-ch-ua-platform": '"Windows"',
293
+ "sec-fetch-dest": "empty",
294
+ "sec-fetch-mode": "cors",
295
+ "sec-fetch-site": "same-site",
296
+ Referer: "https://snapany.com/",
297
+ "Referrer-Policy": "strict-origin-when-cross-origin"
298
+ };
299
+ const response = await import_axios.default.post(
300
+ "https://api.snapany.com/v1/extract",
301
+ payload,
302
+ { headers }
303
+ );
304
+ const data = response.data;
305
+ const videoMedia = data.medias.find(
306
+ (media) => media.media_type === "video"
307
+ );
308
+ const audioMedia = data.medias.find(
309
+ (media) => media.media_type === "audio"
310
+ );
311
+ const downloadLinks = {};
312
+ if (videoMedia && videoMedia.formats) {
313
+ videoMedia.formats.forEach((format) => {
314
+ const qualityKey = `${format.quality}p`;
315
+ downloadLinks[qualityKey] = format.video_url;
316
+ });
317
+ }
318
+ return {
319
+ creator: global.creator,
320
+ status: 200,
321
+ result: {
322
+ title: data.text,
323
+ thumbnail: (videoMedia == null ? void 0 : videoMedia.preview_url) || null,
324
+ downloadLinks,
325
+ video: (videoMedia == null ? void 0 : videoMedia.resource_url) || null,
326
+ audio: (audioMedia == null ? void 0 : audioMedia.resource_url) || null,
327
+ formats: (videoMedia == null ? void 0 : videoMedia.formats) || []
328
+ }
329
+ };
330
+ } catch (error) {
331
+ return {
332
+ creator: global.creator,
333
+ status: false,
334
+ msg: error instanceof Error ? error.message : "Unknown error"
335
+ };
336
+ }
337
+ }
338
+ async sfileDownloader(url) {
339
+ var _a;
340
+ try {
341
+ const response = await import_axios.default.get(url, {
342
+ headers: {
343
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
344
+ Referer: "https://sfile.mobi/",
345
+ "Accept-Language": "en-US,en;q=0.9"
346
+ }
347
+ });
348
+ const $ = cheerio.load(response.data);
349
+ const filename = $(".intro-container img").attr("alt") || "";
350
+ const mimetype = ((_a = $("div.list").text().split(" - ")[1]) == null ? void 0 : _a.split("\n")[0]) || "";
351
+ const downloadHref = $("#download").attr("href");
352
+ const download = downloadHref ? downloadHref + "&k=" + Math.floor(Math.random() * (15 - 10 + 1) + 10) : "";
353
+ return {
354
+ creator: global.creator,
355
+ status: 200,
356
+ result: { filename, mimetype, download }
357
+ };
358
+ } catch (error) {
359
+ return {
360
+ creator: global.creator,
361
+ status: false,
362
+ msg: error instanceof Error ? error.message : "Unknown error"
363
+ };
364
+ }
365
+ }
366
+ };
367
+
368
+ // src/scraper/search.ts
369
+ var import_axios2 = __toESM(require("axios"), 1);
370
+ var cheerio2 = __toESM(require("cheerio"), 1);
371
+ global.creator = "@abotscraper \u2013 ahmuq";
372
+ var Search = class {
373
+ constructor() {
374
+ this.ytPlay = (text) => {
375
+ return new Promise((resolve, reject) => {
376
+ const configd = {
377
+ k_query: text,
378
+ k_page: "mp3",
379
+ q_auto: 1
380
+ };
381
+ const headerss = {
382
+ "sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
383
+ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
384
+ Cookie: 'PHPSESSID=6jo2ggb63g5mjvgj45f612ogt7; _ga=GA1.2.405896420.1625200423; _gid=GA1.2.2135261581.1625200423; _PN_SBSCRBR_FALLBACK_DENIED=1625200785624; MarketGidStorage={"0":{},"C702514":{"page":5,"time":1625200846733}}'
385
+ };
386
+ (0, import_axios2.default)("https://www.y2mate.com/mates/analyzeV2/ajax", {
387
+ method: "POST",
388
+ data: new URLSearchParams(Object.entries(configd)),
389
+ headers: headerss
390
+ }).then(({ data }) => {
391
+ const v = data.vitems;
392
+ const v2 = v[Math.floor(Math.random() * v.length)].v;
393
+ const url = "https://www.youtube.com/watch?v=" + v2;
394
+ const config = {
395
+ k_query: "https://www.youtube.be/" + url,
396
+ k_page: "mp3",
397
+ hl: "en",
398
+ q_auto: 1
399
+ };
400
+ (0, import_axios2.default)("https://www.y2mate.com/mates/en68/analyze/ajax", {
401
+ method: "POST",
402
+ data: new URLSearchParams({
403
+ url: "https://www.youtube.be/" + url,
404
+ q_auto: "0",
405
+ ajax: "1"
406
+ }),
407
+ headers: headerss
408
+ }).then(({ data: data2 }) => {
409
+ const $ = cheerio2.load(data2.result);
410
+ const img = $("div.thumbnail.cover > a > img").attr("src");
411
+ (0, import_axios2.default)("https://www.y2mate.com/mates/analyzeV2/ajax", {
412
+ method: "POST",
413
+ data: new URLSearchParams(Object.entries(config)),
414
+ headers: headerss
415
+ }).then(({ data: data3 }) => {
416
+ const convertConfig = {
417
+ vid: data3.vid,
418
+ k: data3.links.mp3.mp3128.k
419
+ };
420
+ const size = data3.links.mp3.mp3128.size;
421
+ (0, import_axios2.default)("https://www.y2mate.com/mates/convertV2/index", {
422
+ method: "POST",
423
+ data: new URLSearchParams(Object.entries(convertConfig)),
424
+ headers: headerss
425
+ }).then((response) => {
426
+ resolve({
427
+ creator: global.creator,
428
+ status: 200,
429
+ result: {
430
+ status: response.data.status,
431
+ title: response.data.title,
432
+ ftype: response.data.ftype,
433
+ thumb: img || "",
434
+ size_mp3: size,
435
+ link: response.data.dlink
436
+ }
437
+ });
438
+ }).catch(reject);
439
+ });
440
+ });
441
+ }).catch(reject);
442
+ });
443
+ };
444
+ this.wallpaper = (title, page = "1") => {
445
+ return new Promise((resolve, reject) => {
446
+ import_axios2.default.get(
447
+ `https://www.besthdwallpaper.com/search?CurrentPage=${page}&q=${title}`
448
+ ).then(({ data }) => {
449
+ const $ = cheerio2.load(data);
450
+ const hasil = [];
451
+ $("div.grid-item").each(function(_, b) {
452
+ const titleAttr = $(b).find("p[title]").attr("title");
453
+ const typeText = $(b).find("div.info > a:nth-child(2)").text();
454
+ const hrefAttr = $(b).find("a").attr("href");
455
+ const imgSrc = $(b).find("picture > img").attr("src");
456
+ const srcset1 = $(b).find("picture > source:nth-child(1)").attr("srcset");
457
+ const srcset2 = $(b).find("picture > source:nth-child(2)").attr("srcset");
458
+ if (titleAttr && hrefAttr) {
459
+ hasil.push({
460
+ title: titleAttr.trim(),
461
+ type: (typeText == null ? void 0 : typeText.trim()) || "",
462
+ source: "https://www.besthdwallpaper.com" + hrefAttr,
463
+ image: [imgSrc || "", srcset1 || "", srcset2 || ""]
464
+ });
465
+ }
466
+ });
467
+ resolve({ creator: global.creator, status: 200, result: hasil });
468
+ }).catch((error) => {
469
+ reject(error);
470
+ });
471
+ });
472
+ };
473
+ this.wikimedia = (title) => {
474
+ return new Promise((resolve, reject) => {
475
+ import_axios2.default.get(
476
+ `https://commons.wikimedia.org/w/index.php?search=${title}&title=Special:MediaSearch&go=Go&type=image`
477
+ ).then((res) => {
478
+ const $ = cheerio2.load(res.data);
479
+ const hasil = [];
480
+ $(".sdms-search-results__list-wrapper > div > a").each(function(_, b) {
481
+ const altText = $(b).find("img").attr("alt");
482
+ const href = $(b).attr("href");
483
+ const dataSrc = $(b).find("img").attr("data-src");
484
+ const src = $(b).find("img").attr("src");
485
+ if (altText && href) {
486
+ hasil.push({
487
+ title: altText,
488
+ source: href,
489
+ image: dataSrc || src || ""
490
+ });
491
+ }
492
+ });
493
+ resolve({ creator: global.creator, status: 200, result: hasil });
494
+ }).catch(reject);
495
+ });
496
+ };
497
+ }
498
+ async sfileSearch(query, page = 1) {
499
+ try {
500
+ const response = await import_axios2.default.get(
501
+ `https://sfile.mobi/search.php?q=${query}&page=${page}`,
502
+ {
503
+ headers: {
504
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
505
+ Referer: "https://sfile.mobi/",
506
+ "Accept-Language": "en-US,en;q=0.9"
507
+ }
508
+ }
509
+ );
510
+ const $ = cheerio2.load(response.data);
511
+ const results = [];
512
+ $("div.list").each(function() {
513
+ const title = $(this).find("a").text();
514
+ const sizeText = $(this).text().trim().split("(")[1];
515
+ const link = $(this).find("a").attr("href");
516
+ if (link && sizeText) {
517
+ results.push({
518
+ title,
519
+ size: sizeText.replace(")", ""),
520
+ link
521
+ });
522
+ }
523
+ });
524
+ return {
525
+ creator: global.creator,
526
+ status: 200,
527
+ result: results
528
+ };
529
+ } catch (error) {
530
+ return {
531
+ creator: global.creator,
532
+ status: false,
533
+ msg: error instanceof Error ? error.message : "Unknown error"
534
+ };
535
+ }
536
+ }
537
+ async ytSearch(query) {
538
+ var _a;
539
+ try {
540
+ const headers = {
541
+ accept: "*/*",
542
+ "accept-language": "en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6",
543
+ priority: "u=1, i",
544
+ "sec-ch-ua": '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
545
+ "sec-ch-ua-mobile": "?0",
546
+ "sec-ch-ua-platform": '"Windows"',
547
+ "sec-fetch-dest": "empty",
548
+ "sec-fetch-mode": "cors",
549
+ "sec-fetch-site": "cross-site"
550
+ };
551
+ const response = await import_axios2.default.get(
552
+ `https://line.1010diy.com/web/free-mp3-finder/query?q=${encodeURIComponent(query)}&type=youtube&pageToken=`,
553
+ { headers }
554
+ );
555
+ const data = response.data;
556
+ const videos = ((_a = data == null ? void 0 : data.data) == null ? void 0 : _a.items) || [];
557
+ const results = videos.map((item) => ({
558
+ title: item.title,
559
+ thumbnail: item.thumbnail,
560
+ url: item.url
561
+ }));
562
+ return {
563
+ creator: global.creator,
564
+ status: 200,
565
+ result: results
566
+ };
567
+ } catch (error) {
568
+ return {
569
+ creator: global.creator,
570
+ status: false,
571
+ msg: error instanceof Error ? error.message : "Unknown error"
572
+ };
573
+ }
574
+ }
575
+ };
576
+
577
+ // src/index.ts
578
+ var downloader = new Downloader();
579
+ var search = new Search();
580
+ var index_default = {
581
+ downloader,
582
+ search
583
+ };
584
+ // Annotate the CommonJS export names for ESM import in node:
585
+ 0 && (module.exports = {
586
+ Downloader,
587
+ Search,
588
+ downloader,
589
+ search
590
+ });
591
+ //# sourceMappingURL=index.cjs.map