rsshub
Version:
Make RSS Great Again!
100 lines (98 loc) • 3.4 kB
JavaScript
import "./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 "./helpers-DxBp0Pty.mjs";
import { t as got_default } from "./got-KxxWdaxq.mjs";
import { load } from "cheerio";
//#region lib/routes/nytimes/book.ts
const categoryList = {
"combined-print-and-e-book-nonfiction": "Combined Print & E-Book Nonfiction",
"hardcover-nonfiction": "Hardcover Nonfiction",
"paperback-nonfiction": "Paperback Nonfiction",
"advice-how-to-and-miscellaneous": "Advice, How-To & Miscellaneous",
"combined-print-and-e-book-fiction": "Combined Print & E-Book Fiction",
"hardcover-fiction": "Hardcover Fiction",
"trade-fiction-paperback": "Paperback Trade Fiction",
"childrens-middle-grade-hardcover": "Children's Middle Grade Hardcover",
"picture-books": "Picture Books",
"series-books": "Series Books",
"young-adult-hardcover": "Young Adult Hardcover"
};
const route = {
path: "/book/:category?",
categories: ["traditional-media"],
view: ViewType.Notifications,
example: "/nytimes/book/combined-print-and-e-book-nonfiction",
parameters: { category: {
description: "Category, can be found on the [official page](https://www.nytimes.com/books/best-sellers/)",
options: Object.keys(categoryList).map((key) => ({
value: key,
label: categoryList[key]
})),
default: "combined-print-and-e-book-nonfiction"
} },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [{
source: ["nytimes.com/"],
target: ""
}],
name: "Best Seller Books",
maintainers: ["melvinto", "pseudoyu"],
handler,
url: "nytimes.com/"
};
async function handler(ctx) {
const category = ctx.req.param("category") ?? "combined-print-and-e-book-nonfiction";
const url = `https://www.nytimes.com/books/best-sellers/${category}`;
let items = [];
let dataTitle = "";
if (categoryList[category]) {
const data = (await got_default({
method: "get",
url
})).data;
const $ = load(data);
dataTitle = $("h1").eq(0).text();
items = $("article[itemprop=itemListElement]").toArray().map((elem, index) => {
const $item = $(elem);
const firstInfo = $item.find("p").eq(0).text();
const $name = $item.find("h3[itemprop=name]");
const author = $item.find("p[itemprop=author]").text();
const publisher = $item.find("p[itemprop=publisher]").text();
const description = $item.find("p[itemprop=description]").text();
const imageLink = $item.find("img[itemprop=image]").attr("src");
const links = $item.find("ul[aria-label=\"Links to Book Retailers\"]").find("a").toArray();
let primaryLink = links.length > 0 ? $(links[0]).attr("href") : "";
for (const link of links) {
const l = $(link);
if (l.text() === "Amazon") {
primaryLink = l.attr("href");
break;
}
}
return {
title: `${index + 1}: ${$name.text()}`,
author,
description: `<figure><img src="${imageLink}" alt="test"/><figcaption><span>${description}</span></figcaption></figure><br/>${firstInfo}<br/>Author: ${author}<br/>Publisher: ${publisher}`,
link: primaryLink
};
});
}
return {
title: `The New York Times Best Sellers - ${dataTitle}`,
link: url,
item: items
};
}
//#endregion
export { route };