rsshub
Version:
Make RSS Great Again!
75 lines (69 loc) • 2.39 kB
text/typescript
import { Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import path from 'node:path';
import { art } from '@/utils/render';
import { config } from '@/config';
import InvalidParameterError from '@/errors/types/invalid-parameter';
export const route: Route = {
path: '/news/:category?',
categories: ['traditional-media'],
example: '/i-cable/news',
parameters: { category: '分類,默認為新聞資訊' },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['www.i-cable.com'],
target: '/news',
},
{
source: ['www.i-cable.com/category/:category'],
target: '/news/:category',
},
],
name: '新聞',
maintainers: ['quiniapiezoelectricity'],
handler,
url: 'www.i-cable.com/',
description: `
::: tip
分類只可用分類名稱,如:新聞資訊/港聞
:::`,
};
async function handler(ctx) {
const category = ctx.req.param('category') ?? '新聞資訊';
const limit = ctx.req.query('limit') ?? 20;
const root = 'https://www.i-cable.com/wp-json/wp/v2';
const response = await cache.tryGet(`${root}/categories?slug=${category}`, async () => await got(`${root}/categories?slug=${category}`), config.cache.routeExpire, false);
if (response.data.length < 1) {
throw new InvalidParameterError(`Invalid Category: ${category}`);
}
const metadata = response.data[0];
const list = await got(`${root}/posts?_embed=1&categories=${metadata.id}&per_page=${limit}`);
const items = list.data.map((item) => {
const description = art(path.join(__dirname, 'templates/description.art'), {
media: item._embedded['wp:featuredmedia'] ?? [],
content: item.content.rendered,
});
return {
title: item.title.rendered,
link: item.link,
pubDate: item.date_gmt,
description,
category: item._embedded['wp:term'][0].map((term) => term.name) ?? [],
};
});
return {
title: `有線新聞 - ${metadata.name}`,
description: metadata.description,
link: metadata.link,
item: items,
};
}