diff --git a/docs/anime.md b/docs/anime.md index 0f08540cf..e0a0e7ac7 100644 --- a/docs/anime.md +++ b/docs/anime.md @@ -191,6 +191,12 @@ pageClass: routes +## Comicat + +### 搜索关键词 + + + ## CnGal ### 每周速报 diff --git a/lib/v2/comicat/maintainer.js b/lib/v2/comicat/maintainer.js new file mode 100644 index 000000000..b32886472 --- /dev/null +++ b/lib/v2/comicat/maintainer.js @@ -0,0 +1,3 @@ +module.exports = { + '/search/:keyword': ['Cyang39'], +}; diff --git a/lib/v2/comicat/radar.js b/lib/v2/comicat/radar.js new file mode 100644 index 000000000..d6d348263 --- /dev/null +++ b/lib/v2/comicat/radar.js @@ -0,0 +1,11 @@ +module.exports = { + 'comicat.org': { + _name: 'Comicat', + '.': [ + { + title: '搜索关键词', + docs: 'https://docs.rsshub.app/anime.html#comicat', + }, + ], + }, +}; diff --git a/lib/v2/comicat/router.js b/lib/v2/comicat/router.js new file mode 100644 index 000000000..5a0a66fe1 --- /dev/null +++ b/lib/v2/comicat/router.js @@ -0,0 +1,3 @@ +module.exports = function (router) { + router.get('/search/:keyword', require('./search')); +}; diff --git a/lib/v2/comicat/search.js b/lib/v2/comicat/search.js new file mode 100644 index 000000000..9b0b43d5c --- /dev/null +++ b/lib/v2/comicat/search.js @@ -0,0 +1,42 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const { parseDate } = require('@/utils/parse-date'); + +const baseUrl = 'https://comicat.org'; + +module.exports = async (ctx) => { + const keyword = ctx.params.keyword; + const { data: response } = await got(`${baseUrl}/search.php?keyword=${encodeURIComponent(keyword)}`); + const $ = cheerio.load(response); + const list = $('#listTable tbody > tr') + .toArray() + .map((item) => ({ + title: $(item).find('td:nth-child(3)').text().trim(), + link: `${baseUrl}/${$(item).find('td:nth-child(3) a').attr('href')}`, + category: $(item).find('td:nth-child(2)').text().trim(), + author: $(item).find('td:nth-child(8)').text().trim(), + })); + + const items = await Promise.all( + list.map((item) => + ctx.cache.tryGet(item.link, async () => { + const { data: response } = await got(item.link); + const $ = cheerio.load(response); + + item.pubDate = parseDate($('div.main > div.slayout > div > div.c1 > div:nth-child(1) > div > p:nth-child(4)').text().split('发布时间: ')[1]); + const marginLink = `magnet:?xt=urn:btih:${$('#text_hash_id').text().split(',特征码:')[1]}`.trim(); + item.enclosure_url = marginLink; + item.enclosure_type = 'application/x-bittorrent'; + item.description = $('#btm > div.main > div.slayout > div > div.c2 > div:nth-child(1) > div.intro').html(); + + return item; + }) + ) + ); + + ctx.state.data = { + title: `Comicat - ${keyword}`, + link: `${baseUrl}/search.php?keyword=${encodeURIComponent(keyword)}`, + item: items + }; +};