UNPKG

rsshub

Version:
157 lines (151 loc) 5.17 kB
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs"; import "./config-C37vj7VH.mjs"; import "./dist-BInvbO1W.mjs"; import "./logger-Czu8UMNd.mjs"; import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs"; import { n as parseRelativeDate, t as parseDate } from "./parse-date-BrP7mxXf.mjs"; import { t as art } from "./render-BQo6B4tL.mjs"; import { t as invalid_parameter_default } from "./invalid-parameter-rr4AgGpp.mjs"; import { n as queryToBoolean } from "./readable-social-DoIL4WB3.mjs"; import path from "node:path"; import { load } from "cheerio"; //#region lib/routes/bangumi.tv/subject/comments.ts const getComments = async (subjectID, minLength) => { const link = `https://bgm.tv/subject/${subjectID}/comments`; const $ = load(await ofetch_default(link)); const title = $(".nameSingle").find("a").text(); const comments = $(".item").toArray().map((el) => { const $el = $(el); const $rateEl = $el.find(".starlight"); let rate = null; if ($rateEl.length > 0) rate = $rateEl.attr("class").match(/stars(\d)/)[1]; const dateString = $el.find("small.grey").text().slice(2); const date = dateString.includes("ago") ? parseRelativeDate(dateString) : parseDate(dateString); return { user: $el.find(".l").text(), rate: rate || "无", content: $el.find("p").text(), date }; }).filter((obj) => obj.content.length >= minLength); return { title: `${title}的 Bangumi 吐槽箱`, link, item: comments.map((c) => ({ title: `${c.user}的吐槽`, description: `【评分:${c.rate}${c.content}`, guid: `${link}#${c.user}`, pubDate: c.date, link })) }; }; var comments_default = getComments; //#endregion //#region lib/routes/bangumi.tv/subject/utils.ts init_esm_shims(); const getLocalName = (obj, showOriginalName) => showOriginalName ? obj.name || obj.name_cn : obj.name_cn || obj.name; //#endregion //#region lib/routes/bangumi.tv/subject/ep.ts const getEps = async (subjectID, showOriginalName) => { const epsInfo = await ofetch_default(`https://api.bgm.tv/subject/${subjectID}?responseGroup=large`); const activeEps = epsInfo.eps.filter((e) => e.status === "Air"); return { title: getLocalName(epsInfo, showOriginalName), link: `https://bgm.tv/subject/${subjectID}`, description: epsInfo.summary, item: activeEps.map((e) => ({ title: `ep.${e.sort} ${getLocalName(e, showOriginalName)}`, description: art(path.join(__dirname, "templates/ep-e0bc570f.art"), { e, epsInfo }), pubDate: parseDate(e.airdate), link: e.url.replace("http:", "https:") })) }; }; var ep_default = getEps; //#endregion //#region lib/routes/bangumi.tv/subject/offcial-subject-api.ts const getFromAPI = (type) => { const mapping = { blog: { en: "reviews", cn: "评论" }, topic: { en: "board", cn: "讨论" } }; return async (subjectID, showOriginalName) => { const subjectInfo = await ofetch_default(`https://api.bgm.tv/subject/${subjectID}?responseGroup=large`); return { title: `${getLocalName(subjectInfo, showOriginalName)}的 Bangumi ${mapping[type].cn}`, link: `https://bgm.tv/subject/${subjectInfo.id}/${mapping[type].en}`, item: subjectInfo[type].map((article) => ({ title: `${article.user.nickname}${article.title}`, description: article.summary || "", link: article.url.replace("http:", "https:"), pubDate: parseDate(article.timestamp, "X"), author: article.user.nickname })) }; }; }; var offcial_subject_api_default = getFromAPI; //#endregion //#region lib/routes/bangumi.tv/subject/index.ts const route = { path: "/subject/:id/:type?/:showOriginalName?", categories: ["anime"], example: "/bangumi.tv/subject/328609/ep/true", parameters: { id: "条目 id, 在条目页面的地址栏查看", type: "条目类型,可选值为 `ep`, `comments`, `blogs`, `topics`,默认为 `ep`", showOriginalName: "显示番剧标题原名,可选值 0/1/false/true,默认为 false" }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, radar: [{ source: ["bgm.tv/subject/:id"], target: "/tv/subject/:id" }], name: "条目的通用路由格式", maintainers: ["JimenezLi"], handler, description: `::: warning 此通用路由仅用于对路由参数的描述,具体信息请查看下方与条目相关的路由 :::` }; async function handler(ctx) { const id = ctx.req.param("id"); const type = ctx.req.param("type") || "ep"; const showOriginalName = queryToBoolean(ctx.req.param("showOriginalName")); let response; switch (type) { case "ep": response = await ep_default(id, showOriginalName); break; case "comments": response = await comments_default(id, Number(ctx.req.query("minLength")) || 0); break; case "blogs": response = await offcial_subject_api_default("blog")(id, showOriginalName); break; case "topics": response = await offcial_subject_api_default("topic")(id, showOriginalName); break; default: throw new invalid_parameter_default(`暂不支持对${type}的订阅`); } return response; } //#endregion export { route };