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);
+};