diff --git a/assets/radar-rules.js b/assets/radar-rules.js index 73315d5a9e..dadaa1b627 100644 --- a/assets/radar-rules.js +++ b/assets/radar-rules.js @@ -330,4 +330,24 @@ }, ], }, + 'algocasts.io': { + _name: 'AlgoCasts', + '.': [ + { + title: '视频更新', + docs: 'https://docs.rsshub.app/programming.html#algocasts', + source: '/episodes', + target: '/algocasts', + }, + ], + }, + 'soulapp.cn': { + _name: 'Soul', + '.': [ + { + title: '瞬间更新', + docs: 'https://docs.rsshub.app/social-media.html#soul', + }, + ], + }, }); diff --git a/docs/social-media.md b/docs/social-media.md index ab813c7aa4..03a7537928 100644 --- a/docs/social-media.md +++ b/docs/social-media.md @@ -350,6 +350,12 @@ pageClass: routes +## Soul + +### 瞬间更新 + + + ## Telegram ### 频道 diff --git a/lib/router.js b/lib/router.js index 84d83bd112..34ab02c444 100644 --- a/lib/router.js +++ b/lib/router.js @@ -1632,6 +1632,9 @@ router.get('/hanime/video', require('./routes/hanime/video')); router.get('/gouhuo/news/:category', require('./routes/gouhuo')); router.get('/gouhuo/strategy', require('./routes/gouhuo/strategy')); +// Soul +router.get('/soul/:id', require('./routes/soul')); + // 单向空间 router.get('/owspace/read/:type?', require('./routes/owspace/read')); diff --git a/lib/routes/algocasts/all.js b/lib/routes/algocasts/all.js index c40c583137..070072fc94 100644 --- a/lib/routes/algocasts/all.js +++ b/lib/routes/algocasts/all.js @@ -54,7 +54,11 @@ const makeFull = async (ctx, infos) => { const badges = []; $('.badge').each((index, badge) => { - badges.push($(badge).text()); + const text = $(badge).text(); + + if (text !== '讨论') { + badges.push(text); + } }); info.description = `

${info.title}

${badges.join(' | ')}
${$('#my-content p').html()}
`; @@ -79,11 +83,9 @@ module.exports = async (ctx) => { $('tr') .slice(1) .each((i, e) => { - const id = parseInt( - $(e) - .find('th') - .text() - ); + const id = $(e) + .find('th') + .text(); const titleLabel = $(e).find('td a'); const title = `${id}. ${titleLabel.text()}`; const episode = titleLabel diff --git a/lib/routes/soul/index.js b/lib/routes/soul/index.js new file mode 100644 index 0000000000..fb49106721 --- /dev/null +++ b/lib/routes/soul/index.js @@ -0,0 +1,71 @@ +const got = require('@/utils/got'); + +const generateResponse = async (info, items) => ({ + // 源标题 + title: `「${info.name}」的瞬间`, + // 源链接 + link: `https://w3.soulapp-inc.cn/activity/#/web/user?userIdEcpt=${info.id}`, + item: items.map((item) => ({ + title: `「${info.name}」的新瞬间:${item.pureContent}`, + author: info.name, + description: item.content, + pubDate: new Date(item.createTime).toUTCString(), + guid: item.id, + link: `https://w3.soulapp-inc.cn/activity/#/web/topic/detail?postIdEcpt=${item.id}`, + })), +}); + +module.exports = async (ctx) => { + const userIdEcpt = ctx.params.id; + const response = await got({ + method: 'get', + url: 'https://api.soulapp.cn/html/v2/post/homepage?userIdEcpt=' + userIdEcpt, + }); + + // 瞬间信息(数组) + let items = response.data.data; + + // 用户信息 + const info = { + id: userIdEcpt, + name: null, + }; + + if (items.length === 0) { + // 未发表过任何瞬间 + const infoResponse = await got({ + method: 'get', + url: 'https://api.soulapp.cn/html/v2/user/info?userIdEcpt=' + userIdEcpt, + }); + + const infoData = infoResponse.data.data; + + info.name = infoData.signature; + } else { + // 发表过瞬间 -> 直接从瞬间信息取用户名 + info.name = items[0].signature; + } + + items = items.map((item) => { + const pureContent = `${item.content}`; + let content = pureContent.replace(/\n/, '
'); + + if (item.attachments) { + for (const attachment of item.attachments) { + if (attachment.type === 'IMAGE') { + content += '
'; + content += ``; + } + } + } + + return { + id: item.postIdEcpt, + pureContent, + content, + createTime: item.createTime, + }; + }); + + ctx.state.data = await generateResponse(info, items); +};