Files
racalmas/tools/sync_cms/import_ical.pl

163 lines
4.3 KiB
Perl
Executable File

#!/usr/bin/perl
use strict;
use warnings;
use lib "../calcms";
use utf8;
use DateTime;
use Net::Google::Calendar;
use DateTime::Format::ICal;
use Data::Dumper;
use Config::General;
use db;
use config;
use creole_wiki;
use markup;
use events;
my $filename=$ARGV[0];
die("USAGE: $0 filename") unless defined $filename;
die("cannot read from '$filename'") unless -e $filename;
our $default={
configFile => '/home/radio/piradio.de/agenda/config/config.cgi',
timezone => 'Europe/Berlin',
local_media_url => 'http://piradio.de/agenda_files/media/',
project => '88vier',
location => 'piradio',
};
my $config = config::get($default->{configFile});
print Dumper($config);
parseICalFile($config, $filename);
our $active=0;
sub parseICalFile{
my $config=shift;
my $filename=shift;
print "open $filename\n";
open my $file, "<:encoding(UTF-8)", $filename;
my $parse=0;
my $event=undef;
my $lastKey=undef;
while (<$file>){
my $line=$_;
#print $parse." ".$line;
if ($line=~/^BEGIN\:VEVENT/){
$event={};
$parse=1;
#print "start event\n";
next;
}
if ($line=~/^END\:VEVENT/){
$parse=0;
processEvent($config, $event) if defined $event;
#print "end event\n";
next;
}
if ($line=~/^\s/){
my $key = $lastKey;
my $value = substr($line, 1);
$value=~s/[\r\n]+$//;
$event->{$key}.=$value;
$lastKey=$key;
next;
}else{
my ($key,$value)=split(/\:/,$line,2);
$value=~s/[\r\n]+$//;
$event->{$key}=$value;
$lastKey=$key;
}
}
close $file;
}
sub processEvent{
my $config=shift;
my $source=shift;
my $event={};
$event->{title} = $source->{SUMMARY};
$event->{content} = $source->{DESCRIPTION};
$event->{title} = markup::ical_to_plain($event->{title});
$event->{content} = markup::ical_to_plain($event->{content});
unless (defined $source->{DTSTART}){
print STDERR "missing DTSTART in ".Dumper($source);
return;
}
unless (defined $source->{DTEND}){
print STDERR "missing DTEND in ".Dumper($source);
return;
}
my $start = DateTime::Format::ICal->parse_datetime($source->{DTSTART});
$start=$start->set_time_zone($default->{timezone});
$event->{start} = $start->datetime();
my $end = DateTime::Format::ICal->parse_datetime($source->{DTEND});
$end = $end->set_time_zone($default->{timezone});
$event->{end} = $end->datetime();
my $params={
title => $event->{title},
content => $event->{content},
local_media_url => $default->{local_media_url}
};
#$params->{content}=~s/\x0A\x20/\n/g;
$event=creole_wiki::extractEventFromWikiText($params, $event);
$event->{project} = $default->{project};
$event->{location} = $default->{location};
return unless ($event->{start} ge '2015-09-01');
$active=1 if ($event->{series_name}=~/Brainwashed/);
print "$active $event->{start} $event->{series_name} - $event->{title}\n";
#saveEvent($config, $event);
#exit;
}
sub saveEvent{
my $config = shift;
my $event = shift;
$config->{access}->{write}=1;
my $dbh=db::connect($config);
$event->{'html_content'}=markup::creole_to_html($event->{'content'});
# set start date
my $day_start=$config->{date}->{day_starting_hour};
$event->{start_date} = time::add_hours_to_datetime($event->{start}, -$day_start);
$event->{start_date} = time::datetime_to_date($event->{start_date});
# set end date
$event->{end_date} = time::add_hours_to_datetime($event->{end}, -$day_start);
$event->{end_date} = time::datetime_to_date($event->{end_date});
delete $event->{categories} if defined $event->{categories};
# set time of day
my $day_times=$config->{date}->{time_of_day};
my $event_hour=int((split(/[\-\:\sT]/,$event->{start}))[3]);
for my $hour(sort {$a <=> $b} (keys %$day_times)){
if ($event_hour >= $hour){
$event->{time_of_day}=$day_times->{$hour};
}else{
last;
};
}
$event->{published}=0;
$event->{modified_by}='sync_cms';
print Dumper($event);
#db::insert($dbh,'calcms_events', $event);
}