forked from DIYgod/RSSHub
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Create a new route for Grub Street. (DIYgod#4760)
- Loading branch information
1 parent
ec383ae
commit 4c95164
Showing
4 changed files
with
94 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
const utils = require('./utils'); | ||
|
||
module.exports = async (ctx) => { | ||
const url = `https://www.grubstreet.com/_components/newsfeed/instances/grubstreet-index@published`; | ||
const title = `Grub Street`; | ||
const description = `New York Magazine's Food and Restaurant Blog`; | ||
|
||
ctx.state.data = await utils.getData(ctx, url, title, description); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
const got = require('@/utils/got'); | ||
const cheerio = require('cheerio'); | ||
|
||
async function load(link) { | ||
const response = await got.get(link); | ||
const $ = cheerio.load(response.data); | ||
|
||
const description = $('div.article-content'); | ||
|
||
// remove the content that we don't want to show | ||
description.find('aside.related').remove(); | ||
description.find('aside.article-details_heading-with-paragraph').remove(); | ||
description.find('section.package-list').remove(); | ||
description.find('div.source-links h2').remove(); | ||
description.find('div.source-links svg').remove(); | ||
description.find('div.mobile-secondary-area').remove(); | ||
description.find('aside.newsletter-flex-text').remove(); | ||
|
||
return { | ||
description: description.html(), | ||
}; | ||
} | ||
|
||
async function ProcessFeed(list, caches) { | ||
return await Promise.all( | ||
list.map(async (item) => { | ||
const itemUrl = item.canonicalUrl; | ||
|
||
let bylineString = ''; | ||
if (item.byline) { | ||
const byline = item.byline[0]; | ||
const bylineNames = byline.names.map((name) => name.text); | ||
const bylineNamesString = bylineNames.join(', '); | ||
|
||
bylineString = 'by ' + bylineNamesString; | ||
} | ||
|
||
const single = { | ||
title: item.plaintextPrimaryHeadline, | ||
link: itemUrl, | ||
author: bylineString, | ||
guid: itemUrl, | ||
pubDate: item.date, | ||
}; | ||
|
||
const other = await caches.tryGet(itemUrl, async () => await load(itemUrl)); | ||
|
||
return Promise.resolve(Object.assign({}, single, other)); | ||
}) | ||
); | ||
} | ||
|
||
const getData = async (ctx, url, title, description) => { | ||
const response = await got({ | ||
method: 'get', | ||
url: url, | ||
headers: { | ||
Referer: url, | ||
}, | ||
}); | ||
|
||
const data = response.data; | ||
|
||
// limit the list to only 25 articles, to make sure that load times remain reasonable | ||
const list = data.articles.slice(0, 25); | ||
const result = await ProcessFeed(list, ctx.cache); | ||
|
||
return { | ||
title: title, | ||
link: url, | ||
description: description, | ||
item: result, | ||
}; | ||
}; | ||
|
||
module.exports = { | ||
getData, | ||
}; |