From 3f9eb757b5585420a916933cdbbe7ecea50ad2ad Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 15 Jun 2026 00:53:33 +0800 Subject: [PATCH] fix(route): update route path syntax --- lib/routes/141jav/index.tsx | 2 +- lib/routes/141ppv/index.tsx | 2 +- lib/routes/apnews/topics.ts | 4 +- lib/routes/bangumi.moe/index.ts | 61 ++++++++++++++++------------ lib/routes/gisreportsonline/index.ts | 4 +- 5 files changed, 41 insertions(+), 32 deletions(-) diff --git a/lib/routes/141jav/index.tsx b/lib/routes/141jav/index.tsx index 25c600946..03818ae3f 100644 --- a/lib/routes/141jav/index.tsx +++ b/lib/routes/141jav/index.tsx @@ -7,7 +7,7 @@ import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; export const route: Route = { - path: '/:type/:keyword{.*}?', + path: '/:type/:keyword{.+}?', categories: ['multimedia'], name: '通用', maintainers: ['cgkings', 'nczitzk'], diff --git a/lib/routes/141ppv/index.tsx b/lib/routes/141ppv/index.tsx index ee85fd0ea..4cd480a53 100644 --- a/lib/routes/141ppv/index.tsx +++ b/lib/routes/141ppv/index.tsx @@ -7,7 +7,7 @@ import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; export const route: Route = { - path: '/:type/:keyword{.*}?', + path: '/:type/:keyword{.+}?', categories: ['multimedia'], name: '通用', maintainers: ['cgkings', 'nczitzk'], diff --git a/lib/routes/apnews/topics.ts b/lib/routes/apnews/topics.ts index 7c955205c..cdb8eeb91 100644 --- a/lib/routes/apnews/topics.ts +++ b/lib/routes/apnews/topics.ts @@ -10,7 +10,7 @@ import { fetchArticle, removeDuplicateByKey } from './utils'; const HOME_PAGE = 'https://apnews.com'; export const route: Route = { - path: ['/topics/:topic?', '/nav/:nav{.*}?'], + path: ['/topics/:topic?', '/nav/:nav{.+}?'], categories: ['traditional-media'], example: '/apnews/topics/apf-topnews', view: ViewType.Articles, @@ -41,7 +41,7 @@ export const route: Route = { async function handler(ctx) { const { topic = 'trending-news', nav = '' } = ctx.req.param(); - const useNav = ctx.req.routePath === '/apnews/nav/:nav{.*}?'; + const useNav = ctx.req.routePath === '/apnews/nav/:nav{.+}?'; const url = useNav ? `${HOME_PAGE}/${nav}` : `${HOME_PAGE}/hub/${topic}`; const response = await got(url); const $ = load(response.data); diff --git a/lib/routes/bangumi.moe/index.ts b/lib/routes/bangumi.moe/index.ts index 765492954..71d72036c 100644 --- a/lib/routes/bangumi.moe/index.ts +++ b/lib/routes/bangumi.moe/index.ts @@ -1,30 +1,33 @@ import type { Route } from '@/types'; import cache from '@/utils/cache'; -import { getSubPath } from '@/utils/common-utils'; import got from '@/utils/got'; import { parseDate } from '@/utils/parse-date'; export const route: Route = { - path: '/*', + path: '/:tags{.+}?', categories: ['anime'], + example: '/bangumi.moe', + parameters: { + tags: 'Tags, empty by default, multiple tags separated by `/`', + }, radar: [ { source: ['bangumi.moe/'], }, ], name: 'Latest', - example: '/bangumi.moe', maintainers: ['nczitzk'], handler, url: 'bangumi.moe/', }; async function handler(ctx) { - const isLatest = getSubPath(ctx) === '/'; + const { tags } = ctx.req.param(); + const isLatest = !tags; const rootUrl = 'https://bangumi.moe'; let response; - let tag_id = []; + let searchLink = rootUrl; if (isLatest) { const apiUrl = `${rootUrl}/api/torrent/latest`; @@ -34,28 +37,10 @@ async function handler(ctx) { url: apiUrl, }); } else { - const tagUrl = `${rootUrl}/api/tag/search`; const torrentUrl = `${rootUrl}/api/torrent/search`; - const params = getSubPath(ctx).split('/').slice(2); - - tag_id = await Promise.all( - params.map((param) => - cache.tryGet(param, async () => { - const paramResponse = await got({ - method: 'post', - url: tagUrl, - json: { - name: decodeURIComponent(param), - keywords: true, - multi: true, - }, - }); - - return paramResponse.data.found ? paramResponse.data.tag.map((tag) => tag._id)[0] : ''; - }) - ) - ); + const tag_id = await searchTagIds(tags, rootUrl); + searchLink = `${rootUrl}/search/${tag_id.join('+')}`; response = await got({ method: 'post', @@ -103,8 +88,32 @@ async function handler(ctx) { return { title: '萌番组 Bangumi Moe', - link: isLatest || items.length === 0 ? rootUrl : `${rootUrl}/search/${tag_id.join('+')}`, + link: isLatest || items.length === 0 ? rootUrl : searchLink, item: items, allowEmpty: true, }; } + +async function searchTagIds(tags, rootUrl): Promise { + const tagUrl = `${rootUrl}/api/tag/search`; + + const tagIds = await Promise.all( + tags.split('/').map((param) => + cache.tryGet(`bangumi.moe:tag:${param}`, async () => { + const paramResponse = await got({ + method: 'post', + url: tagUrl, + json: { + name: decodeURIComponent(param), + keywords: true, + multi: true, + }, + }); + + return paramResponse.data.found ? (paramResponse.data.tag.map((tag) => tag._id)[0] as string) : ''; + }) + ) + ); + + return tagIds.toSorted(); +} diff --git a/lib/routes/gisreportsonline/index.ts b/lib/routes/gisreportsonline/index.ts index e5d5fc2d6..ca09d87d6 100644 --- a/lib/routes/gisreportsonline/index.ts +++ b/lib/routes/gisreportsonline/index.ts @@ -6,7 +6,7 @@ import ofetch from '@/utils/ofetch'; import { parseDate } from '@/utils/parse-date'; export const route: Route = { - path: '/:path{.*}', + path: '/:path{.+}?', categories: ['new-media'], example: '/gis/c/security-challenges/', parameters: { path: '包含"Reports"页面下的路径' }, @@ -22,7 +22,7 @@ export const route: Route = { async function handler(ctx) { const rootUrl = 'https://www.gisreportsonline.com'; - const currentUrl = `${rootUrl}/${ctx.req.param('path')}`; + const currentUrl = `${rootUrl}/${ctx.req.param('path') ?? ''}`; const response = await ofetch(currentUrl); const $ = load(response);