rsshub
Version:
Make RSS Great Again!
119 lines (112 loc) • 5.58 kB
JavaScript
import { t as parseDate } from "./parse-date-CjhZE69i.mjs";
import { t as cache_default } from "./cache-CiDoUSLo.mjs";
import { r as getSubPath } from "./common-utils-Dv4C8Q9Q.mjs";
import { t as got_default } from "./got-BDnf4rdT.mjs";
import { Fragment, jsx } from "hono/jsx/jsx-runtime";
import { load } from "cheerio";
import { renderToString } from "hono/jsx/dom/server";
//#region lib/routes/e-hentai/index.tsx
const route = {
path: "/category/:category?/:needTorrents?/:needImages?",
categories: ["multimedia"],
example: "/e-hentai/category/manga",
parameters: {
category: "分类,可在对应分类页中找到,默认为首页",
needTorrents: "需要输出种子文件,填写 true/yes 表示需要,默认需要",
needImages: "需要显示大图,填写 true/yes 表示需要,默认需要"
},
name: "分类",
maintainers: ["nczitzk"],
description: `::: tip
参数 **需要输出种子文件** 设置为 \`true\` \`yes\` \`t\` \`y\` 等值后,RSS 会携带种子文件的路径,以供支持 RSS 的下载工具订阅下载。
同理,参数 **需要显示大图** 启用后,RSS 会携带每项内容中的大图,而不只提供缩略图。
当然,选择 **需要输出种子文件**、**需要显示大图** 后获取内容时间需要更久,同时若指定获取数量过多,可能会出现获取超时错误。此时,可以在路由末尾处加上 \`?limit=限制获取数目\` 来限制获取条目数量,或直接修改全局的超时参数 \`REQUEST_TIMEOUT\`(详见文档中的 [其他应用配置](https://docs.rsshub.app/install/#pei-zhi-qi-ta-ying-yong-pei-zhi))。
以下是一个例子:
选择浏览 [Manga 分类](https://e-hentai.org/manga),并指定 **不携带种子文件**,**只显示大图**,并只 **输出 5 个**。由于 [Manga 分类](https://e-hentai.org/manga) 的 URL \`https://e-hentai.org/manga\` 中对应分类字段为 \`manga\`,所以对应路由为 [\`/e-hentai/category/manga/no/yes?limit=5\`](https://rsshub.app/e-hentai/category/manga/no/yes?limit=5)
:::
| Doujinshi | Manga | Artist CG | Game CG | Western |
| --------- | ----- | --------- | ------- | ------- |
| doujinshi | manga | artistcg | gamecg | western |
| Non-H | Image Set | Cosplay | Asian Porn | Misc | Popular |
| ----- | --------- | ------- | ---------- | ---- | ------- |
| non-h | imageset | cosplay | asianporn | misc | popular |`,
features: { nsfw: true },
radar: [{
source: ["e-hentai.org/:category", "e-hentai.org/"],
target: "/category/:category"
}],
handler
};
async function handler(ctx) {
const id = ctx.req.param("category") ?? ctx.req.param("tag") ?? ctx.req.param("keyword") ?? "";
const what = getSubPath(ctx).split("/", 2)[1];
const needTorrents = /t|y/i.test(ctx.req.param("needTorrents") ?? "true");
const needImages = /t|y/i.test(ctx.req.param("needImages") ?? "true");
const currentUrl = `https://e-hentai.org/${id ? what === "search" ? `?${id}` : what === "category" ? id : `${what}/${id}` : what}`;
const $ = load((await got_default({
method: "get",
url: currentUrl
})).data);
$(".itd").parent().remove();
let items = $("table.gltc tbody tr").slice(1, ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit")) + 1 : needImages ? 16 : 26).toArray().map((item) => {
const $item = $(item);
return {
title: $item.find("div.glink").text(),
author: $item.find("td.glhide div a").text(),
link: $item.find("td.glname a").attr("href"),
pubDate: parseDate($item.find("div.ir").prev().text()),
category: $item.find("div.gt").toArray().map((tag) => $(tag).attr("title").replace(/^:/, "")),
description: needImages ? "" : `<img src="${$item.find("div.glthumb div img").attr("data-src") ?? $item.find("div.glthumb div img").attr("src")}">`,
enclosure_url: needTorrents && $item.find("div.gldown a img[title=\"Show torrents\"]").length > 0 ? $item.find(".gldown a").attr("href") : void 0
};
});
items = await Promise.all(items.map(async (item) => {
if (item.enclosure_url) {
let forms = "", torrents = await cache_default.get(item.enclosure_url);
if (!torrents) {
const torrent = load((await got_default({
method: "get",
url: item.enclosure_url
})).data);
torrent("h1, input[name=\"torrent_info\"]").remove();
forms = torrent("form").parent().html() ?? "";
torrents = torrent("table tbody tr td a").toArray().map((t) => {
const $t = torrent(t);
return {
link: $t.attr("href"),
title: $t.text()
};
});
cache_default.set(item.enclosure_url, torrents ?? "");
}
item.description += forms;
item.enclosure_url = torrents[0].link;
item.enclosure_type = "application/x-bittorrent";
}
if (needImages) {
let images = await cache_default.get(item.link);
if (!images) {
const content = load((await got_default({
method: "get",
url: item.link
})).data);
images = await Promise.all(content(".gdtm a").toArray().map((i) => cache_default.tryGet(content(i).attr("href"), async () => {
return load((await got_default({
method: "get",
url: content(i).attr("href")
})).data)("#img").attr("src");
})));
cache_default.set(item.link, images);
}
item.description += renderToString(/* @__PURE__ */ jsx(Fragment, { children: images.map((image) => /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("img", { src: image }) })) }));
}
return item;
}));
return {
title: `${id || what} - E-Hentai Galleries`,
link: currentUrl,
item: items
};
}
//#endregion
export { route as n, handler as t };