UNPKG

rsshub

Version:
84 lines (82 loc) 2.67 kB
import "./dist-Bog6z_OM.mjs"; import "./config-MQ-7ebJ_.mjs"; import "./logger-C4avouvV.mjs"; import "./ofetch-DKl_Ma9g.mjs"; import "./is-worker-DESPicPc.mjs"; import "./cache-SV6W5EPy.mjs"; import "./helpers-Bo4JQYdN.mjs"; import "./proxy-CjvoY5ys.mjs"; import { t as got_default } from "./got-CO-ndVl2.mjs"; import "./puppeteer-9J9JS5H4.mjs"; import "./utils-nNaVjIAm.mjs"; import { t as cache_default } from "./cache-DbIPg7N0.mjs"; import y from "node:zlib"; import { load } from "cheerio"; //#region lib/routes/bilibili/danmaku.ts const processFloatTime = (time) => { const totalSeconds = Number.parseInt(time); const seconds = totalSeconds % 60; const minutes = (totalSeconds - seconds) / 60 % 60; return `${(totalSeconds - seconds - 60 * minutes) / 3600}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; }; const route = { path: "/video/danmaku/:bvid/:pid?", categories: ["social-media"], example: "/bilibili/video/danmaku/BV1vA411b7ip/1", parameters: { bvid: "视频AV号,可在视频页 URL 中找到", pid: "分P号,不填默认为1" }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false }, name: "视频弹幕", maintainers: ["Qixingchen"], handler }; async function handler(ctx) { let bvid = ctx.req.param("bvid"); let aid; if (!bvid.startsWith("BV")) { aid = bvid; bvid = null; } const pid = Number(ctx.req.param("pid") || 1); const limit = 50; const cid = await cache_default.getCidFromId(aid, pid, bvid); const videoName = await cache_default.getVideoNameFromId(aid, bvid); const link = `https://www.bilibili.com/video/${bvid || `av${aid}`}`; let danmakuText = (await got_default.get(`https://comment.bilibili.com/${cid}.xml`, { decompress: false, responseType: "buffer", headers: { Referer: link } })).body; danmakuText = await ((danmakuText[0] & 15) === 8 ? y.inflateSync(danmakuText) : y.inflateRawSync(danmakuText)); let danmakuList = []; const $ = load(danmakuText, { xmlMode: true }); $("d").each((index, item) => { danmakuList.push({ p: $(item).attr("p"), text: $(item).text() }); }); danmakuList = danmakuList.toReversed().slice(0, limit); return { title: `${videoName} 的 弹幕动态`, link, description: `${videoName} 的 弹幕动态`, item: danmakuList.map((item) => ({ title: `[${processFloatTime(item.p.split(",")[0])}] ${item.text}`, pubDate: (/* @__PURE__ */ new Date(item.p.split(",")[4] * 1e3)).toUTCString(), guid: `${cid}-${item.p.split(",")[4]}-${item.p.split(",")[7]}`, link })) }; } //#endregion export { route };