mailtrain/lib/feed.js

69 lines
1.7 KiB
JavaScript
Raw Normal View History

'use strict';
let FeedParser = require('feedparser');
let request = require('request');
2017-03-07 14:30:56 +00:00
let _ = require('./translate')._;
let util = require('util');
module.exports.fetch = (url, callback) => {
let req = request(url);
let feedparser = new FeedParser();
let returned = false;
2016-05-03 09:36:06 +00:00
let entries = [];
req.setHeader('user-agent', 'Mailtrain');
req.setHeader('accept', 'text/html,application/xhtml+xml');
req.on('error', err => {
if (returned) {
return;
}
returned = true;
callback(err);
});
req.on('response', res => {
if (returned) {
return;
}
if (res.statusCode !== 200) {
2017-03-07 14:30:56 +00:00
return req.emit('error', new Error(util.format(_('Bad status code %s'), res.statusCode)));
}
req.pipe(feedparser);
});
feedparser.on('error', err => {
if (returned) {
return;
}
returned = true;
callback(err);
});
feedparser.on('readable', () => {
let item;
while ((item = feedparser.read())) {
2016-05-03 09:36:06 +00:00
let entry = {
title: item.title,
date: item.date || item.pubdate || item.pubDate || new Date(),
guid: item.guid || item.link,
link: item.link,
content: item.description || item.summary,
summary: item.summary || item.description,
2017-05-03 21:13:05 +00:00
image_url: item.image.url
2016-05-03 09:36:06 +00:00
};
entries.push(entry);
}
});
2016-05-03 09:36:06 +00:00
feedparser.on('end', () => {
if (returned) {
return;
}
returned = true;
callback(null, entries);
});
};