rsshub
Version:
Make RSS Great Again!
97 lines (95 loc) • 3.97 kB
JavaScript
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 };