diff --git a/exec/load/rss-atom.js b/exec/load/rss-atom.js new file mode 100644 index 0000000000000000000000000000000000000000..cf8b055c9028c3092dd1325ec751370d47a3e878 --- /dev/null +++ b/exec/load/rss-atom.js @@ -0,0 +1,258 @@ +load("http.js"); + +var getFeed = function(url) { + var httpRequest = new HTTPRequest(); + var response = httpRequest.Get(url); + if( + typeof response == "undefined" + || + response === null + || + response == "" + ) { + throw "Empty response"; + } + response = response.replace(/^<\?xml.*\?>/g, ""); + response = response.replace(/<feed.*>/g, "<feed>"); + response = response.replace(/<\/?rss.*>/g, ""); + return new XML(response); +} + +var objectsMatch = function(obj1, obj2) { + for(var property in obj1) { + if(!obj2.hasOwnProperty(property) || obj1[property] != obj2[property]) + return false; + } + for(var property in obj2) { + if(!obj1.hasOwnProperty(property)) + return false; + } + return true; +} + +var RSS = function(url) { + + var updated = false; + this.__defineGetter__( + "updated", + function() { + var ret = updated; + if(updated) + updated = false; + return ret; + } + ); + + this.properties = { + title : "", + link : "", + description : "", + language : "", + copyright : "", + managingEditor : "", + webMaster : "", + pubDate : "", + lastBuildDate : "", + category : "", + generator : "", + docs : "", + cloud : "", + ttl : "", + image : "", + rating : "", + textInput : "", + skipHours : "", + skipDays : "", + url : (typeof url == "undefined") ? "" : url + }; + + var Item = function(xmlObj) { + + this.properties = { + title : "", + link : "", + description : "", + author : "", + category : "", + comments : "", + enclosure : "", + guid : "", + pubDate : "", + source : "" + }; + + for each(var element in xmlObj) { + if(element.name() == "pubDate") { + var d = new Date(element.toString()); + this.properties[element.name()] = d.getTime() * .001; + } else { + this.properties[element.name()] = element; + } + } + + if(this.properties.title == "" && this.properties.description == "") + throw "Invalid feed item"; + + } + + this.items = []; + + this.load = function() { + if(this.properties.url == "") + throw "Feed URL not supplied"; + var feed = getFeed(this.properties.url); + for each(var element in feed) { + if(element.name() == "item") { + var item = new Item(element); + var add = true; + for(var i = 0; i < this.items.length; i++) { + if(!objectsMatch(this.items[i].properties, item.properties)) + continue; + add = false; + break; + } + if(add) { + this.items.push(item); + updated = true; + } + } else { + this.properties[element.name()] = element; + } + } + + if( + this.properties.title == "" + || + this.properties.link == "" + || + this.properties.description == "" + ) { + throw "Invalid feed"; + } + } + +} + +var Atom = function(url) { + + var updated = false; + this.__defineGetter__( + "updated", + function() { + var ret = updated; + if(updated) + updated = false; + return ret; + } + ); + + this.properties = { + id : "", + title : "", + updated : "", + author : "", + link : "", + category : "", + contributor : "", + generator : "", + icon : "", + logo : "", + rights : "", + subtitle : "", + url : (typeof url == "undefined") ? "" : url + }; + + var toTimestamp = function(datestr) { + var yy = datestr.substring(0,4); + var mo = datestr.substring(5,7); + var dd = datestr.substring(8,10); + var hh = datestr.substring(11,13); + var mi = datestr.substring(14,16); + var ss = datestr.substring(17,19); + var tzs = datestr.substring(19,20); +// var tzhh = datestr.substring(20,22); +// var tzmi = datestr.substring(23,25); + var myutc = Date.UTC(yy-0,mo-1,dd-0,hh-0,mi-0,ss-0); +// var tzos = (tzs+(tzhh * 60 + tzmi * 1)) * 60000; +// var d = new Date(myutc-tzos); + var d = new Date(myutc); + return d.getTime() * .001; + } + + var Entry = function(xmlObj) { + + this.properties = { + id : "", + title : "", + updated : "", + author : "", + content : "", + link : "", + summary : "", + category : "", + contributor : "", + published : "", + source : "", + rights : "" + }; + + for each(var element in xmlObj) { + if(element.name() == "link" && element.hasOwnProperty("@href")) + this.properties[element.name()] = element.@href; + else if(element.name() == "updated" || element.name() == "published") + this.properties[element.name()] = toTimestamp(element.toString()); + else + this.properties[element.name()] = element; + } + + if( + this.properties.id == "" + || + this.properties.title == "" + || + this.properties.description == "" + ) { + throw "Invalid feed item"; + } + + } + + this.entries = []; + + this.load = function() { + if(typeof this.properties.url == "undefined") + throw "Feed URL not supplied"; + var feed = getFeed(this.properties.url); + for each(var element in feed) { + if(element.name() == "entry") { + var entry = new Entry(element); + var add = true; + for(var e = 0; e < this.entries.length; e++) { + if(!objectsMatch(this.entries[e].properties, entry.properties)) + continue; + add = false; + break; + } + if(add) { + this.entries.push(new Entry(element)); + updated = true; + } + } else if(element.name() == "updated") { + this.properties[element.name()] = toTimestamp(element); + } else { + this.properties[element.name()] = element; + } + } + + if( + this.properties.id == "" + || + this.properties.title == "" + || + this.properties.updated == "" + ) { + throw "Invalid feed"; + } + } + +} \ No newline at end of file