UNPKG

@xct007/frieren-scraper

Version:
163 lines (162 loc) 5.25 kB
import { Axios, Cheerio } from "../Utils.js"; import { ApkmodyIoBaseUrl } from "../Constant.js"; async function search(query) { try { const { data } = await Axios.get(ApkmodyIoBaseUrl + "/", { params: { s: query, }, headers: { ["Referer"]: ApkmodyIoBaseUrl + "/", }, }).catch((e) => e?.response); const $ = 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(ApkmodyIoBaseUrl)) { url = 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), }; } } 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 Axios.get(url).catch((e) => e?.response); const $$ = 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 Axios.get(realDownloadUrl).catch((e) => e?.response); const $ = 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(ApkmodyIoBaseUrl)) { return { error: true, message: "Please provide valid apkmody.io URL!", }; } try { const { data } = await Axios.get(url).catch((e) => e?.response); const $ = 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 = ApkmodyIoBaseUrl + _value; } Object.assign(metadata, { [_key]: _value, }); } }); return { title, updated, metadata, urls: _extractedUrl, }; } catch (e) { return { error: true, message: String(e), }; } } export { search, detail };