/* Magic Mirror * Node Helper: Newsfeed * * By Michael Teeuw http://michaelteeuw.nl * MIT Licensed. */ var NodeHelper = require("node_helper"); var validUrl = require("valid-url"); var Fetcher = require("./fetcher.js"); module.exports = NodeHelper.create({ // Subclass start method. start: function() { console.log("Starting module: " + this.name); this.fetchers = []; }, // Subclass socketNotificationReceived received. socketNotificationReceived: function(notification, payload) { if (notification === "ADD_FEED") { this.createFetcher(payload.feed, payload.config); return; } }, /* createFetcher(feed, config) * Creates a fetcher for a new feed if it doesn't exist yet. * Otherwise it reuses the existing one. * * attribute feed object - A feed object. * attribute config object - A configuration object containing reload interval in milliseconds. */ createFetcher: function(feed, config) { var self = this; var url = feed.url || ""; var encoding = feed.encoding || "UTF-8"; var reloadInterval = feed.reloadInterval || config.reloadInterval || 5 * 60 * 1000; if (!validUrl.isUri(url)) { self.sendSocketNotification("INCORRECT_URL", url); return; } var fetcher; if (typeof self.fetchers[url] === "undefined") { console.log("Create new news fetcher for url: " + url + " - Interval: " + reloadInterval); fetcher = new Fetcher(url, reloadInterval, encoding); fetcher.onReceive(function(fetcher) { self.broadcastFeeds(); }); fetcher.onError(function(fetcher, error) { self.sendSocketNotification("FETCH_ERROR", { url: fetcher.url(), error: error }); }); self.fetchers[url] = fetcher; } else { console.log("Use existing news fetcher for url: " + url); fetcher = self.fetchers[url]; fetcher.setReloadInterval(reloadInterval); fetcher.broadcastItems(); } fetcher.startFetch(); }, /* broadcastFeeds() * Creates an object with all feed items of the different registered feeds, * and broadcasts these using sendSocketNotification. */ broadcastFeeds: function() { var feeds = {}; for (var f in this.fetchers) { feeds[f] = this.fetchers[f].items(); } this.sendSocketNotification("NEWS_ITEMS", feeds); } });