rsshub
Version:
Make RSS Great Again!
114 lines (111 loc) • 3.84 kB
JavaScript
import "./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 { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import "./render-BQo6B4tL.mjs";
import { a as topicPost, i as imagePost, n as appDetail, o as videoPost, r as getRootUrl, t as X_UA } from "./utils-DY91kUEc.mjs";
//#region lib/routes/taptap/topic.ts
const typeMap = {
feed: {
zh_CN: "最新",
zh_TW: "最新"
},
official: {
zh_CN: "官方",
zh_TW: "官方"
},
elite: {
zh_CN: "精华",
zh_TW: "精華"
},
video: {
zh_CN: "影片",
zh_TW: "影片"
}
};
const route = {
path: "/topic/:id/:type?/:sort?/:lang?",
categories: ["game"],
example: "/taptap/topic/142793/official",
parameters: {
id: "游戏 ID,游戏主页 URL 中获取",
type: "论坛版块,默认显示所有帖子,论坛版块 URL 中 `type` 参数,见下表,默认为 `feed`",
sort: "排序,见下表,默认为 `created`",
lang: "语言,`zh-CN`或`zh-TW`,默认为`zh-CN`"
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false
},
radar: [{
source: ["taptap.cn/app/:id/topic", "taptap.cn/app/:id"],
target: "/topic/:id"
}],
name: "游戏论坛",
maintainers: ["hoilc", "TonyRL"],
handler,
description: `| 全部 | 精华 | 官方 | 影片 |
| ---- | ----- | -------- | ----- |
| feed | elite | official | video |
| 发布时间 | 回复时间 | 默认排序 |
| -------- | --------- | ------- |
| created | commented | default |`
};
async function handler(ctx) {
const lang = ctx.req.param("lang") ?? "zh_CN";
const appId = ctx.req.param("id");
const appData = await appDetail(appId, lang);
const type = ctx.req.param("type") ?? "feed";
const sort = ctx.req.param("sort") ?? "created";
const groupId = appData.group.id;
const appImg = appData.app.icon.original_url || appData.app.icon.url;
const appName = appData.app.title;
const topicsList = await ofetch_default(`${getRootUrl(false)}/webapiv2/feed/v7/by-group?group_id=${groupId}&type=${type}&sort=${sort}&${X_UA(lang)}`);
const list = topicsList.data.list;
const out = await Promise.all(list.map(({ moment }) => {
const link = moment.sharing.url;
return cache_default.tryGet(link, async () => {
const isRepost = !moment.topic?.id_str;
const author = moment.author.user.name;
const topicId = isRepost ? moment.reposted_moment.topic.id_str : moment.topic.id_str;
const title = isRepost ? moment.repost.contents.raw_text || "" : moment.topic.title || moment.topic.summary.split(" ")[0];
let description = isRepost ? moment.repost.contents.raw_text || "" : moment.topic.summary || "";
if (isRepost) {
description += (moment.reposted_moment.topic.title || "") + (await topicPost(appId, topicId, lang) || "");
if (moment.reposted_moment.topic.footer_images) description += imagePost(moment.reposted_moment.topic.footer_images);
} else if (moment.topic.pin_video) {
description += videoPost(moment.topic.pin_video);
if (moment.topic.footer_images?.images) description += imagePost(moment.topic.footer_images.images);
} else description = await topicPost(appId, topicId, lang);
return {
title,
description,
author,
link,
pubDate: parseDate(moment.created_time, "X")
};
});
}));
const ret = {
title: `${appName} - ${typeMap[type][lang]} - TapTap 论坛`,
link: `${getRootUrl(false)}/app/${appId}/topic?type=${type}&sort=${sort}`,
image: appImg,
item: out.filter((item) => item !== "")
};
ctx.set("json", {
...ret,
appId,
groupId,
topicsList
});
return ret;
}
//#endregion
export { route };