64 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
let FeedParser = require('feedparser');
 | 
						|
let request = require('request');
 | 
						|
 | 
						|
module.exports.fetch = (url, callback) => {
 | 
						|
    let req = request(url);
 | 
						|
    let feedparser = new FeedParser();
 | 
						|
    let returned = false;
 | 
						|
    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) {
 | 
						|
            return req.emit('error', new Error('Bad status code'));
 | 
						|
        }
 | 
						|
 | 
						|
        req.pipe(feedparser);
 | 
						|
    });
 | 
						|
 | 
						|
    feedparser.on('error', err => {
 | 
						|
        if (returned) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        returned = true;
 | 
						|
        callback(err);
 | 
						|
    });
 | 
						|
 | 
						|
    feedparser.on('readable', () => {
 | 
						|
        let item;
 | 
						|
        while ((item = feedparser.read())) {
 | 
						|
            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
 | 
						|
            };
 | 
						|
            entries.push(entry);
 | 
						|
        }
 | 
						|
    });
 | 
						|
 | 
						|
    feedparser.on('end', () => {
 | 
						|
        if (returned) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        returned = true;
 | 
						|
        callback(null, entries);
 | 
						|
    });
 | 
						|
};
 |