From 558fa05bb0922ecb610bee69136e3da862949306 Mon Sep 17 00:00:00 2001 From: Ritsuka Date: Thu, 9 May 2024 14:17:34 -0400 Subject: [PATCH] feat(route): Isabelle dev blog (#15505) --- lib/routes/sketis/isabelle-dev/blog/index.ts | 77 ++++++++++++++++++++ lib/routes/sketis/namespace.ts | 6 ++ 2 files changed, 83 insertions(+) create mode 100644 lib/routes/sketis/isabelle-dev/blog/index.ts create mode 100644 lib/routes/sketis/namespace.ts diff --git a/lib/routes/sketis/isabelle-dev/blog/index.ts b/lib/routes/sketis/isabelle-dev/blog/index.ts new file mode 100644 index 000000000..f2c39ec19 --- /dev/null +++ b/lib/routes/sketis/isabelle-dev/blog/index.ts @@ -0,0 +1,77 @@ +import { Route } from '@/types'; +import ofetch from '@/utils/ofetch'; +import { load } from 'cheerio'; +import { parseDate } from '@/utils/parse-date'; + +const source = [ + 'isabelle-dev.sketis.net/phame/', + 'isabelle-dev.sketis.net/phame/blog/', + 'isabelle-dev.sketis.net/phame/blog/view/:blog/', + 'isabelle-dev.sketis.net/phame/post/', + 'isabelle-dev.sketis.net/phame/post/view/:post_id/:post_title/', +]; + +export const route: Route = { + path: '/isabelle-dev/blog/:blog', + categories: ['programming'], + example: '/sketis/isabelle-dev/blog/1', + parameters: { blog: 'name of blog (1 for NEWS; 2 for Release)' }, + description: ` +- Isabelle News: \`https://isabelle-dev.sketis.net/phame/blog/view/1/\` +- Isabelle Release: \`https://isabelle-dev.sketis.net/phame/blog/view/2/\` +`, + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source, + target: '/isabelle-dev/blog/1', + }, + { + source, + target: '/isabelle-dev/blog/2', + }, + ], + name: 'Isabelle Development Blogs', + url: 'isabelle-dev.sketis.net', + maintainers: ['Ritsuka314'], + handler: async (ctx) => { + const baseUrl = 'https://isabelle-dev.sketis.net'; + const { blog } = ctx.req.param(); + const blogName = blog === '1' ? 'News' : blog === '2' ? 'Release' : 'UNKNOWN'; + const url = `${baseUrl}/phame/blog/view/${blog}/`; + const response = await ofetch(url); + const $ = load(response); + + const items = $('.phui-document-summary-view') + .toArray() + .map((item_) => { + const item = $(item_); + const title = item.find('.remarkup-header').first(); + const subtitle = item.find('.phui-document-summary-subtitle').first(); + const date = subtitle.find('strong').first()[0].nextSibling.data.slice(4); // parse starts after ' on ' + return { + title: title.text(), + // We need an absolute URL for `link`, but `a.attr('href')` returns a relative URL. + link: `${baseUrl}${title.find('a').attr('href')}`, + description: item.find('.phui-document-summary-body').html(), + pubDate: parseDate(date), + author: subtitle.find('strong').text(), + }; + }); + + return { + title: `Isabelle ${blogName}`, + // channel link + link: url, + // each feed item + item: items, + }; + }, +}; diff --git a/lib/routes/sketis/namespace.ts b/lib/routes/sketis/namespace.ts new file mode 100644 index 000000000..9fe9ebd0e --- /dev/null +++ b/lib/routes/sketis/namespace.ts @@ -0,0 +1,6 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'Sketis | Website of Dr. Makarius Wenzel', + url: 'sketis.net', +};