mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-09-21 12:49:53 +08:00
93 lines
3.1 KiB
JavaScript
93 lines
3.1 KiB
JavaScript
const got = require('@/utils/got');
|
|
const parser = require('@/utils/rss-parser');
|
|
const cheerio = require('cheerio');
|
|
const utils = require('./utils');
|
|
|
|
module.exports = async (ctx) => {
|
|
let feed, title, link;
|
|
|
|
// 为了向下兼容,这里 site 对应的是中文网文档中的 lang,英文网文档中的 channel
|
|
// 英文网不会用到 channel
|
|
const { site, channel } = ctx.params;
|
|
|
|
if (site) {
|
|
switch (site.toLowerCase()) {
|
|
case 'chinese':
|
|
title = 'BBC News 中文网';
|
|
|
|
if (!channel) {
|
|
feed = await parser.parseURL('https://www.bbc.co.uk/zhongwen/simp/index.xml');
|
|
} else {
|
|
feed = await parser.parseURL(`https://www.bbc.co.uk/zhongwen/simp/${channel}/index.xml`);
|
|
}
|
|
break;
|
|
|
|
case 'traditionalchinese':
|
|
title = 'BBC News 中文網';
|
|
|
|
if (!channel) {
|
|
feed = await parser.parseURL('https://www.bbc.co.uk/zhongwen/trad/index.xml');
|
|
} else {
|
|
feed = await parser.parseURL(`https://www.bbc.co.uk/zhongwen/trad/${channel}/index.xml`);
|
|
}
|
|
link = 'https://www.bbc.com/zhongwen/trad';
|
|
break;
|
|
|
|
// default to bbc.com
|
|
default:
|
|
feed = await parser.parseURL(`https://feeds.bbci.co.uk/news/${site.split('-').join('/')}/rss.xml`);
|
|
title = `BBC News ${site}`;
|
|
link = `https://www.bbc.co.uk/news/${site.split('-').join('/')}`;
|
|
break;
|
|
}
|
|
} else {
|
|
feed = await parser.parseURL('https://feeds.bbci.co.uk/news/rss.xml');
|
|
title = 'BBC News Top Stories';
|
|
link = 'https://www.bbc.co.uk/news';
|
|
}
|
|
|
|
const items = await Promise.all(
|
|
feed.items.map((item) =>
|
|
ctx.cache.tryGet(item.link, async () => {
|
|
const response = await got({
|
|
method: 'get',
|
|
url: item.link,
|
|
});
|
|
|
|
const $ = cheerio.load(response.data);
|
|
|
|
let description;
|
|
|
|
if (response.request.options.url.pathname.startsWith('/news/av')) {
|
|
description = item.content;
|
|
} else {
|
|
description = utils.ProcessFeed($);
|
|
}
|
|
|
|
let section = 'sport';
|
|
const urlSplit = item.link.split('/');
|
|
const sectionSplit = urlSplit[urlSplit.length - 1].split('-');
|
|
if (sectionSplit.length > 1) {
|
|
section = sectionSplit[0];
|
|
}
|
|
section = section[0].toUpperCase() + section.slice(1);
|
|
|
|
return {
|
|
title: `[${section}] ${item.title}`,
|
|
description,
|
|
pubDate: item.pubDate,
|
|
link: item.link,
|
|
};
|
|
})
|
|
)
|
|
);
|
|
|
|
ctx.state.data = {
|
|
title,
|
|
link,
|
|
image: 'https://www.bbc.com/favicon.ico',
|
|
description: title,
|
|
item: items,
|
|
};
|
|
};
|