UNPKG

rsshub

Version:
97 lines (95 loc) 3.97 kB
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs"; import { t as config } from "./config-C37vj7VH.mjs"; import { t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as md5 } from "./md5-C8GRvctM.mjs"; import { t as cache_default } from "./cache-Bo__VnGm.mjs"; import { t as art } from "./render-BQo6B4tL.mjs"; import { t as got_default } from "./got-KxxWdaxq.mjs"; import { t as config_not_found_default } from "./config-not-found-Dyp3RlZZ.mjs"; import path from "node:path"; import { load } from "cheerio"; import CryptoJS from "crypto-js"; //#region lib/routes/18comic/utils.ts init_esm_shims(); const defaultDomain = "jmcomic1.me"; const allowDomain = new Set([ "18comic.vip", "18comic.org", "jmcomic.me", "jmcomic1.me", "jm-comic3.art", "jm-comic.club", "jm-comic2.ark" ]); const apiDomain = "www.cdnblackmyth.club"; const getRootUrl = (domain) => { if (!config.feature.allow_user_supply_unsafe_domain && !allowDomain.has(domain)) throw new config_not_found_default(`This RSS is disabled unless 'ALLOW_USER_SUPPLY_UNSAFE_DOMAIN' is set to 'true'.`); return `https://${domain}`; }; const apiMapCategory = (category) => { switch (category) { case "another": return "其他漫畫"; case "doujin": return "同人"; case "hanman": return "韓漫"; case "meiman": return "美漫"; case "short": return "短篇"; case "single": return "單本"; default: return null; } }; const getApiUrl = () => `https://${apiDomain}`; const processApiItems = async (apiUrl) => { apiUrl = apiUrl.replace(/\?$/, ""); const ts = Date.now(); const tokenParam = `${ts},1.7.5`; let token = `${ts}18comicAPP`; token = md5(token); const response = await got_default(apiUrl, { headers: { token, tokenparam: tokenParam } }); const encryptedWordArray = CryptoJS.enc.Base64.parse(response.data.data); const md5HexStr = CryptoJS.MD5(ts + "185Hcomic3PAPP7R").toString(); const key = CryptoJS.enc.Utf8.parse(md5HexStr); const cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext: encryptedWordArray }); const resultJson = CryptoJS.AES.decrypt(cipherParams, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); return JSON.parse(resultJson); }; const ProcessItems = async (ctx, currentUrl, rootUrl) => { currentUrl = currentUrl.replace(/\?$/, ""); const $ = load((await got_default(currentUrl)).data); let items = $(".video-title").slice(0, ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit")) : 20).toArray().map((item) => { item = $(item); return { title: item.text().trim(), link: `${rootUrl}${item.prev().find("a").attr("href")}`, guid: `18comic:${item.prev().find("a").attr("href")}` }; }); items = await Promise.all(items.map((item) => cache_default.tryGet(item.guid, async () => { const content = load((await got_default(item.link)).data); item.pubDate = parseDate(content("div[itemprop=\"datePublished\"]").first().attr("content")); item.updated = parseDate(content("div[itemprop=\"datePublished\"]").last().attr("content")); item.category = content("span[data-type=\"tags\"]").first().find("a").toArray().map((c) => $(c).text()); item.author = content("span[data-type=\"author\"]").first().find("a").toArray().map((a) => $(a).text()).join(", "); item.description = art(path.join(__dirname, "templates/description-afe7e434.art"), { introduction: content("#intro-block .p-t-5").text(), images: content(".img_zoom_img img").toArray().map((image) => content(image).attr("data-original")), cover: content(".thumb-overlay img").first().attr("src"), category: item.category }); return item; }))); return { title: $("title").text(), link: currentUrl, item: items, description: $("meta[property=\"og:description\"]").attr("content"), allowEmpty: true }; }; //#endregion export { getRootUrl as a, getApiUrl as i, apiMapCategory as n, processApiItems as o, defaultDomain as r, ProcessItems as t };