diff --git a/docs/picture.md b/docs/picture.md index 927cd99ecc..3d674461c2 100644 --- a/docs/picture.md +++ b/docs/picture.md @@ -269,6 +269,17 @@ R18 显示 +## Mic Mic Idol + +### 最新 + + + +### 标签 + + +获取数量可以通过 [limit](https://docs.rsshub.app/parameter.html#tiao-shu-xian-zhi) 参数控制。默认值为`50`。 + ## MM 范 ### 分类 diff --git a/lib/router.js b/lib/router.js index c2a87a4b13..bd6d61f9bc 100644 --- a/lib/router.js +++ b/lib/router.js @@ -4212,6 +4212,10 @@ router.get('/right/forum/:id?', lazyloadRouteHandler('./routes/right/forum')); // 香港經濟日報 router.get('/hket/:category?', lazyloadRouteHandler('./routes/hket/index')); +// micmicidol +router.get('/micmicidol', lazyloadRouteHandler('./routes/micmicidol/latest')); +router.get('/micmicidol/search/:label', lazyloadRouteHandler('./routes/micmicidol/search')); + // 香港高登 router.get('/hkgolden/:id?/:limit?/:sort?', lazyloadRouteHandler('./routes/hkgolden')); diff --git a/lib/routes/micmicidol/article.js b/lib/routes/micmicidol/article.js new file mode 100644 index 0000000000..1c8976314c --- /dev/null +++ b/lib/routes/micmicidol/article.js @@ -0,0 +1,28 @@ +const Cheerio = require('cheerio'); +const got = require('@/utils/got'); +const { parseDate } = require('@/utils/parse-date'); +const regStripAnchor = /(?: *)?(?:<\/a>)(?: *)?/i; + +async function loadArticle(link) { + const resp = await got(link); + const $ = Cheerio.load(resp.body); + const matchResult = $('#post-header-top > script') + .html() + .match(/var timestamp="\w+,(.+)";/i)[1] + .trim(); + // Ex. "August 20, 2021" + const pubDate = parseDate(matchResult + '+0000', 'MMMM D, YYYYZ'); + + const labels = $('.post-labels a') + .text() + .split('\n') + .filter((item) => item !== ''); + return { + title: $('.entry-title').text().trim(), + description: $('.post-body.entry-content').html().replace(regStripAnchor, ''), + category: labels, + pubDate, + link, + }; +} +module.exports = loadArticle; diff --git a/lib/routes/micmicidol/latest.js b/lib/routes/micmicidol/latest.js new file mode 100644 index 0000000000..28d60e0dbf --- /dev/null +++ b/lib/routes/micmicidol/latest.js @@ -0,0 +1,3 @@ +const parse = require('./parse'); + +module.exports = (ctx) => parse(ctx, '', 'Latest'); diff --git a/lib/routes/micmicidol/parse.js b/lib/routes/micmicidol/parse.js new file mode 100644 index 0000000000..95063775f9 --- /dev/null +++ b/lib/routes/micmicidol/parse.js @@ -0,0 +1,22 @@ +const got = require('@/utils/got'); +const Cheerio = require('cheerio'); +const loadArticle = require('./article'); + +module.exports = async (ctx, urlParam, title) => { + const link = new URL(urlParam, 'https://www.micmicidol.com/').toString(); + const response = await got(link); + ctx.state.data = { + title: `micmicidol-${title}`, + link, + item: + response.body && + (await Promise.all( + Cheerio.load(response.body)('.post.hentry') + .map((_, entry) => { + const { href } = Cheerio.load(entry)('.post-title.entry-title a')[0].attribs; + return ctx.cache.tryGet(href, () => loadArticle(href)); + }) + .toArray() + )), + }; +}; diff --git a/lib/routes/micmicidol/search.js b/lib/routes/micmicidol/search.js new file mode 100644 index 0000000000..f39fc6a538 --- /dev/null +++ b/lib/routes/micmicidol/search.js @@ -0,0 +1,7 @@ +const parse = require('./parse'); + +module.exports = (ctx) => { + const max = ctx.query.limit || 50; + const { label } = ctx.params; + return parse(ctx, `search/label/${label}?max-results=${max}`, label); +};