RSSHub/lib/v2/bbc/index.js

93 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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