UNPKG

rsshub

Version:
104 lines (102 loc) 3.56 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 "./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 };