gcalfilter
Version:
This filters the private ICS feed from Google Calendar based on extendedProperties
85 lines (66 loc) • 2.36 kB
JavaScript
var vcal = require('vcal');
var NodePie = require('nodepie');
var request = require('request');
var google_base_url = "https://www.google.com/calendar/";
var calendar_id = null;
var calendar_secret = null;
exports.set_calendar_id = function(id) {
calendar_id = id;
}
exports.set_calendar_secret = function(secret) {
calendar_secret = secret;
}
exports.filtered_ics_feed = function(filters, callback) {
if(!calendar_id || !calendar_secret) {
throw new Error("Can't filter an ICS feed if you don't provide a Calendar ID and Secret first");
}
var atom_url = google_base_url + "feeds/" + calendar_id + "/private-" + calendar_secret + "/basic";
var ics_url = google_base_url + "ical/" + calendar_id + "/private-" + calendar_secret + "/basic.ics";
var client_side_filtering_required = false;
var client_side_filters = {};
var request_url = atom_url;
if(filters) {
request_url += "?extq=";
filters.forEach(function(filter) {
if(typeof filter[1] == "string") {
request_url += "[" + filter.join(":") + "]";
} else {
client_side_filtering_required = true;
client_side_filters[filter[0]] = filter[1];
}
});
}
request({ uri: request_url }, function(err, res, atom_xml_body) {
// console.log(request_url);
var feed = new NodePie(atom_xml_body);
feed.init();
var matched_uids = [];
var regexp = new RegExp(atom_url + "/(.*)");
feed.getItems().forEach(function(item) {
if(client_side_filtering_required) {
for(var key in client_side_filters) {
for(var index in item.element["gd:extendedProperty"]) {
var property = item.element["gd:extendedProperty"][index];
if(property.name === key) {
if(client_side_filters[key].indexOf(property.value) === -1) {
return;
}
}
}
}
}
// console.log(item.element);
var permalink = item.getLink("self", "application/atom+xml");
var uid = permalink.match(regexp)[1];
matched_uids.push(uid);
});
request({ uri: ics_url }, function(err, res, ics_body) {
var ics_json = vcal.parse_ics_string(ics_body);
ics_json.VCALENDAR[0].VEVENT = ics_json.VCALENDAR[0].VEVENT.filter(function(element, index, array) {
return matched_uids.indexOf(element.UID.replace("@google.com", "")) !== -1;
});
var new_ics = vcal.build_ics_string(ics_json);
callback(new_ics);
});
});
};