rsshub
Version:
Make RSS Great Again!
101 lines (99 loc) • 3.41 kB
JavaScript
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import { t as ViewType } from "./types-D84BRIt4.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import "./helpers-DxBp0Pty.mjs";
import { t as art } from "./render-BQo6B4tL.mjs";
import { t as got_default } from "./got-KxxWdaxq.mjs";
import path from "node:path";
import { load } from "cheerio";
//#region lib/routes/jimmyspa/books.ts
init_esm_shims();
const route = {
path: "/books/:language",
categories: ["design"],
view: ViewType.Articles,
example: "/jimmyspa/books/tw",
parameters: { language: {
description: "语言",
options: [
{
value: "tw",
label: "臺灣正體"
},
{
value: "en",
label: "English"
},
{
value: "jp",
label: "日本語"
}
]
} },
radar: [{ source: ["www.jimmyspa.com/:language/Books"] }],
name: "Books",
description: `
| language | Description |
| --- | --- |
| tw | 臺灣正體 |
| en | English |
| jp | 日本語 |
`,
maintainers: ["Cedaric"],
handler
};
async function handler(ctx) {
const language = ctx.req.param("language");
const baseUrl = "https://www.jimmyspa.com";
const booksListUrl = new URL(`/${language}/Books/Ajax/changeList?year=&keyword=&categoryId=0&page=1`, baseUrl).href;
const bookItems = load((await got_default(booksListUrl)).data.view)("ul#appendWork li.work_block").toArray().map(async (bookElement) => {
const bookContent = load(bookElement);
const bookTitle = bookContent("p.tit").text();
const bookImageRelative = bookContent("div.work_img img").prop("src") || "";
const bookImageUrl = bookImageRelative ? baseUrl + bookImageRelative : "";
const bookDetailUrl = bookContent("li.work_block").prop("data-route");
const { renderedDescription, publishDate } = await cache_default.tryGet(bookDetailUrl, async () => {
const detailPage = load((await got_default(bookDetailUrl)).data);
const bookDescription = detailPage("article.intro_cont").html() || "";
const bookInfoWrap = detailPage("div.info_wrap").html() || "";
const processedDescription = bookDescription.replaceAll(/<img\b[^>]*>/g, (imgTag) => imgTag.replaceAll(/\b(src|data-src)="(?!http|https|\/\/)([^"]*)"/g, (_, attrName, relativePath) => {
return `${attrName}="${new URL(relativePath, baseUrl).href}"`;
}));
const publishDateMatch = bookInfoWrap.match(/<span>(首次出版|First Published|初版)<\/span>\s*<span class="num">([^<]+)<\/span>/);
const publishDate$1 = publishDateMatch ? parseDate(publishDateMatch[2] + "-02") : "";
return {
renderedDescription: art(path.join(__dirname, "templates/description-16be3a2a.art"), {
images: bookImageUrl ? [{
src: bookImageUrl,
alt: bookTitle
}] : void 0,
description: processedDescription
}),
publishDate: publishDate$1
};
});
return {
title: bookTitle,
link: bookDetailUrl,
description: renderedDescription,
pubDate: publishDate,
content: {
html: renderedDescription,
text: bookTitle
}
};
});
return {
title: `幾米 - 幾米創作(${language})`,
link: `${baseUrl}/${language}/Books`,
allowEmpty: true,
item: await Promise.all(bookItems)
};
}
//#endregion
export { route };