UNPKG

gcalfilter

Version:

This filters the private ICS feed from Google Calendar based on extendedProperties

85 lines (66 loc) 2.36 kB
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); }); }); };