Files
RSSHub/lib/v2/bbc/index.js
T
qyx596 54f7b4591e fix(route): Fix the BBC Chinese 404 page not found. (#13205)
* fix: BBC News rss fetching error

* refactor: migrate to v2

---------
2023-09-05 23:51:05 +08:00

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,
};
};