rsshub
Version:
Make RSS Great Again!
123 lines (107 loc) • 3.5 kB
text/typescript
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;
}