2015-06-13 19:46:24 +02:00
module . exports = function ( RED ) {
"use strict" ;
var FeedParser = require ( "feedparser" ) ;
var request = require ( "request" ) ;
2015-10-11 22:05:55 +02:00
var url = require ( 'url' ) ;
2015-06-13 19:46:24 +02:00
function FeedParseNode ( n ) {
RED . nodes . createNode ( this , n ) ;
this . url = n . url ;
this . interval = ( parseInt ( n . interval ) || 15 ) * 60000 ;
var node = this ;
this . interval _id = null ;
this . seen = { } ;
2015-10-11 22:05:55 +02:00
var parsedUrl = url . parse ( this . url ) ;
if ( ! ( parsedUrl . host || ( parsedUrl . hostname && parsedUrl . port ) ) && ! parsedUrl . isUnix ) {
this . error ( RED . _ ( "feedparse.errors.invalidurl" ) ) ;
} else {
2015-06-13 19:46:24 +02:00
var getFeed = function ( ) {
var req = request ( node . url , { timeout : 10000 , pool : false } ) ;
//req.setMaxListeners(50);
//req.setHeader('user-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36');
2015-09-12 22:31:11 +02:00
//req.setHeader('accept', 'text/html,application/xhtml+xml');
2015-06-13 19:46:24 +02:00
var feedparser = new FeedParser ( ) ;
req . on ( 'error' , function ( err ) { node . error ( err ) ; } ) ;
req . on ( 'response' , function ( res ) {
2015-09-12 22:31:11 +02:00
if ( res . statusCode != 200 ) { node . warn ( RED . _ ( "feedparse.errors.badstatuscode" ) + " " + res . statusCode ) ; }
2015-06-13 19:46:24 +02:00
else { res . pipe ( feedparser ) ; }
} ) ;
feedparser . on ( 'error' , function ( error ) { node . error ( error ) ; } ) ;
feedparser . on ( 'readable' , function ( ) {
var stream = this , article ;
2015-06-16 15:38:36 +02:00
while ( article = stream . read ( ) ) { // jshint ignore:line
2015-06-13 19:46:24 +02:00
if ( ! ( article . guid in node . seen ) || ( node . seen [ article . guid ] !== 0 && node . seen [ article . guid ] != article . date . getTime ( ) ) ) {
node . seen [ article . guid ] = article . date ? article . date . getTime ( ) : 0 ;
var msg = {
topic : article . origlink || article . link ,
payload : article . description ,
article : article
} ;
node . send ( msg ) ;
}
}
} ) ;
feedparser . on ( 'meta' , function ( meta ) { } ) ;
feedparser . on ( 'end' , function ( ) { } ) ;
} ;
this . interval _id = setInterval ( function ( ) { getFeed ( ) ; } , node . interval ) ;
getFeed ( ) ;
}
this . on ( "close" , function ( ) {
if ( this . interval _id != null ) {
clearInterval ( this . interval _id ) ;
}
} ) ;
}
RED . nodes . registerType ( "feedparse" , FeedParseNode ) ;
}