diff --git a/lib/routes/komiic/comic.ts b/lib/routes/komiic/comic.ts new file mode 100644 index 000000000..b0cc6e6c6 --- /dev/null +++ b/lib/routes/komiic/comic.ts @@ -0,0 +1,88 @@ +import { Route } from '@/types'; +import { parseDate } from '@/utils/parse-date'; +import got from '@/utils/got'; + +export const route: Route = { + path: '/comic/:id', + categories: ['anime'], + example: '/komiic/comic/533', + parameters: { id: '漫画 ID' }, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['komiic.com/comic/:id'], + target: '/comic/:id', + }, + ], + name: '漫画更新', + maintainers: ['NekoAria'], + handler, +}; + +async function handler(ctx) { + const { id } = ctx.req.param(); + const { limit = 0 } = ctx.req.query(); + const baseUrl = 'https://komiic.com'; + + const { data: comicInfo } = await got.post(`${baseUrl}/api/query`, { + json: { + operationName: 'comicById', + variables: { comicId: id }, + query: `query comicById($comicId: ID!) { + comicById(comicId: $comicId) { + title + imageUrl + } + }`, + }, + }); + + const { title, imageUrl } = comicInfo.data.comicById; + + const { data: chapterData } = await got.post(`${baseUrl}/api/query`, { + json: { + operationName: 'chapterByComicId', + variables: { comicId: id }, + query: `query chapterByComicId($comicId: ID!) { + chaptersByComicId(comicId: $comicId) { + id + serial + type + dateUpdated + size + } + }`, + }, + }); + + const sortedChapters = chapterData.data.chaptersByComicId.sort((a, b) => Date.parse(b.dateUpdated) - Date.parse(a.dateUpdated)); + + const chapterLimit = Number(limit) || sortedChapters.length; + const filteredChapters = sortedChapters.slice(0, chapterLimit); + + const generateChapterDescription = (chapter) => + ` +

${chapter.size}p

+ + `.trim(); + + const items = filteredChapters.map((chapter) => ({ + title: chapter.type === 'book' ? `第 ${chapter.serial} 卷` : `第 ${chapter.serial} 话`, + link: `${baseUrl}/comic/${id}/chapter/${chapter.id}/images/all`, + pubDate: parseDate(chapter.dateUpdated), + description: generateChapterDescription(chapter), + })); + + return { + title: `Komiic - ${title}`, + link: `${baseUrl}/comic/${id}`, + item: items, + }; +} diff --git a/lib/routes/komiic/namespace.ts b/lib/routes/komiic/namespace.ts new file mode 100644 index 000000000..34f6dae42 --- /dev/null +++ b/lib/routes/komiic/namespace.ts @@ -0,0 +1,7 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'Komiic', + url: 'komiic.com', + lang: 'zh-CN', +};