diff --git a/docs/social-media.md b/docs/social-media.md index 3411606d5..87a1918c7 100644 --- a/docs/social-media.md +++ b/docs/social-media.md @@ -36,6 +36,10 @@ Tiny Tiny RSS 会给所有 iframe 元素添加 `sandbox="allow-scripts"` 属性 +### UP 主所有视频 + + + ### UP 主专栏 diff --git a/lib/v2/bilibili/radar.js b/lib/v2/bilibili/radar.js index 81ec38fe4..0224460a6 100644 --- a/lib/v2/bilibili/radar.js +++ b/lib/v2/bilibili/radar.js @@ -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', diff --git a/lib/v2/bilibili/router.js b/lib/v2/bilibili/router.js index eb041593a..c0f09009f 100644 --- a/lib/v2/bilibili/router.js +++ b/lib/v2/bilibili/router.js @@ -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')); diff --git a/lib/v2/bilibili/video-all.js b/lib/v2/bilibili/video-all.js new file mode 100644 index 000000000..f025119ed --- /dev/null +++ b/lib/v2/bilibili/video-all.js @@ -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 ? `

${utils.iframe(item.aid)}` : ''}
`, + 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, + })), + }; +};