feat(route): Bilibili UP 主所有视频 (#10352)

* feat(route): Bilibili UP 主所有视频

* feat(route): fix code review

Co-authored-by: pull[bot] <39814207+pull[bot]@users.noreply.github.com>
This commit is contained in:
xiaofan 2022-07-30 00:45:47 +08:00 committed by GitHub
parent d7871687a2
commit 640c3102cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 63 additions and 0 deletions

View File

@ -36,6 +36,10 @@ Tiny Tiny RSS 会给所有 iframe 元素添加 `sandbox="allow-scripts"` 属性
<Route author="DIYgod" example="/bilibili/user/video/2267573" path="/bilibili/user/video/:uid/:disableEmbed?" :paramsDesc="['用户 id, 可在 UP 主主页中找到', '默认为开启内嵌视频, 任意值为关闭']" anticrawler="1" radar="1" rssbud="1"/>
### UP 主所有视频
<Route author="CcccFz" example="/bilibili/user/video-all/436361287" path="/bilibili/user/video-all/:uid/:disableEmbed?" :paramsDesc="['用户 id, 可在 UP 主主页中找到', '默认为开启内嵌视频, 任意值为关闭']" anticrawler="1" radar="1" rssbud="1"/>
### UP 主专栏
<Route author="lengthmin" example="/bilibili/user/article/334958638" path="/bilibili/user/article/:uid" :paramsDesc="['用户 id, 可在 UP 主主页中找到']" anticrawler="1" radar="1" rssbud="1"/>

View File

@ -48,6 +48,12 @@ module.exports = {
source: '/:uid',
target: '/bilibili/user/video/:uid',
},
{
title: 'UP 主所有视频',
docs: 'https://docs.rsshub.app/social-media.html#bilibili',
source: '/:uid',
target: '/bilibili/user/video-all/:uid',
},
{
title: 'UP 主专栏',
docs: 'https://docs.rsshub.app/social-media.html#bilibili',

View File

@ -32,6 +32,7 @@ module.exports = (router) => {
router.get('/user/followers/:uid', require('./followers'));
router.get('/user/followings/:uid', require('./followings'));
router.get('/user/video/:uid/:disableEmbed?', require('./video'));
router.get('/user/video-all/:uid/:disableEmbed?', require('./video-all'));
router.get('/video/danmaku/:bvid/:pid?', require('./danmaku'));
router.get('/video/page/:bvid/:disableEmbed?', require('./page'));
router.get('/video/reply/:bvid', require('./reply'));

View File

@ -0,0 +1,52 @@
const got = require('@/utils/got');
const cache = require('./cache');
const utils = require('./utils');
const { parseDate } = require('@/utils/parse-date');
module.exports = async (ctx) => {
const uid = ctx.params.uid;
const disableEmbed = ctx.params.disableEmbed;
const [name, face] = await cache.getUsernameAndFaceFromUID(ctx, uid);
const response = await got(`https://api.bilibili.com/x/space/arc/search?mid=${uid}&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp`, {
headers: {
Referer: `https://space.bilibili.com/${uid}/`,
},
});
const vlist = [...response.data.data.list.vlist];
const pageTotal = Math.ceil(response.data.data.page.count / response.data.data.page.ps);
const promises = [];
if (pageTotal > 1) {
for (let i = 2; i <= pageTotal; i++) {
promises.push(
got(`https://api.bilibili.com/x/space/arc/search?mid=${uid}&ps=30&tid=0&pn=${i}&keyword=&order=pubdate&jsonp=jsonp`, {
headers: {
Referer: `https://space.bilibili.com/${uid}/`,
},
})
);
}
const rets = await Promise.all(promises);
rets.forEach((ret) => {
vlist.push(...ret.data.data.list.vlist);
});
}
ctx.state.data = {
title: name,
link: `https://space.bilibili.com/${uid}/video`,
description: `${name} 的 bilibili 所有视频`,
logo: face,
icon: face,
item: vlist.map((item) => ({
title: item.title,
description: `${item.description}${!disableEmbed ? `<br><br>${utils.iframe(item.aid)}` : ''}<br><img src="${item.pic}">`,
pubDate: parseDate(item.created, 'X'),
link: item.created > utils.bvidTime && item.bvid ? `https://www.bilibili.com/video/${item.bvid}` : `https://www.bilibili.com/video/av${item.aid}`,
author: name,
comments: item.comment,
})),
};
};