diff --git a/lib/routes/asianfanfics/namespace.ts b/lib/routes/asianfanfics/namespace.ts new file mode 100644 index 000000000..7903b8786 --- /dev/null +++ b/lib/routes/asianfanfics/namespace.ts @@ -0,0 +1,7 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'Asianfanfics', + url: 'asianfanfics.com', + lang: 'en', +}; diff --git a/lib/routes/asianfanfics/tag.ts b/lib/routes/asianfanfics/tag.ts new file mode 100644 index 000000000..0ac078d77 --- /dev/null +++ b/lib/routes/asianfanfics/tag.ts @@ -0,0 +1,89 @@ +import { DataItem, Route } from '@/types'; + +import { config } from '@/config'; +import ofetch from '@/utils/ofetch'; +import { parseDate } from '@/utils/parse-date'; +import { load } from 'cheerio'; + +// test url http://localhost:1200/asianfanfics/tag/milklove/N + +export const route: Route = { + path: '/tag/:tag/:type', + categories: ['reading'], + example: '/asianfanfics/tag/milklove/N', + parameters: { + tag: '标签', + type: '排序类型', + }, + name: 'asianfanfics标签', + maintainers: ['KazooTTT'], + radar: [ + { + source: ['www.asianfanfics.com/browse/tag/:tag/:type'], + target: '/tag/:tag/:type', + }, + ], + description: `匹配asianfanfics标签,支持排序类型: +- L: Latest 最近更新 +- N: Newest 最近发布 +- O: Oldest 最早发布 +- C: Completed 已完成 +- OS: One Shots 短篇 +`, + handler, +}; + +type Type = 'L' | 'N' | 'O' | 'C' | 'OS'; + +const typeToText = { + L: '最近更新', + N: '最近发布', + O: '最早发布', + C: '已完成', + OS: '短篇', +}; + +async function handler(ctx) { + const tag = ctx.req.param('tag'); + const type = ctx.req.param('type') as Type; + + if (!type || !['L', 'N', 'O', 'C', 'OS'].includes(type)) { + throw new Error('无效的排序类型'); + } + const link = `https://www.asianfanfics.com/browse/tag/${tag}/${type}`; + + const response = await ofetch(link, { + headers: { + 'user-agent': config.trueUA, + Referer: 'https://www.asianfanfics.com/', + }, + }); + const $ = load(response); + + const items: DataItem[] = $('.primary-container .excerpt') + .toArray() + .filter((element) => { + const $element = $(element); + return $element.find('.excerpt__title a').length > 0; + }) + .map((element) => { + const $element = $(element); + const title = $element.find('.excerpt__title a').text(); + const link = 'https://www.asianfanfics.com' + $element.find('.excerpt__title a').attr('href'); + const author = $element.find('.excerpt__meta__name a').text().trim(); + const pubDate = parseDate($element.find('time').attr('datetime') || ''); + + return { + title, + link, + author, + pubDate, + }; + }); + + return { + title: `Asianfanfics - 标签:${tag} - ${typeToText[type]}`, + link, + item: items, + }; +} diff --git a/lib/routes/asianfanfics/text-search.ts b/lib/routes/asianfanfics/text-search.ts new file mode 100644 index 000000000..a8a344c4f --- /dev/null +++ b/lib/routes/asianfanfics/text-search.ts @@ -0,0 +1,68 @@ +import { config } from '@/config'; +import { DataItem, Route } from '@/types'; +import ofetch from '@/utils/ofetch'; +import { parseDate } from '@/utils/parse-date'; +import { load } from 'cheerio'; + +// test url http://localhost:1200/asianfanfics/text-search/milklove + +export const route: Route = { + path: '/text-search/:keyword', + categories: ['reading'], + example: '/asianfanfics/text-search/milklove', + parameters: { + keyword: '关键词', + }, + name: 'asianfanfics关键词', + maintainers: ['KazooTTT'], + radar: [ + { + source: ['www.asianfanfics.com/browse/text_search?q=:keyword'], + target: '/text-search/:keyword', + }, + ], + description: `匹配asianfanfics搜索关键词`, + handler, +}; + +async function handler(ctx) { + const keyword = ctx.req.param('keyword'); + if (keyword.trim() === '') { + throw new Error('关键词不能为空'); + } + const link = `https://www.asianfanfics.com/browse/text_search?q=${keyword}+`; + + const response = await ofetch(link, { + headers: { + 'user-agent': config.trueUA, + }, + }); + const $ = load(response); + + const items: DataItem[] = $('.primary-container .excerpt') + .toArray() + .filter((element) => { + const $element = $(element); + return $element.find('.excerpt__title a').length > 0; + }) + .map((element) => { + const $element = $(element); + const title = $element.find('.excerpt__title a').text(); + const link = 'https://www.asianfanfics.com' + $element.find('.excerpt__title a').attr('href'); + const author = $element.find('.excerpt__meta__name a').text().trim(); + const pubDate = parseDate($element.find('time').attr('datetime') || ''); + + return { + title, + link, + author, + pubDate, + }; + }); + + return { + title: `Asianfanfics - 关键词:${keyword}`, + link, + item: items, + }; +}