#!/usr/bin/perl
use constant SOURCE => "/Users/mark/Library/Application Support/iCal/Sources/E49F498D-968C-4A4F-93E8-6E9AF7F44B2B.calendar/corestorage.ics";
use strict;
use warnings;
use XML::RSS;
# load the calendar
use Data::ICal::DateTime;
# create a new RSS feed
my $rss = new XML::RSS (version => '1.0');
rss(0, 1, "today!");
rss(1, 2, "tomorrow!");
rss(2, 3, "day after tomorrow!");
rss(3, 7, "within a week");
rss(7, 14, "within a fortnight");
print $rss->as_string;
#################################
my ($ical, @events);
sub rss
{
my ($start, $end, $comment) = @_;
# calculate the next 14 days. This is done once because it 'explodes'
# the events and hence is quite expensive
unless ($ical)
{
$ical = Data::ICal->new( filename => SOURCE );
@events = $ical->events(
DateTime::Span->from_datetimes(
start => midnight(),
end => midnight()->add( days => 14, seconds => -1),
)
);
}
# what are we looking for this time?
my $span = DateTime::Span->from_datetimes(
start => midnight()->add( days => $start ),
end => midnight()->add( days => $end, seconds => -1),
);
# find which of those events in the next 14 days we're concerned
# with and add them to the rss feed
foreach my $event (grep { $_->is_in($span) } @events)
{
$rss->add_item(
title => $event->summary . " $comment",
description => "On ".$event->start->ymd." (".(qw(
Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday ))[ $event->start->dow ]
. ")"
);
}
}
# midnight today.
my $midnight;
sub midnight
{
$midnight ||=
DateTime->now->set( hour => 0, minute => 0, second => 0, nanosecond => 0 );
return $midnight->clone;
}