#!/usr/bin/perl -w # Turns Upcoming.org's RSS feeds into iCalendar files for use with # Apple iCal or Mozilla Calendar. By George Hotelling # http://george.hotelling.net/ # Licensed under the BSD license. # This is hella hacky, so be careful. use strict; use LWP::Simple qw(get); use XML::RSS::Parser; # Change this to the Upcoming.org URL you want to use my $xml = get('http://upcoming.org/syndicate/my_events_full/24'); my $p = new XML::RSS::Parser; my $feed = $p->parse($xml); my $channel = $feed->channel; my $feedtitle = "Upcoming.org"; foreach my $el ($channel->children) { if ($el->name eq "title") { $feedtitle = $el->value; } } print <items) { my ($organizer, $uid, $dtstart, $title, $description, $categories, $endtime) = ('', '', '', '', '', '', '' ); foreach my $el ($item->children) { if ($el->name eq 'http://purl.org/dc/elements/1.1/creator') { $organizer = $el->value; } elsif ($el->name eq 'guid') { $uid = $el->value; } elsif ($el->name eq 'http://purl.org/dc/elements/1.1/date') { $dtstart = &dctime2icaltime($el->value); } elsif ($el->name eq 'title') { $title = $el->value; } elsif ($el->name eq 'description') { $description = $el->value; } elsif ($el->name eq 'category') { $categories = $el->value; } elsif ($el->name eq 'http://www.upcoming.org/xml/endtime') { $endtime = $el->value; } } print "BEGIN:VEVENT\n"; print "DTSTART;TZID=US-Pacific:$dtstart\n"; # This DURATION *CRASHES* iCal! # print "DURATION:1H\n"; my $dtend = getenddate($dtstart, $endtime); print "DTEND;TZID=US-Pacific:$dtend\n"; print "SUMMARY:$title\n"; print "UID:$uid\n"; print "CATEGORIES:$categories\n"; print "ORGANIZER;CN=$organizer:http://upcoming.org/users/$organizer\n"; print "END:VEVENT\n"; } print "END:VCALENDAR\n"; sub dctime2icaltime { my $time = shift; $time = substr($time, 0, -6); $time =~ s/-//g; $time =~ s/://g; return $time; } sub getenddate { my ($basetime, $endtime) = @_; my $date = substr($basetime, 0, 8) . 'T'; $endtime =~ s/://g; if ($endtime eq '' || substr($basetime, -6, 0) eq $endtime) { return $date . "235959"; } return $date . $endtime; }