rsshub
Version:
Make RSS Great Again!
76 lines (74 loc) • 3.28 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import "./ofetch-BIyrKU3Y.mjs";
import { n as parseRelativeDate, 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 got_default } from "./got-KxxWdaxq.mjs";
import { t as timezone } from "./timezone-D8cuwzTY.mjs";
import { load } from "cheerio";
//#region lib/routes/toodaylab/index.ts
const route = {
path: "/:params{.+}?",
name: "Unknown",
maintainers: [],
handler
};
async function handler(ctx) {
const { params = "posts" } = ctx.req.param();
const limit = ctx.req.query("limit") ? Number.parseInt(ctx.req.query("limit"), 10) : 30;
const isHot = params === "hot";
const rootUrl = "https://www.toodaylab.com";
const currentUrl = new URL(isHot ? "posts" : params, rootUrl).href;
const { data: response } = await got_default(currentUrl);
const $ = load(response);
let items = isHot ? $("div.hot-list a").slice(0, limit).toArray().map((item) => {
item = $(item);
return {
title: item.find("div.hot-item p").text(),
link: new URL(item.prop("href"), rootUrl).href
};
}) : $("div.single-post").slice(0, limit).toArray().map((item) => {
item = $(item);
const a = item.find("p.title a");
const pubDate = item.find("div.left-infos p").text().trim().split(/\/\/\s/).pop();
return {
title: a.text(),
link: new URL(a.prop("href"), rootUrl).href,
description: item.find("p.excerpt").html(),
author: item.find("div.left-infos p a").text().trim(),
pubDate: timezone(/[年日月]/.test(pubDate) ? parseDate(pubDate, ["YYYY年M月D日 HH:mm", "M月D日 HH:mm"]) : parseRelativeDate(pubDate), 8)
};
});
items = await Promise.all(items.map((item) => cache_default.tryGet(item.link, async () => {
const { data: detailResponse } = await got_default(item.link);
const content = load(detailResponse);
const pubDate = content("div.left-infos p").text().trim().split(/\/\/\s/).pop();
item.title = content("h1").text() || item.title;
item.description = content("div.post-content").html() ?? item.description;
item.author = content("div.left-infos p a").text().trim() ?? item.author;
item.category = content("div.right-infos a").slice(1).toArray().map((c) => content(c).text().replace(/#/, ""));
item.pubDate = item.pubDate ?? timezone(/[年日月]/.test(pubDate) ? parseDate(pubDate, ["YYYY年M月D日 HH:mm", "M月D日 HH:mm"]) : parseRelativeDate(pubDate), 8);
item.upvotes = content("#like_count").text() ? Number.parseInt(content("#like_count").text(), 10) : 0;
item.comments = Number.parseInt(content("div.right-infos a").first().text(), 10) || 0;
return item;
})));
const title = $("title").text().split(/\s-/)[0];
const icon = $("link[rel=\"apple-touch-icon\"]").last().prop("href");
return {
item: items,
title: isHot ? title.replace(/[^|]+/, "最热 ") : title,
link: currentUrl,
description: $("meta[name=\"description\"]").prop("content"),
language: $("html").prop("lang"),
image: $("h3.logo a img").prop("src"),
icon,
logo: icon,
subtitle: $("meta[name=\"keywords\"]").prop("content"),
author: $("h3.logo a img").prop("alt")
};
}
//#endregion
export { route };