diff --git a/docs/en/new-media.md b/docs/en/new-media.md index ddde6afd89..82b5783831 100644 --- a/docs/en/new-media.md +++ b/docs/en/new-media.md @@ -762,6 +762,8 @@ Compared to the official one, this feed: ## The Verge +### The Verge + Provides a better reading experience (full text articles) over the official one. diff --git a/lib/router.js b/lib/router.js index 8b311c7664..49b0260af2 100644 --- a/lib/router.js +++ b/lib/router.js @@ -878,7 +878,7 @@ router.get('/bbc/:site?/:channel?', lazyloadRouteHandler('./routes/bbc/index')); // router.get('/ft/:language/:channel?', lazyloadRouteHandler('./routes/ft/channel')); // The Verge -router.get('/verge', lazyloadRouteHandler('./routes/verge/index')); +// router.get('/verge', lazyloadRouteHandler('./routes/verge/index')); // 看雪 router.get('/pediy/topic/:category?/:type?', lazyloadRouteHandler('./routes/pediy/topic')); diff --git a/lib/routes/verge/index.js b/lib/routes/verge/index.js deleted file mode 100644 index f125d8add4..0000000000 --- a/lib/routes/verge/index.js +++ /dev/null @@ -1,88 +0,0 @@ -const got = require('@/utils/got'); -const parser = require('@/utils/rss-parser'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const feed = await parser.parseURL('https://www.theverge.com/rss/index.xml'); - - const items = await Promise.all( - feed.items.slice(0, 10).map(async (item) => { - const response = await got({ - method: 'get', - url: item.link, - }); - - const $ = cheerio.load(response.data); - - const content = $('div.c-entry-content'); - - // 处理封面图片 - - const cover = $('meta[property="og:image"]'); - - if (cover.length > 0) { - $(``).insertBefore(content[0].childNodes[0]); - } - - // 处理封面视频 - $('div.l-col__main > div.c-video-embed, div.c-entry-hero > div.c-video-embed').each((i, e) => { - const src = `https://volume.vox-cdn.com/embed/${e.attribs['data-volume-uuid']}?autoplay=false`; - - $(``).insertBefore(content[0].childNodes[0]); - }); - - // 处理封面视频 - $('div.l-col__main > div.c-video-embed--media iframe').each((i, e) => { - $(e).insertBefore(content[0].childNodes[0]); - }); - - // 处理文章图片 - content.find('figure.e-image').each((i, e) => { - let src, caption; - - // 处理 jpeg, png - if ($(e).find('picture > source').length > 0) { - src = $(e) - .find('picture > img')[0] - .attribs.srcset.match(/(?<=320w,).*?(?=520w)/g)[0] - .trim(); - } else if ($(e).find('img.c-dynamic-image').length > 0) { - // 处理 gif - src = $(e).find('span.e-image__image')[0].attribs['data-original']; - } - - // 处理 caption - if ($(e).find('span.e-image__meta').length > 0) { - caption = $(e).find('span.e-image__meta').text(); - } - - const figure = `
${caption ? `
${caption}
` : ''}
`; - - $(figure).insertBefore(e); - - $(e).remove(); - }); - - // 移除无用 DOM - content.find('aside').each((i, e) => { - $(e).remove(); - }); - - const single = { - title: item.title, - description: content.html(), - author: item.author, - pubDate: item.pubDate, - link: item.link, - }; - return Promise.resolve(single); - }) - ); - - ctx.state.data = { - title: feed.title, - link: feed.link, - description: feed.description, - item: items, - }; -}; diff --git a/lib/v2/theverge/index.js b/lib/v2/theverge/index.js new file mode 100644 index 0000000000..f251db2d1b --- /dev/null +++ b/lib/v2/theverge/index.js @@ -0,0 +1,90 @@ +const got = require('@/utils/got'); +const parser = require('@/utils/rss-parser'); +const cheerio = require('cheerio'); + +module.exports = async (ctx) => { + const feed = await parser.parseURL('https://www.theverge.com/rss/index.xml'); + + const items = await Promise.all( + feed.items.map((item) => + ctx.cache.tryGet(item.link, async () => { + const response = await got(item.link); + + const $ = cheerio.load(response.data); + + const content = $('#content'); + const body = $('.duet--article--article-body-component-container'); + + // 处理封面图片 + + const cover = $('meta[property="og:image"]'); + + if (cover.length > 0) { + $(``).insertBefore(body[0].childNodes[0]); + } + + // 处理封面视频 + $('div.l-col__main > div.c-video-embed, div.c-entry-hero > div.c-video-embed').each((i, e) => { + const src = `https://volume.vox-cdn.com/embed/${e.attribs['data-volume-uuid']}?autoplay=false`; + + $(``).insertBefore(body[0].childNodes[0]); + }); + + // 处理封面视频 + $('div.l-col__main > div.c-video-embed--media iframe').each((i, e) => { + $(e).insertBefore(body[0].childNodes[0]); + }); + + // 处理文章图片 + content.find('figure.e-image').each((i, e) => { + let src, caption; + + // 处理 jpeg, png + if ($(e).find('picture > source').length > 0) { + src = $(e) + .find('picture > img')[0] + .attribs.srcset.match(/(?<=320w,).*?(?=520w)/g)[0] + .trim(); + } else if ($(e).find('img.c-dynamic-image').length > 0) { + // 处理 gif + src = $(e).find('span.e-image__image')[0].attribs['data-original']; + } + + // 处理 caption + if ($(e).find('span.e-image__meta').length > 0) { + caption = $(e).find('span.e-image__meta').text(); + } + + const figure = `
${caption ? `
${caption}
` : ''}
`; + + $(figure).insertBefore(e); + + $(e).remove(); + }); + + const lede = $('.duet--article--lede h2:first'); + if (lede[0]) { + lede.insertBefore(body[0].childNodes[0]); + } + + // 移除无用 DOM + content.find('.duet--article--comments-join-the-conversation').remove(); + content.find('.duet--recirculation--related-list').remove(); + delete item.content; + delete item.contentSnippet; + delete item.isoDate; + + item.description = body.html(); + + return item; + }) + ) + ); + + ctx.state.data = { + title: feed.title, + link: feed.link, + description: feed.description, + item: items, + }; +}; diff --git a/lib/v2/theverge/maintainer.js b/lib/v2/theverge/maintainer.js new file mode 100644 index 0000000000..bccb53f334 --- /dev/null +++ b/lib/v2/theverge/maintainer.js @@ -0,0 +1,3 @@ +module.exports = { + '/': ['HenryQW'], +}; diff --git a/lib/v2/theverge/radar.js b/lib/v2/theverge/radar.js new file mode 100644 index 0000000000..357423e71f --- /dev/null +++ b/lib/v2/theverge/radar.js @@ -0,0 +1,13 @@ +module.exports = { + 'theverge.com': { + _name: 'The Verge', + '.': [ + { + title: 'The Verge', + docs: 'https://docs.rsshub.app/new-media.html#the-verge', + source: ['/rss/index.xml', '/'], + target: '/theverge', + }, + ], + }, +}; diff --git a/lib/v2/theverge/router.js b/lib/v2/theverge/router.js new file mode 100644 index 0000000000..7e427447c7 --- /dev/null +++ b/lib/v2/theverge/router.js @@ -0,0 +1,3 @@ +module.exports = (router) => { + router.get('/', require('./index')); +};