RSSHub/lib/v2/ekantipur/issue.js

65 lines
2.2 KiB
JavaScript

// Require necessary modules
const got = require('@/utils/got'); // a customised got
const cheerio = require('cheerio'); // an HTML parser with a jQuery-like API
module.exports = async (ctx) => {
// Your logic here
// Defining base URL
const baseUrl = 'https://ekantipur.com';
// Retrive the channel parameter
const { channel = 'news' } = ctx.params;
// Fetches content of the requested channel
const { data: response } = await got(`${baseUrl}/${channel}`);
const $ = cheerio.load(response);
// Retrive articles
const list = $('article.normal')
// We use the `toArray()` method to retrieve all the DOM elements selected as an array.
.toArray()
// We use the `map()` method to traverse the array and parse the data we need from each element.
.map((item) => {
item = $(item);
const a = item.find('a').first();
return {
title: a.text(),
// We need an absolute URL for `link`, but `a.attr('href')` returns a relative URL.
link: `${baseUrl}${a.attr('href')}`,
author: item.find('div.author').text(),
category: channel,
};
});
const items = await Promise.all(
list.map((item) =>
ctx.cache.tryGet(item.link, async () => {
const { data: response } = await got(item.link);
const $ = cheerio.load(response);
// Remove sponsor elements
$('a.static-sponsor').remove();
$('div.ekans-wrapper').remove();
// Fetch title from the article page
item.title = $('h1.eng-text-heading').text();
// Fetch article content from the article page
item.description = $('div.current-news-block').first().html();
// Every property of a list item defined above is reused here
// and we add a new property 'description'
return item;
})
)
);
ctx.state.data = {
// channel title
title: `Ekantipur - ${channel}`,
// channel link
link: `${baseUrl}/${channel}`,
// each feed item
item: items,
};
};