144 lines
3.9 KiB
JavaScript
144 lines
3.9 KiB
JavaScript
const FeedMe = require('feedme');
|
|
const fecha = require('fecha');
|
|
const request = require('request');
|
|
const http = require('http');
|
|
|
|
const { reduceArticle, reduceArticleV2 } = require('./reducers/euronews');
|
|
|
|
const logger = require('log4js').getLogger('Euronews');
|
|
logger.level = 'debug';
|
|
|
|
module.exports = {
|
|
'getEuroNews': doGetEuroNews,
|
|
'render': render,
|
|
'getArticle' : doGetArticle
|
|
|
|
};
|
|
|
|
const headers = {};
|
|
const lastGood = {};
|
|
|
|
class Template {
|
|
constructor(item) {
|
|
// "pubdate": "Tue, 06 Feb 2018 17:05:00 +0100",
|
|
const pubdateSrc = fecha.parse(item.pubdate, 'ddd, DD MMM YYYY HH:mm:SS ZZ');
|
|
const pubdate = fecha.format(pubdateSrc, 'dddd MMMM Do, YYYY');
|
|
const description = item.description.replace(/(<script(\s|\S)*?<\/script>)|(<style(\s|\S)*?<\/style>)|(<!--(\s|\S)*?-->)|(<\/?(\s|\S)*?>)/g, '');
|
|
this.data = `<article>
|
|
<header>
|
|
<a href="${item.guid.text}">${item.title}</a>
|
|
<time class="published">${pubdate}</time>
|
|
</header>
|
|
<p class="description">${description}</p>
|
|
</article>`;
|
|
}
|
|
|
|
toString() {
|
|
return this.data;
|
|
}
|
|
}
|
|
|
|
function doGetEuroNews() {
|
|
return new Promise((resolve, reject) => {
|
|
logger.info('doGetEuroNews:Retrieving Euronews Headlines..');
|
|
|
|
// http://feeds.feedburner.com/euronews/en/home/
|
|
// http://feeds.feedburner.com/euronews/en/news/
|
|
const options = {
|
|
'hostname': 'feeds.feedburner.com',
|
|
'path': '/euronews/en/home/',
|
|
'method': 'GET',
|
|
'headers': headers
|
|
};
|
|
|
|
// http.get('http://feeds.feedburner.com/euronews/en/news/', (res) => {
|
|
http.get(options, (res) => {
|
|
const { statusCode } = res;
|
|
const contentType = res.headers['content-type'];
|
|
const reqLastModified = res.headers['last-modified'];
|
|
|
|
logger.debug(res.headers);
|
|
let error;
|
|
|
|
logger.debug('contentType', contentType);
|
|
if (statusCode !== 200 && statusCode !== 304)
|
|
error = new Error('Request Failed.\n' +
|
|
`Status Code: ${statusCode}`);
|
|
|
|
else if (!/^text\/xml/.test(contentType) && statusCode === 200)
|
|
error = new Error('Invalid content-type.\n' +
|
|
`Expected text/xml but received ${contentType}`);
|
|
|
|
if (error) {
|
|
logger.error(error.message);
|
|
// consume response data to free up memory
|
|
res.resume();
|
|
|
|
return reject(error);
|
|
}
|
|
|
|
if ( statusCode === 200) {
|
|
headers['If-Modified-Since'] = reqLastModified;
|
|
const parser = new FeedMe(true);
|
|
res.pipe(parser);
|
|
parser.on('end', () => {
|
|
lastGood.page = parser.done();
|
|
logger.info('Euronews page cached');
|
|
// return resolve(parser.done());
|
|
return resolve(lastGood.page);
|
|
});
|
|
}
|
|
else if (statusCode === 304) {
|
|
logger.info('Euronews not changed');
|
|
|
|
return resolve(lastGood.page);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function doGetArticle(guid = '') {
|
|
const splitURL = /([--:\w?@%&+~#=]*\.[a-z]{2,4}\/{0,2})((?:[?&](?:\w+)=(?:\w+))+|[--:\w?@%&+~#=]+)?/g;
|
|
const url = splitURL.exec(decodeURI(guid));
|
|
logger.debug('Converting:', guid);
|
|
// logger.debug('Split', url);
|
|
|
|
const ampURL = `${url[1]}amp/${url[2]}`;
|
|
|
|
logger.debug('ampURL', ampURL);
|
|
|
|
return new Promise(function(resolve, reject) {
|
|
request(ampURL, function(err, resp, body) {
|
|
if (err)
|
|
// Logger.error(err);
|
|
return reject(err);
|
|
// Throw err;
|
|
|
|
const output = reduceArticleV2(body);
|
|
|
|
logger.debug(JSON.stringify(output));
|
|
|
|
return resolve(output);
|
|
}, function(error, response, body) {
|
|
if (response.statusCode !== 200) {
|
|
logger.error(response.statusCode);
|
|
logger.error(body);
|
|
|
|
return reject(error);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function render(data) {
|
|
logger.debug('Rendering euronews');
|
|
// logger.debug(JSON.stringify(data));
|
|
|
|
const html = [];
|
|
const items = data.slice(0, 10);
|
|
for (const item of items)
|
|
html.push(new Template(item).toString());
|
|
|
|
return(html.join(''));
|
|
}
|