rsshub
Version:
Make RSS Great Again!
128 lines (114 loc) • 4.46 kB
text/typescript
import { Route } from '@/types';
import got from '@/utils/got';
import { load } from 'cheerio';
import { parseDate } from '@/utils/parse-date';
import { art } from '@/utils/render';
import path from 'node:path';
export const route: Route = {
path: '/:category?',
radar: [
{
source: ['xyzrank.com/'],
target: '',
},
],
name: 'Unknown',
maintainers: [],
handler,
url: 'xyzrank.com/',
};
async function handler(ctx) {
const category = ctx.req.param('category') ?? '';
const rootUrl = 'https://xyzrank.com';
const currentUrl = `${rootUrl}/#/${category}`;
let response = await got({
method: 'get',
url: rootUrl,
});
const $ = load(response.data);
response = await got({
method: 'get',
url: response.data.match(/<script type="module" crossorigin src="(.*?)"><\/script>/)[1],
});
const matches = response.data.match(/pI="(.*?)",gI="(.*?)",mI="(.*?)",_I="(.*?)";var/);
const categories = {
'': {
url: matches[3],
title: '热门节目',
id: 'hot-episodes',
type: 'episodes',
},
'hot-podcasts': {
url: matches[1],
title: '热门播客',
id: 'full',
type: 'podcasts',
},
'hot-episodes-new': {
url: matches[4],
title: '新锐节目',
id: 'hot-episodes-new',
type: 'episodes',
},
'new-podcasts': {
url: matches[2],
title: '新锐播客',
id: 'new-podcasts',
type: 'podcasts',
},
};
response = await got({
method: 'get',
url: categories[category].url,
});
const type = categories[category].type;
const items = response.data.data[type].slice(0, ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit')) : 250).map((item, index) => ({
title: `#${index + 1} ${item.title ?? item.name}`,
category: [item.primaryGenreName],
author: item.authorsText,
link: `${item.link ?? item.links[0].url}${item.trackCount ? `#${item.trackCount}` : ''}`,
pubDate: parseDate(item.postTime ?? item.lastReleaseDate),
description: art(path.join(__dirname, 'templates/description.art'), {
logo: item.logoURL,
items:
type === 'podcasts'
? {
'#': index + 1,
播客电台: item.name,
主持: item.authorsText,
分类: item.primaryGenreName,
更新频率: `${(item.avgUpdateFreq / 24).toFixed(1)}天`,
最近更新: `${item.lastReleaseDateDayCount.toFixed(1)}天前`,
总集数: item.trackCount,
平均时长: `${item.avgDuration}′`,
平均播放量: item.avgPlayCount,
平均评论量: item.avgCommentCount,
千播互动量: (item.avgInteractIndicator * 1000).toFixed(0),
平均打开率: `${(item.avgOpenRate * 100).toFixed(1)}%`,
小宇宙: item.links[0].url,
'Apple Podcasts': item.links[1].url,
官方网站: item.links[2].url,
'RSS 订阅': item.links[3].url,
}
: {
'#': index + 1,
节目标题: item.title,
播客电台: item.podcastName,
播放量: item.playCount,
评论量: item.commentCount,
互动率: `${((item.commentCount / item.playCount) * 100).toFixed(1)}%`,
打开率: `${(item.openRate * 100).toFixed(1)}%`,
时长: `${item.duration}′`,
发布时间: item.postTime,
分类: item.primaryGenreName,
链接: item.link,
},
}),
}));
return {
title: `${$('title').text()} - ${categories[category].title}`,
link: currentUrl,
item: items,
description: $('meta[property="og:description"]').attr('content'),
};
}