@xct007/frieren-scraper
Version:
167 lines (166 loc) • 5.53 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.detail = exports.search = void 0;
const Utils_1 = require("../Utils");
const Constant_1 = require("../Constant");
async function search(query) {
try {
const { data } = await Utils_1.Axios.get(Constant_1.ApkmodyIoBaseUrl + "/", {
params: {
s: query,
},
headers: {
["Referer"]: Constant_1.ApkmodyIoBaseUrl + "/",
},
}).catch((e) => e?.response);
const $ = (0, Utils_1.Cheerio)(data);
const _temp = [];
$("section > .container > div > div").each((i, e) => {
const title = $(e).find(".card-title > .truncate").text().trim();
const description = $(e).find(".card-body > p").text().trim();
let thumbnail = $(e).find(".card-image > img").attr("src");
let url = $(e).find("a").attr("href");
if (!url.includes(Constant_1.ApkmodyIoBaseUrl)) {
url = Constant_1.ApkmodyIoBaseUrl + url;
}
if (!thumbnail.includes("http")) {
thumbnail = "https://storage.itsrose.my.id/rose.jpeg";
}
_temp.push({ title, description, thumbnail, url });
});
if (Array.isArray(_temp) && _temp.length) {
return _temp;
}
else {
throw new Error(`Empty results for ${query}`);
}
}
catch (e) {
return {
error: true,
message: String(e),
};
}
}
exports.search = search;
function isNotEmpty(obj) {
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
return true;
}
}
return false;
}
async function extractUrl(url) {
let finalExtractedUrl = false;
try {
const { data: resp } = await Utils_1.Axios.get(url).catch((e) => e?.response);
const $$ = (0, Utils_1.Cheerio)(resp);
const _extractedUrl = $$("a#download-button").attr("href");
if (/original/i.test(url)) {
finalExtractedUrl = {};
Object.assign(finalExtractedUrl, {
original: _extractedUrl,
});
}
if (/mod/i.test(url)) {
finalExtractedUrl = {};
Object.assign(finalExtractedUrl, {
mod: _extractedUrl,
});
}
}
finally {
return finalExtractedUrl;
}
}
async function extractDownloadUrl(realDownloadUrl) {
const { data } = await Utils_1.Axios.get(realDownloadUrl).catch((e) => e?.response);
const $ = (0, Utils_1.Cheerio)(data);
const urls = [];
$("div.download-list > a").each((i, e) => {
const _urlHref = $(e).attr("href");
if (!/http?s:\/\/worker/i.test(_urlHref)) {
urls.push(_urlHref);
}
});
if (Array.isArray(urls) && urls.length) {
let finalExtracted = {};
for (const url of urls) {
const _extracted = await extractUrl(url);
if (_extracted && typeof _extracted === "object") {
Object.assign(finalExtracted, { ..._extracted });
}
}
return finalExtracted;
}
else {
return false;
}
}
async function detail(url) {
if (!url.includes(Constant_1.ApkmodyIoBaseUrl)) {
return {
error: true,
message: "Please provide valid apkmody.io URL!",
};
}
try {
const { data } = await Utils_1.Axios.get(url).catch((e) => e?.response);
const $ = (0, Utils_1.Cheerio)(data);
const title = $(".app-name > div > h1")
.text()
.replace(/[\t\n]/g, "")
.trim();
const updated = $(".app-name > div > span > time").text().trim();
let realDownloadUrl = url + "download";
if (!url.endsWith("/")) {
realDownloadUrl = url + "/download";
}
else {
$("section.container > div > div.wp-block-buttons > div").each((i, e) => {
const _urlHref = $(e).find("a").attr("href");
if (/\games\/|apps\//i.test(_urlHref)) {
realDownloadUrl = _urlHref;
}
});
}
const _extractedUrl = await extractDownloadUrl(realDownloadUrl).catch(() => false);
if (typeof _extractedUrl === "boolean") {
throw new Error(`Failed to extract direct url from ${realDownloadUrl}`);
}
const _tempDataTable = [];
let metadata = {};
$("table > tbody > tr").each((i, e) => {
const _key = $(e)
.find("th")
.text()
.replace(/\s/g, "_")
.toLowerCase()
.trim();
let _value = $(e).find("td > a").attr("href") || $(e).find("td").text().trim();
if (_key && _key.length && _value && _value.length) {
if (/\/apps\/|\/games\/|\/publisher\//.test(_value) &&
!/\/play.google.com\//.test(_value)) {
_value = Constant_1.ApkmodyIoBaseUrl + _value;
}
Object.assign(metadata, {
[_key]: _value,
});
}
});
return {
title,
updated,
metadata,
urls: _extractedUrl,
};
}
catch (e) {
return {
error: true,
message: String(e),
};
}
}
exports.detail = detail;