dans-rss-to-json
Version:
Rss to Json: RSS and Atom feed generator for Node.js
110 lines (97 loc) • 3.75 kB
JavaScript
// Invoke 'strict' JavaScript mode
;
var util = require('util'),
xml2js = require('xml2js'),
request = require('request');
module.exports = {
load: function(url, callback){
var $ = this;
request({
url: url,
headers: {
//'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0',
'User-Agent': 'request',
accept: 'text/html,application/xhtml+xml',
'Cache-Control': 'no-cache'
},
timeout: 5000,
pool: false,
followRedirect: true
}, function (error, response, xml) {
if (!error && response.statusCode == 200) {
var parser = new xml2js.Parser({trim: false, normalize: true, mergeAttrs: true});
parser.addListener("error", function(err) {
callback(err, null);
});
parser.parseString(xml, function (err, result) {
if(err !== null) callback(err, null);
var rss = $.parser(result);
callback(null, rss);
//console.log(JSON.stringify(result.rss.channel));
});
}else {
if(error)
{
callback("Bad Status Code", null);
} else {
callback("Status code - " + response.statusCode, null);
}
}
});
},
parser: function(json){
var channel = json.rss.channel;
var rss = {items:[]};
if(util.isArray(json.rss.channel))
channel = json.rss.channel[0];
if (channel.title) {
rss.title = channel.title[0];
}
if (channel.description) {
rss.description = channel.description[0];
}
if (channel.link) {
rss.url = channel.link[0];
}
if (channel.item) {
if (!util.isArray(channel.item)) {
channel.item = [channel.item];
}
channel.item.forEach(function(val){
var obj = {};
obj.title = !util.isNullOrUndefined(val.title)?val.title[0]:'';
obj.description = !util.isNullOrUndefined(val.description)?val.description[0]:'';
obj.url = obj.link = !util.isNullOrUndefined(val.link)?val.link[0]:'';
if (val.pubDate) {
//lets try basis js date parsing for now
obj.created = Date.parse(val.pubDate[0]);
}
if (val['media:content']) {
obj.media = val.media || {};
obj.media.content = val['media:content'];
}
if (val['media:thumbnail']) {
obj.media = val.media || {};
obj.media.thumbnail = val['media:thumbnail'];
}
if(val.enclosure){
obj.enclosures = [];
if(!util.isArray(val.enclosure))
val.enclosure = [val.enclosure];
val.enclosure.forEach(function(enclosure){
var enc = {};
for (var x in enclosure) {
enc[x] = enclosure[x][0];
}
obj.enclosures.push(enc);
});
}
rss.items.push(obj);
});
}
return rss;
},
read: function(url, callback){
return this.load(url, callback);
}
};