feat(route): add route "komiic" (#18465)
* feat(route): add route "komiic" * fix(route/komiic): update comic route parameters and radar source * fix(route/komiic): modify comic route to use query parameter for limit --------- Co-authored-by: NekoAria <NekoAria@users.noreply.github.com>
This commit is contained in:
parent
9018fad3d1
commit
f291b8ce83
|
|
@ -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) =>
|
||||
`
|
||||
<h1>${chapter.size}p</h1>
|
||||
<img src="${imageUrl}" />
|
||||
`.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,
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
import type { Namespace } from '@/types';
|
||||
|
||||
export const namespace: Namespace = {
|
||||
name: 'Komiic',
|
||||
url: 'komiic.com',
|
||||
lang: 'zh-CN',
|
||||
};
|
||||
Loading…
Reference in New Issue