#!/usr/bin/perl -w use strict; use LWP::Simple; header(); my @now = gmtime(); my $year = $now[5]+1900; foreach my $y (2006 .. $year) { getyear($y); } footer(); sub getyear { my $year = shift; my $page = get("http://doc.gold.ac.uk/mscac/cal/year.php?year_eventsDate=$year"); while ($page =~ m{]*>\d+\s*]*>\s*((?:.*?\s*)+)}sgx ) { my ($date, $stuff) = ($1, $2); #print $stuff . "\n"; $date =~ s/\-//g; while ($stuff =~ /(\d\d:\d\d)\s+-\s+(\d\d:\d\d)\s+([^<]+)/sg) { my ($start, $stop, $detail) = ($1, $2, $3); $start =~ s/://g; $stop =~ s/://g; $start =~ s/(\d\d\d\d).*/$1/; $stop =~ s/(\d\d\d\d).*/$1/; event($date, $start, $stop, $detail) } } } sub header { print "BEGIN:VCALENDAR CALSCALE:GREGORIAN METHOD:PUBLISH X-WR-CALNAME:mscac X-WR-TIMEZONE:Europe/London BEGIN:VTIMEZONE TZID:Europe/London X-LIC-LOCATION:Europe/London BEGIN:DAYLIGHT TZOFFSETFROM:+0000 TZOFFSETTO:+0100 TZNAME:BST DTSTART:19700329T010000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0100 TZOFFSETTO:+0000 TZNAME:GMT DTSTART:19701025T020000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD END:VTIMEZONE "; } sub event { my ($date, $start, $stop, $detail) = @_; my $dtstart = "${date}T${start}"; my $dtstop = "${date}T${stop}"; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); my $now = sprintf("%04d%02d%02dT%02d%02d%02dZ", $year + 1900, $mon + 1, $mday, $hour, $min, $sec ); print "BEGIN:VEVENT DTSTART;TZID=Europe/London:${dtstart}00 DTEND;TZID=Europe/London:${dtstop}00 DTSTAMP:$now CREATED:$now LAST-MODIFIED:$now SEQUENCE:0 STATUS:CONFIRMED SUMMARY:$detail TRANSP:OPAQUE END:VEVENT "; } sub footer { print "END:VCALENDAR\n\n"; }