UNPKG

rsshub

Version:
123 lines (107 loc) 3.5 kB
import { Route, ViewType } from '@/types'; import { parseDate } from '@/utils/parse-date'; import got from '@/utils/got'; import { load } from 'cheerio'; import { art } from '@/utils/render'; import path from 'node:path'; export const route: Route = { path: '/news/:language', categories: ['design'], view: ViewType.Pictures, example: '/jimmyspa/news/tw', parameters: { language: { description: '语言', options: [ { value: 'tw', label: '臺灣正體' }, { value: 'en', label: 'English' }, { value: 'jp', label: '日本語' }, ], }, }, radar: [ { source: ['www.jimmyspa.com/:language/News'], }, ], name: 'News', description: ` | language | Description | | --- | --- | | tw | 臺灣正體 | | en | English | | jp | 日本語 | `, maintainers: ['FYLSen'], handler, }; async function handler(ctx) { const language = ctx.req.param('language'); const rootUrl = 'https://www.jimmyspa.com'; const currentUrl = new URL(`/${language}/News/Ajax/changeList?year=&keyword=&categoryId=0&page=1`, rootUrl).href; const responseData = await got(currentUrl); const $ = load(responseData.data.view); const items = $('ul#appendNews li.card_block') .toArray() .map((item) => { const $$ = load(item); const title = $$('a.news_card .info_wrap h3').text(); const image = $$('a.news_card .card_img img').prop('src') || ''; const link = $$('a.news_card').prop('data-route'); const itemdate = $$('a.news_card div.date').html() || ''; const pubDate = convertHtmlDateToStandardFormat(itemdate.toString()); const description = art(path.join(__dirname, 'templates/description.art'), { images: image ? [ { src: image, alt: title, }, ] : undefined, description: $$('a.news_card .info_wrap p').text(), }); return { title, link, description, pubDate, content: { html: description, text: title, }, }; }); return { title: `幾米 - 最新消息(${language})`, link: `${rootUrl}/${language}/News`, allowEmpty: true, item: items, }; } function convertHtmlDateToStandardFormat(htmlContent: string): Date | undefined { const dateRegex = /<p>(\d{1,2})<\/p>\s*<p>(\d{1,2})\s*\.\s*([A-Za-z]{3})<\/p>/; const match = htmlContent.match(dateRegex); if (match) { const day = Number.parseInt(match[1]) + 1; const year = match[2]; const monthAbbreviation = match[3]; const monthMapping: { [key: string]: string } = { Jan: '01', Feb: '02', Mar: '03', Apr: '04', May: '05', Jun: '06', Jul: '07', Aug: '08', Sep: '09', Oct: '10', Nov: '11', Dec: '12', }; const month = monthMapping[monthAbbreviation] || ''; return parseDate(`20${year}-${month}-${day}`); } return undefined; }