Skip to content

Instantly share code, notes, and snippets.

@StevenMcD
Created October 21, 2012 19:41
Show Gist options
  • Save StevenMcD/3928219 to your computer and use it in GitHub Desktop.
Save StevenMcD/3928219 to your computer and use it in GitHub Desktop.
NodeJS - Sequential tasking - Random RSS feed selector
var path = require('path'),
fs = require('fs'),
request = require('request'),
htmlparser = require('htmlparser'),
tasks = [];
function getRssFeeds(){
var configFileName = "./rss_feeds.txt";
path.exists(configFileName, function(exists){
if(!exists){
next('Create a list of RSS Feeds in the file ./rss_feeds.txt');
} else {
next(false, configFileName);
}
});
};
function selectRandomFeed(configFileName){
fs.readFile(configFileName, function(err, feedList){
if(err){
next(err.message);
} else {
feedList = feedList.toString().replace(/^\s+|\s+$/g, '').split("\n");
var random = Math.floor(Math.random() * feedList.length);
next(false, feedList[random]);
}
});
};
function requestFeed(feedUrl){
request({uri: feedUrl}, function(err, response, body){
if(err){
next(err.message);
} else if(response.statusCode == 200){
next(false, body);
} else {
next('Abnormal request status code');
}
});
};
function showRssItem(rss){
var handler = new htmlparser.RssHandler();
var parser = new htmlparser.Parser(handler);
parser.parseComplete(rss);
if(handler.dom.items.length){
var item = handler.dom.items.shift();
console.log(item.title);
console.log(item.link);
} else {
next('No RSS items found');
}
};
function next(err, result){
if(err) throw new Error(err);
var currentTask = tasks.shift();
if(currentTask){
currentTask(result);
}
};
tasks.push(getRssFeeds);
tasks.push(selectRandomFeed);
tasks.push(requestFeed);
tasks.push(showRssItem);
next();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment