Skip to content

Commit

Permalink
feat(route/bilibili): add hideGoods for dynamic (#16735)
Browse files Browse the repository at this point in the history
  • Loading branch information
Zebartin committed Sep 13, 2024
1 parent 2d626f3 commit a436fba
Showing 1 changed file with 101 additions and 97 deletions.
198 changes: 101 additions & 97 deletions lib/routes/bilibili/dynamic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export const route: Route = {
| disableEmbed | 关闭内嵌视频 | 0/1/true/false | false |
| useAvid | 视频链接使用 AV 号 (默认为 BV 号) | 0/1/true/false | false |
| directLink | 使用内容直链 | 0/1/true/false | false |
| hideGoods | 隐藏带货动态 | 0/1/true/false | false |
用例:\`/bilibili/user/dynamic/2267573/showEmoji=1&disableEmbed=1&useAvid=1\``,
},
Expand Down Expand Up @@ -229,6 +230,7 @@ async function handler(ctx) {
const displayArticle = ctx.req.query('mode') === 'fulltext';
const useAvid = fallback(undefined, queryToBoolean(routeParams.useAvid), false);
const directLink = fallback(undefined, queryToBoolean(routeParams.directLink), false);
const hideGoods = fallback(undefined, queryToBoolean(routeParams.hideGoods), false);

const cookie = await cacheIn.getCookie();

Expand All @@ -253,119 +255,121 @@ async function handler(ctx) {
cache.set(`bili-userface-from-uid-${uid}`, face);

const rssItems = await Promise.all(
items.map(async (item) => {
// const parsed = JSONbig.parse(item.card);
items
.filter((item) => !hideGoods || item.modules.module_dynamic?.additional?.type !== 'ADDITIONAL_TYPE_GOODS')
.map(async (item) => {
// const parsed = JSONbig.parse(item.card);

const data = item.modules;
const origin = item?.orig?.modules;
const data = item.modules;
const origin = item?.orig?.modules;

// link
let link = '';
if (item.id_str) {
link = `https://t.bilibili.com/${item.id_str}`;
}
// link
let link = '';
if (item.id_str) {
link = `https://t.bilibili.com/${item.id_str}`;
}

let description = getDes(data) || '';
const title = getTitle(data) || description; // 没有 title 的时候使用 desc 填充
const category: string[] = [];
// emoji
if (data.module_dynamic?.desc?.rich_text_nodes?.length) {
const nodes = data.module_dynamic.desc.rich_text_nodes;
for (const node of nodes) {
// 处理 emoji 的情况
if (showEmoji && node?.emoji) {
const emoji = node.emoji;
description = description.replaceAll(
emoji.text,
`<img alt="${emoji.text}" src="${emoji.icon_url}" style="margin: -1px 1px 0px; display: inline-block; width: 20px; height: 20px; vertical-align: text-bottom;" title="" referrerpolicy="no-referrer">`
);
}
// 处理转发带图评论的情况
if (node?.pics?.length) {
const { pics, text } = node;
description = description.replaceAll(
text,
pics
.map(
(pic) =>
`<img alt="${text}" src="${pic.src}" style="margin: 0px 0px 0px; display: inline-block; width: ${pic.width}px; height: ${pic.height}px; vertical-align: text-bottom;" title="" referrerpolicy="no-referrer">`
)
.join('<br>')
);
}
if (node?.type === 'RICH_TEXT_NODE_TYPE_TOPIC') {
// 将话题作为 category
category.push(node.text.match(/#(\S+)#/)?.[1] || '');
let description = getDes(data) || '';
const title = getTitle(data) || description; // 没有 title 的时候使用 desc 填充
const category: string[] = [];
// emoji
if (data.module_dynamic?.desc?.rich_text_nodes?.length) {
const nodes = data.module_dynamic.desc.rich_text_nodes;
for (const node of nodes) {
// 处理 emoji 的情况
if (showEmoji && node?.emoji) {
const emoji = node.emoji;
description = description.replaceAll(
emoji.text,
`<img alt="${emoji.text}" src="${emoji.icon_url}" style="margin: -1px 1px 0px; display: inline-block; width: 20px; height: 20px; vertical-align: text-bottom;" title="" referrerpolicy="no-referrer">`
);
}
// 处理转发带图评论的情况
if (node?.pics?.length) {
const { pics, text } = node;
description = description.replaceAll(
text,
pics
.map(
(pic) =>
`<img alt="${text}" src="${pic.src}" style="margin: 0px 0px 0px; display: inline-block; width: ${pic.width}px; height: ${pic.height}px; vertical-align: text-bottom;" title="" referrerpolicy="no-referrer">`
)
.join('<br>')
);
}
if (node?.type === 'RICH_TEXT_NODE_TYPE_TOPIC') {
// 将话题作为 category
category.push(node.text.match(/#(\S+)#/)?.[1] || '');
}
}
}
}

if (data.module_dynamic?.major?.opus?.summary?.rich_text_nodes?.length) {
const nodes = data.module_dynamic.major.opus.summary.rich_text_nodes;
for (const node of nodes) {
if (node?.type === 'RICH_TEXT_NODE_TYPE_TOPIC') {
// 将话题作为 category
category.push(node.text.match(/#(\S+)#/)?.[1] || '');
if (data.module_dynamic?.major?.opus?.summary?.rich_text_nodes?.length) {
const nodes = data.module_dynamic.major.opus.summary.rich_text_nodes;
for (const node of nodes) {
if (node?.type === 'RICH_TEXT_NODE_TYPE_TOPIC') {
// 将话题作为 category
category.push(node.text.match(/#(\S+)#/)?.[1] || '');
}
}
}
}
if (data.module_dynamic?.topic?.name) {
// 将话题作为 category
category.push(data.module_dynamic.topic.name);
}
if (data.module_dynamic?.topic?.name) {
// 将话题作为 category
category.push(data.module_dynamic.topic.name);
}

if (item.type === 'DYNAMIC_TYPE_ARTICLE' && displayArticle) {
// 抓取专栏全文
const cvid = data.module_dynamic?.major?.opus?.jump_url?.match?.(/cv(\d+)/)?.[0];
if (cvid) {
description = (await cacheIn.getArticleDataFromCvid(cvid, uid)).description || '';
if (item.type === 'DYNAMIC_TYPE_ARTICLE' && displayArticle) {
// 抓取专栏全文
const cvid = data.module_dynamic?.major?.opus?.jump_url?.match?.(/cv(\d+)/)?.[0];
if (cvid) {
description = (await cacheIn.getArticleDataFromCvid(cvid, uid)).description || '';
}
}
}

const urlResult = getUrl(item, useAvid);
const urlText = urlResult?.text;
if (urlResult && directLink) {
link = urlResult.url;
}
const urlResult = getUrl(item, useAvid);
const urlText = urlResult?.text;
if (urlResult && directLink) {
link = urlResult.url;
}

const originUrlResult = getUrl(item?.orig, useAvid);
const originUrlText = originUrlResult?.text;
if (originUrlResult && directLink) {
link = originUrlResult.url;
}
const originUrlResult = getUrl(item?.orig, useAvid);
const originUrlText = originUrlResult?.text;
if (originUrlResult && directLink) {
link = originUrlResult.url;
}

let originDescription = '';
const originName = getOriginName(origin);
const originTitle = getOriginTitle(origin);
const originDes = getOriginDes(origin);
if (originName) {
originDescription += `//转发自: @${getOriginName(origin)}: `;
}
if (originTitle) {
originDescription += originTitle;
}
if (originDes) {
originDescription += `<br>${originDes}`;
}
let originDescription = '';
const originName = getOriginName(origin);
const originTitle = getOriginTitle(origin);
const originDes = getOriginDes(origin);
if (originName) {
originDescription += `//转发自: @${getOriginName(origin)}: `;
}
if (originTitle) {
originDescription += originTitle;
}
if (originDes) {
originDescription += `<br>${originDes}`;
}

// 换行处理
description = description.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');
originDescription = originDescription.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');
// 换行处理
description = description.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');
originDescription = originDescription.replaceAll('\r\n', '<br>').replaceAll('\n', '<br>');

const descriptions = [description, originDescription, urlText, originUrlText, getIframe(data, disableEmbed), getIframe(origin, disableEmbed), getImgs(data), getImgs(origin)]
.filter(Boolean)
.map((e) => e?.trim())
.join('<br>');
const descriptions = [description, originDescription, urlText, originUrlText, getIframe(data, disableEmbed), getIframe(origin, disableEmbed), getImgs(data), getImgs(origin)]
.filter(Boolean)
.map((e) => e?.trim())
.join('<br>');

return {
title,
description: descriptions,
pubDate: data.module_author?.pub_ts ? parseDate(data.module_author.pub_ts, 'X') : undefined,
link,
author,
category: category.length ? [...new Set(category)] : undefined,
};
})
return {
title,
description: descriptions,
pubDate: data.module_author?.pub_ts ? parseDate(data.module_author.pub_ts, 'X') : undefined,
link,
author,
category: category.length ? [...new Set(category)] : undefined,
};
})
);

return {
Expand Down

0 comments on commit a436fba

Please sign in to comment.