rsshub
Version:
Make RSS Great Again!
81 lines (79 loc) • 3.05 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import { t as config } from "./config-C37vj7VH.mjs";
import { t as logger_default } from "./logger-Czu8UMNd.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import "./proxy-Db7uGcYb.mjs";
import { t as invalid_parameter_default } from "./invalid-parameter-rr4AgGpp.mjs";
import { n as puppeteer_default } from "./puppeteer-DGmvuGvT.mjs";
import { t as getOriginAvatar } from "./utils-CQKS3rFA.mjs";
//#region lib/routes/douyin/live.ts
const route = {
path: "/live/:rid",
categories: ["live"],
example: "/douyin/live/685317364746",
parameters: { rid: "直播间 id, 可在主播直播间页 URL 中找到" },
features: {
requireConfig: false,
requirePuppeteer: true,
antiCrawler: true,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [{ source: ["live.douyin.com/:rid"] }],
name: "直播间开播",
maintainers: ["TonyRL"],
handler
};
async function handler(ctx) {
const rid = ctx.req.param("rid");
if (Number.isNaN(rid)) throw new invalid_parameter_default("Invalid room ID. Room ID should be a number.");
const pageUrl = `https://live.douyin.com/${rid}`;
const renderData = await cache_default.tryGet(`douyin:live:${rid}`, async () => {
let roomInfo$1;
const browser = await puppeteer_default();
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on("request", (request) => {
request.resourceType() === "document" || request.resourceType() === "stylesheet" || request.resourceType() === "script" || request.resourceType() === "xhr" ? request.continue() : request.abort();
});
page.on("response", async (response) => {
if (response.request().url().includes("/webcast/room/web/enter")) roomInfo$1 = await response.json();
});
logger_default.http(`Requesting ${pageUrl}`);
await page.goto(pageUrl, { waitUntil: "networkidle2" });
await browser.close();
return roomInfo$1;
}, config.cache.routeExpire, false);
if (renderData.status_code !== 0) throw new Error(`Status code ${renderData.status_code}`);
const roomInfo = renderData.data.data[0];
const roomOwner = renderData.data.user;
const nickname = roomOwner.nickname;
const userAvatar = roomOwner.avatar_thumb.url_list[0];
const items = [];
if (roomInfo.id_str) {
if (roomInfo.status === 2) items.push({
title: `开播:${roomInfo.title}`,
description: `<img src="${roomInfo.cover.url_list[0]}">`,
link: pageUrl,
author: nickname,
guid: roomInfo.id_str
});
else if (roomInfo.status === 4) items.push({
title: `当前直播已结束,期待下一场:${roomInfo.title}`,
link: `https://www.douyin.com/user/${roomOwner.sec_uid}`,
author: nickname,
guid: roomInfo.id_str
});
}
return {
title: `${nickname}的抖音直播间 - 抖音直播`,
description: `欢迎来到${nickname}的抖音直播间,${nickname}与大家一起记录美好生活 - 抖音直播`,
image: getOriginAvatar(userAvatar),
link: pageUrl,
item: items,
allowEmpty: true
};
}
//#endregion
export { route };