rsshub
Version:
Make RSS Great Again!
104 lines (102 loc) • 3.56 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 "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import { t as art } from "./render-BQo6B4tL.mjs";
import path from "node:path";
import { load } from "cheerio";
import pMap from "p-map";
//#region lib/routes/copymanga/comic.ts
init_esm_shims();
const route = {
path: "/comic/:id/:chapterCnt?",
categories: ["anime"],
example: "/copymanga/comic/dianjuren/5",
parameters: {
id: "漫画ID",
chapterCnt: "返回章节的数量,默认为 `10`"
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
nsfw: true
},
name: "漫画更新",
maintainers: ["btdwv", "marvolo666"],
handler
};
async function handler(ctx) {
const id = ctx.req.param("id");
const chapterCnt = Number(ctx.req.param("chapterCnt") || 10);
const host = "www.mangacopy.com";
const baseUrl = `https://${host}`;
const apiBaseUrl = `https://${host}`;
const strBaseUrl = `${apiBaseUrl}/api/v3/comic/${id}/group/default/chapters`;
const iReqLimit = 500;
const chapterArray = await cache_default.tryGet(strBaseUrl, async () => {
let bHasNextPage = false;
let chapters = [];
let iReqOffSet = 0;
do {
bHasNextPage = false;
const { code, results } = await ofetch_default(strBaseUrl, {
headers: { platform: "" },
query: {
limit: iReqLimit,
offset: iReqOffSet
}
});
if (code !== 200) break;
if (results.limit + results.offset < results.total) bHasNextPage = true;
iReqOffSet += iReqLimit;
chapters = [...chapters, ...results.list];
} while (bHasNextPage);
chapters = chapters.map(({ comic_path_word, uuid, name, size, datetime_created, ordered }) => ({
link: `${baseUrl}/comic/${comic_path_word}/chapter/${uuid}`,
guid: `https://copymanga.site/comic/${comic_path_word}/chapter/${uuid}`,
uuid,
title: name,
size,
pubDate: parseDate(datetime_created, "YYYY-MM-DD"),
ordered
})).toSorted((a, b) => b.ordered - a.ordered);
return chapters;
}, config.cache.routeExpire, false);
const { bookTitle, bookIntro } = await cache_default.tryGet(`${baseUrl}/comic/${id}`, async () => {
const $ = load(await ofetch_default(`${baseUrl}/comic/${id}`));
return {
bookTitle: $(".comicParticulars-title-right > ul > li > h6").text(),
bookIntro: $(".intro").text()
};
});
const genResult = async (chapter) => {
const { code, results } = await ofetch_default(`${apiBaseUrl}/api/v3/comic/${id}/chapter/${chapter.uuid}`, { headers: { webp: "1" } });
const contents = code === 210 ? [] : results.chapter.contents.map((content) => ({ url: content.url.replace(".c800x.", ".c1500x.") }));
return {
link: chapter.link,
guid: chapter.guid,
title: chapter.title,
description: art(path.join(__dirname, "templates/comic-da154ac8.art"), {
size: chapter.size,
contents
}),
pubDate: chapter.pubDate
};
};
const items = [...await pMap(chapterArray.slice(0, chapterCnt), (chapter) => cache_default.tryGet(chapter.link, () => genResult(chapter)), { concurrency: 3 }), ...chapterArray.slice(chapterCnt)];
return {
title: `拷贝漫画 - ${bookTitle}`,
link: `${baseUrl}/comic/${id}`,
description: bookIntro,
item: items
};
}
//#endregion
export { route };