abot-scraper
Version:
scraper random for downloader and searching
807 lines (800 loc) • 28.9 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
Downloader: () => Downloader,
Search: () => Search,
Tools: () => Tools,
default: () => index_default,
downloader: () => downloader,
search: () => search,
tools: () => tools
});
module.exports = __toCommonJS(index_exports);
// src/scraper/downloader.ts
var import_axios = __toESM(require("axios"), 1);
var cheerio = __toESM(require("cheerio"), 1);
var import_qs = __toESM(require("qs"), 1);
// src/utils/generator.ts
var import_crypto = __toESM(require("crypto"), 1);
var Generator = class {
generateTimeStampYoutubeDL() {
return Date.now().toString();
}
generateFooterYoutubeDL(timestamp, link) {
const locale = "en";
const secretKey = "6HTugjCXxR";
const input = link + locale + timestamp + secretKey;
const hash = import_crypto.default.createHash("md5").update(input).digest("hex");
return hash;
}
formatFileSize(bytes) {
if (bytes === 0) return "0 Bytes";
const k = 1024;
const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
}
static generateVisitorId() {
const components = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"1920x1080",
(/* @__PURE__ */ new Date()).getTimezoneOffset().toString(),
"en-US",
"Win32",
Math.random().toString(36).substring(2, 15),
Date.now().toString(),
process.pid.toString(),
Math.floor(Math.random() * 1e6).toString()
];
const fingerprint = import_crypto.default.createHash("md5").update(components.join("|")).digest("hex");
return fingerprint;
}
static getFingerprint() {
const visitorId = this.generateVisitorId();
return visitorId;
}
};
// src/scraper/downloader.ts
global.creator = "@abotscraper \u2013 ahmuq";
var Downloader = class {
constructor() {
this.ytMp3Downloader = (url) => {
return new Promise((resolve, reject) => {
const headers = {
accept: "*/*",
"accept-language": "en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
priority: "u=1, i",
"sec-ch-ua": '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site",
Referer: "https://y2hub.com/",
"Referrer-Policy": "strict-origin-when-cross-origin"
};
const payload = import_qs.default.stringify({
action: "yt_convert",
nonce: "1495b10e48",
youtube_url: url
});
(0, import_axios.default)(`https://youtubemp4free.com/wp-admin/admin-ajax.php`, {
method: "POST",
headers,
data: payload
}).then(({ data }) => {
if (!data.success) {
return reject(new Error("Failed to fetch video data"));
}
const videoInfo = data.data.info;
const slug = data.data.slug;
const size = data.data.size;
return (0, import_axios.default)("https://ryin.info/", {
method: "GET",
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0"
}
}).then((response) => {
const setCookieHeaders = response.headers["set-cookie"];
let cookies;
if (setCookieHeaders) {
cookies = setCookieHeaders.map((cookie) => cookie.split(";")[0]).join("; ");
} else {
cookies = "PHPSESSID=fl86pmq4dqgh2835b32mdm7380; csrf_cookie_name=739e04fcc21050c61c5325b34f449659; lang=en";
}
const pageUrl = "https://ryin.info/" + slug;
return (0, import_axios.default)(pageUrl, {
method: "GET",
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0",
Cookie: cookies
}
}).then((response2) => {
const html = response2.data;
const $ = cheerio.load(html);
const downloadHref = $("#download-url").attr("download-href");
if (!downloadHref) {
return reject(new Error("Download link not found on page"));
}
resolve({
creator: global.creator,
status: true,
title: videoInfo.title,
thumbnail: videoInfo.thumbnail,
description: videoInfo.description,
viewCount: videoInfo.view_count,
size: this.generator.formatFileSize(size),
downloadUrl: downloadHref
});
});
});
}).catch((error) => {
reject({
creator: global.creator,
status: false,
error: error.message
});
});
});
};
this.generator = new Generator();
}
async facebookDownloader(url) {
try {
const headers = {
"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",
Origin: "https://www.fdown.world",
referer: "https://www.fdown.world/",
"x-requested-with": "XMLHttpRequest",
Cookie: "codehap_domain=www.fdown.world"
};
const data = new URLSearchParams({ codehap_link: url, codehap: "true" });
const response = await import_axios.default.post(
"https://www.fdown.world/result.php",
data,
{ headers }
);
const $ = cheerio.load(response.data);
const videoUrl = $("video source").attr("src");
const imageUrl = $("img").attr("src");
if (!videoUrl && !imageUrl) {
throw new Error("No video or image found in the response.");
}
return {
creator: global.creator,
status: 200,
result: {
thumbnail: imageUrl || "",
videoUrl: videoUrl || ""
}
};
} catch (error) {
return {
creator: global.creator,
status: false,
msg: error instanceof Error ? error.message : "Unknown error"
};
}
}
async tiktokDownloader(url) {
try {
const headers = {
"sec-ch-ua": '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
"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"
};
const data = new URLSearchParams({
id: url,
locale: "en",
tt: "WmNzZDk_"
});
const response = await import_axios.default.post(
"https://ssstik.io/abc?url=dl",
data,
{
headers
}
);
const $ = cheerio.load(response.data);
const title = $("p.maintext").text().trim();
const audio = $("a.download_link.music").attr("href");
const video = $("a.download_link.without_watermark").attr("href");
if (!title || !video) {
throw new Error("Failed to extract video or title from response.");
}
return {
creator: global.creator,
status: 200,
result: {
title,
video: video || "",
audio: audio || ""
}
};
} catch (error) {
return {
creator: global.creator,
status: false,
msg: error instanceof Error ? error.message : "Unknown error"
};
}
}
async instagramDownloader(url) {
try {
const payload = new URLSearchParams({ url });
const headers = {
accept: "*/*",
"accept-language": "en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6",
"content-type": "application/x-www-form-urlencoded",
priority: "u=1, i",
"sec-ch-ua": '"Not)A;Brand";v="8", "Chromium";v="138", "Microsoft Edge";v="138"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin"
};
const response = await import_axios.default.post(
"https://snapinsta.llc/process",
payload,
{ headers }
);
const $ = cheerio.load(response.data);
const downloadItems = [];
$(".download-item").each((_index, element) => {
const $element = $(element);
const previewImg = $element.find(".media-box img").attr("src");
const downloadLink = $element.find(".download-media").attr("href");
const downloadText = $element.find(".download-media").text().trim();
const isVideo = downloadText.toLowerCase().includes("video") || $element.find(".icon-downvid").length > 0;
if (downloadLink) {
const mediaItem = {
type: isVideo ? "video" : "image",
url: downloadLink
};
if (previewImg) {
mediaItem.preview = previewImg;
}
downloadItems.push(mediaItem);
}
});
if (downloadItems.length === 0) {
throw new Error("No media items found in the response.");
}
return {
creator: global.creator,
status: 200,
result: downloadItems
};
} catch (error) {
return {
creator: global.creator,
status: false,
msg: error instanceof Error ? error.message : "Unknown error"
};
}
}
async youtubeDownloader(url) {
try {
const timestamp = this.generator.generateTimeStampYoutubeDL();
const footer = this.generator.generateFooterYoutubeDL(timestamp, url);
const payload = {
link: url
};
const headers = {
"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",
"g-footer": footer,
"g-timestamp": timestamp,
accept: "*/*",
"accept-language": "en",
"content-type": "application/json",
priority: "u=1, i",
"sec-ch-ua": '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
Referer: "https://snapany.com/",
"Referrer-Policy": "strict-origin-when-cross-origin"
};
const response = await import_axios.default.post(
"https://api.snapany.com/v1/extract",
payload,
{ headers }
);
const data = response.data;
const videoMedia = data.medias.find(
(media) => media.media_type === "video"
);
const audioMedia = data.medias.find(
(media) => media.media_type === "audio"
);
const downloadLinks = {};
if (videoMedia && videoMedia.formats) {
videoMedia.formats.forEach((format) => {
const qualityKey = `${format.quality}p`;
downloadLinks[qualityKey] = format.video_url;
});
}
return {
creator: global.creator,
status: 200,
result: {
title: data.text,
thumbnail: (videoMedia == null ? void 0 : videoMedia.preview_url) || null,
downloadLinks,
video: (videoMedia == null ? void 0 : videoMedia.resource_url) || null,
audio: (audioMedia == null ? void 0 : audioMedia.resource_url) || null,
formats: (videoMedia == null ? void 0 : videoMedia.formats) || []
}
};
} catch (error) {
return {
creator: global.creator,
status: false,
msg: error instanceof Error ? error.message : "Unknown error"
};
}
}
async sfileDownloader(url) {
var _a;
try {
const response = await import_axios.default.get(url, {
headers: {
"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",
Referer: "https://sfile.mobi/",
"Accept-Language": "en-US,en;q=0.9"
}
});
const $ = cheerio.load(response.data);
const filename = $(".intro-container img").attr("alt") || "";
const mimetype = ((_a = $("div.list").text().split(" - ")[1]) == null ? void 0 : _a.split("\n")[0]) || "";
const downloadHref = $("#download").attr("href");
const download = downloadHref ? downloadHref + "&k=" + Math.floor(Math.random() * (15 - 10 + 1) + 10) : "";
return {
creator: global.creator,
status: 200,
result: { filename, mimetype, download }
};
} catch (error) {
return {
creator: global.creator,
status: false,
msg: error instanceof Error ? error.message : "Unknown error"
};
}
}
};
// src/scraper/search.ts
var import_axios2 = __toESM(require("axios"), 1);
var cheerio2 = __toESM(require("cheerio"), 1);
global.creator = "@abotscraper \u2013 ahmuq";
var Search = class {
constructor() {
this.wallpaper = (title, page = "1") => {
return new Promise((resolve, reject) => {
import_axios2.default.get(
`https://www.besthdwallpaper.com/search?CurrentPage=${page}&q=${title}`
).then(({ data }) => {
const $ = cheerio2.load(data);
const hasil = [];
$("div.grid-item").each(function(_, b) {
const titleAttr = $(b).find("p[title]").attr("title");
const typeText = $(b).find("div.info > a:nth-child(2)").text();
const hrefAttr = $(b).find("a").attr("href");
const imgSrc = $(b).find("picture > img").attr("src");
const srcset1 = $(b).find("picture > source:nth-child(1)").attr("srcset");
const srcset2 = $(b).find("picture > source:nth-child(2)").attr("srcset");
if (titleAttr && hrefAttr) {
hasil.push({
title: titleAttr.trim(),
type: (typeText == null ? void 0 : typeText.trim()) || "",
source: "https://www.besthdwallpaper.com" + hrefAttr,
image: [imgSrc || "", srcset1 || "", srcset2 || ""]
});
}
});
resolve({ creator: global.creator, status: 200, result: hasil });
}).catch((error) => {
reject(error);
});
});
};
this.wikimedia = (title) => {
return new Promise((resolve, reject) => {
import_axios2.default.get(
`https://commons.wikimedia.org/w/index.php?search=${title}&title=Special:MediaSearch&go=Go&type=image`
).then((res) => {
const $ = cheerio2.load(res.data);
const hasil = [];
$(".sdms-search-results__list-wrapper > div > a").each(function(_, b) {
const altText = $(b).find("img").attr("alt");
const href = $(b).attr("href");
const dataSrc = $(b).find("img").attr("data-src");
const src = $(b).find("img").attr("src");
if (altText && href) {
hasil.push({
title: altText,
source: href,
image: dataSrc || src || ""
});
}
});
resolve({ creator: global.creator, status: 200, result: hasil });
}).catch(reject);
});
};
}
async igStory(username) {
const payload = {
username
};
const headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/",
accept: "application/json, text/plain, */*",
"accept-language": "en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6",
"content-type": "application/json",
priority: "u=1, i",
"sec-ch-ua": '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
Referer: "https://storyviewer.com/",
"Referrer-Policy": "strict-origin-when-cross-origin"
};
try {
const response = await import_axios2.default.post(
`https://storyviewer.com/api/data`,
payload,
{ headers }
);
const data = response.data;
const sources = data.stories.map((story) => story.source);
return {
creator: global.creator,
status: 200,
result: {
user_info: data.user_info,
links: sources
}
};
} catch (error) {
return {
creator: global.creator,
status: false,
msg: error instanceof Error ? error.message : "Unknown error"
};
}
}
async sfileSearch(query, page = 1) {
try {
const response = await import_axios2.default.get(
`https://sfile.mobi/search.php?q=${query}&page=${page}`,
{
headers: {
"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",
Referer: "https://sfile.mobi/",
"Accept-Language": "en-US,en;q=0.9"
}
}
);
const $ = cheerio2.load(response.data);
const results = [];
$("div.list").each(function() {
const title = $(this).find("a").text();
const sizeText = $(this).text().trim().split("(")[1];
const link = $(this).find("a").attr("href");
if (link && sizeText) {
results.push({
title,
size: sizeText.replace(")", ""),
link
});
}
});
return {
creator: global.creator,
status: 200,
result: results
};
} catch (error) {
return {
creator: global.creator,
status: false,
msg: error instanceof Error ? error.message : "Unknown error"
};
}
}
async ytSearch(query) {
var _a;
try {
const headers = {
accept: "*/*",
"accept-language": "en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6",
priority: "u=1, i",
"sec-ch-ua": '"Microsoft Edge";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "cross-site"
};
const response = await import_axios2.default.get(
`https://line.1010diy.com/web/free-mp3-finder/query?q=${encodeURIComponent(query)}&type=youtube&pageToken=`,
{ headers }
);
const data = response.data;
const videos = ((_a = data == null ? void 0 : data.data) == null ? void 0 : _a.items) || [];
const results = videos.map((item) => ({
title: item.title,
thumbnail: item.thumbnail,
url: item.url
}));
return {
creator: global.creator,
status: 200,
result: results
};
} catch (error) {
return {
creator: global.creator,
status: false,
msg: error instanceof Error ? error.message : "Unknown error"
};
}
}
};
// src/scraper/tools.ts
var import_axios3 = __toESM(require("axios"), 1);
var import_form_data = __toESM(require("form-data"), 1);
global.creator = "@abotscraper \u2013 ahmuq";
var Tools = class {
constructor() {
this.removeBackground = (image) => {
return new Promise((resolve, reject) => {
const form = new import_form_data.default();
form.append("image_file", image, "blob");
const productSerial = Generator.getFingerprint();
import_axios3.default.post("https://api.ezremove.ai/api/ez-remove/background-remove/create-job", form, {
headers: {
...form.getHeaders(),
"product-serial": productSerial,
"Referer": "https://ezremove.ai/",
"Origin": "https://ezremove.ai",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"
}
}).then((createJobResponse) => {
var _a, _b;
if (createJobResponse.data.code !== 1e5) {
reject({
creator: global.creator,
status: false,
error: `Job creation failed: ${((_a = createJobResponse.data.message) == null ? void 0 : _a.en) || ((_b = createJobResponse.data.message) == null ? void 0 : _b.id) || "Unknown error"}`
});
return;
}
const jobId = createJobResponse.data.result.job_id;
const checkJobStatus = async () => {
try {
const jobResponse = await import_axios3.default.get(`https://api.ezremove.ai/api/ez-remove/background-remove/get-job/${jobId}`, {
headers: {
"authorization": "",
"product-serial": productSerial,
"Referer": "https://ezremove.ai/",
"Origin": "https://ezremove.ai"
}
});
const { code, result, message } = jobResponse.data;
if (code === 1e5 && result && result.output) {
resolve({
creator: global.creator,
status: true,
result: {
job_id: jobId,
image_url: result.output[0]
}
});
} else if (code === 300001) {
setTimeout(checkJobStatus, 3e3);
} else {
reject({
creator: global.creator,
status: false,
error: `Job failed: ${(message == null ? void 0 : message.en) || (message == null ? void 0 : message.id) || "Unknown error"} (Code: ${code})`
});
}
} catch (error) {
reject({
creator: global.creator,
status: false,
error: `Status check failed: ${error instanceof Error ? error.message : "Unknown error"}`
});
}
};
checkJobStatus();
}).catch((error) => {
reject({
creator: global.creator,
status: false,
error: error.message
});
});
});
};
this.reminiV2 = (buffer) => {
return new Promise((resolve, reject) => {
const form = new import_form_data.default();
form.append("image", buffer, "blob");
form.append("scale", 2);
import_axios3.default.post("https://api2.pixelcut.app/image/upscale/v1", form, {
headers: {
...form.getHeaders(),
Accept: "application/json",
Referer: "https://www.pixelcut.ai/",
Origin: "https://www.pixelcut.ai",
"x-client-version": "web"
}
}).then((Response) => {
if (Response.data.result_url) {
resolve({
creator: global.creator,
status: true,
result: Response.data.result_url
});
}
}).catch((error) => {
reject({
creator: global.creator,
status: false,
error: error.message
});
});
});
};
this.reminiV1 = (buffer) => {
return new Promise((resolve, reject) => {
const form = new import_form_data.default();
form.append("type", "Enhancer");
form.append("original_image_file", buffer, "blob");
const productSerial = Generator.getFingerprint();
import_axios3.default.post("https://api.remaker.ai/api/pai/v4/ai-enhance/create-job-new", form, {
headers: {
...form.getHeaders(),
"authorization": "",
"product-code": "067003",
"product-serial": productSerial,
"Referer": "https://remaker.ai/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"
}
}).then((createJobResponse) => {
if (createJobResponse.data.code !== 1e5) {
reject({
creator: global.creator,
status: false,
error: `Job creation failed: ${createJobResponse.data.message.en}`
});
return;
}
const jobId = createJobResponse.data.result.job_id;
const checkJobStatus = () => {
import_axios3.default.get(`https://api.remaker.ai/api/pai/v4/ai-enhance/get-job/${jobId}`, {
headers: {
"authorization": "",
"product-code": "067003",
"product-serial": productSerial,
"Referer": "https://remaker.ai/"
}
}).then((jobResponse) => {
if (jobResponse.data.code === 1e5) {
resolve({
creator: global.creator,
status: true,
result: {
job_id: jobId,
image_url: jobResponse.data.result.output[0]
}
});
} else if (jobResponse.data.code === 300013) {
setTimeout(checkJobStatus, 3e3);
} else {
reject({
creator: global.creator,
status: false,
error: `Job failed: ${jobResponse.data.message.en}`
});
}
}).catch((error) => {
reject({
creator: global.creator,
status: false,
error: error.message
});
});
};
checkJobStatus();
}).catch((error) => {
reject({
creator: global.creator,
status: false,
error: error.message
});
});
});
};
this.uploadImage = (buffer) => {
return new Promise((resolve, reject) => {
const form = new import_form_data.default();
form.append("fileToUpload", buffer, "image.jpg");
form.append("reqtype", "fileupload");
form.append("userhash", "");
import_axios3.default.post("https://catbox.moe/user/api.php", form, {
headers: {
...form.getHeaders()
}
}).then((response) => {
resolve({
creator: global.creator,
status: true,
result: response.data
});
}).catch((error) => {
reject({
creator: global.creator,
status: false,
error: error.message
});
});
});
};
}
};
// src/index.ts
var downloader = new Downloader();
var search = new Search();
var tools = new Tools();
var index_default = {
downloader,
search,
tools
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
Downloader,
Search,
Tools,
downloader,
search,
tools
});
//# sourceMappingURL=index.cjs.map