UNPKG

rsshub

Version:
128 lines (114 loc) 4.46 kB
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'), }; }