diff --git a/docs/other.md b/docs/other.md
index 986097797e..b509bde5e4 100644
--- a/docs/other.md
+++ b/docs/other.md
@@ -155,6 +155,11 @@
+## 异次元软件世界
+
+
+
+
## 趣头条
diff --git a/lib/router.js b/lib/router.js
index 30005ac9f0..1de2734b06 100755
--- a/lib/router.js
+++ b/lib/router.js
@@ -772,6 +772,9 @@ router.get('/sspai/shortcuts', require('./routes/sspai/shortcutsGallery'));
router.get('/sspai/matrix', require('./routes/sspai/matrix'));
router.get('/sspai/column/:id', require('./routes/sspai/column'));
+// 异次元软件世界
+router.get('/iplay/home', require('./routes/iplay/home'));
+
// xclient.info
router.get('/xclient/app/:name', require('./routes/xclient/app'));
diff --git a/lib/routes/iplay/home.js b/lib/routes/iplay/home.js
new file mode 100644
index 0000000000..0f70b77f61
--- /dev/null
+++ b/lib/routes/iplay/home.js
@@ -0,0 +1,28 @@
+const axios = require('../../utils/axios');
+const cheerio = require('cheerio');
+const util = require('./utils');
+
+module.exports = async (ctx) => {
+ const url = `https://www.iplaysoft.com/`;
+ const response = await axios({
+ method: 'get',
+ url: url,
+ headers: {
+ Referer: url,
+ },
+ });
+
+ const $ = cheerio.load(response.data);
+ const list = $('#postlist .entry').get();
+
+ const result = await util.ProcessFeed(list, ctx.cache);
+
+ ctx.state.data = {
+ title: $('title')
+ .text()
+ .split('-')[0],
+ link: url,
+ description: $('meta[name="description"]').attr('content'),
+ item: result,
+ };
+};
diff --git a/lib/routes/iplay/utils.js b/lib/routes/iplay/utils.js
new file mode 100644
index 0000000000..dbbf0871c0
--- /dev/null
+++ b/lib/routes/iplay/utils.js
@@ -0,0 +1,55 @@
+const axios = require('../../utils/axios');
+const cheerio = require('cheerio');
+const url = require('url');
+
+async function load(link) {
+ const response = await axios.get(link);
+ const $ = cheerio.load(response.data);
+ // 处理日期
+ const datestr = $('.entry-meta li')
+ .text()
+ .match(/生产日期:异次纪元 ([\s\S]*?秒)/)[1]
+ .match(/(\d{1,2})/gm);
+ for (let i = 1; i < datestr.length; i++) {
+ datestr[i] = datestr[i].padStart(2, '0');
+ }
+ const date = new Date('20' + datestr[0] + '-' + datestr[1] + '-' + datestr[2] + ' ' + datestr[3] + ':' + datestr[4] + ':' + datestr[5]);
+ const timeZone = 8;
+ const serverOffset = date.getTimezoneOffset() / 60;
+ const pubDate = new Date(date.getTime() - 60 * 60 * 1000 * (timeZone + serverOffset)).toUTCString();
+ // 提取详情
+ const description = $('.entry-content').html();
+ return { description, pubDate };
+ // return { description };
+}
+
+const ProcessFeed = async (list, caches) => {
+ const host = 'https://www.iplaysoft.com/';
+ return await Promise.all(
+ list.map(async (item) => {
+ const $ = cheerio.load(item);
+ const $title = $('a');
+ // 还原相对链接为绝对链接
+ const itemUrl = url.resolve(host, $title.attr('href'));
+
+ // 列表上提取到的信息
+ const single = {
+ title: $title.text(),
+ link: itemUrl,
+ // author: $('.nickname').text(),
+ guid: itemUrl,
+ };
+
+ // 使用tryGet方法从缓存获取内容。
+ // 当缓存中无法获取到链接内容的时候,则使用load方法加载文章内容。
+ const other = await caches.tryGet(itemUrl, async () => await load(itemUrl));
+
+ // 合并解析后的结果集作为该篇文章最终的输出结果
+ return Promise.resolve(Object.assign({}, single, other));
+ })
+ );
+};
+
+module.exports = {
+ ProcessFeed,
+};