67 lines
1.7 KiB
PHP
67 lines
1.7 KiB
PHP
<?php
|
|
|
|
// URL der öffentlichen ICS-Datei
|
|
define(
|
|
'CAL_URL',
|
|
'https://calendar.google.com/calendar/ical/jv1bq94un3ivoa8ka0rk9ngq4k%40group.calendar.google.com/public/basic.ics',
|
|
);
|
|
|
|
function format_ics_date($date)
|
|
{
|
|
// Unterstützt sowohl ganztägige als auch Zeitangaben
|
|
if (strpos($date, 'T') !== false) {
|
|
$dt = DateTime::createFromFormat('Ymd\THis', substr($date, 0, 15));
|
|
|
|
return $dt ? $dt->format('d.m.Y H:i') : $date;
|
|
} else {
|
|
$dt = DateTime::createFromFormat('Ymd', $date);
|
|
|
|
return $dt ? $dt->format('d.m.Y') : $date;
|
|
}
|
|
}
|
|
|
|
// ICS-Datei laden
|
|
$ics = @file_get_contents(CAL_URL);
|
|
if (! $ics) {
|
|
echo '<div class="text-red-600">Kalender konnte nicht geladen werden.</div>';
|
|
|
|
return;
|
|
}
|
|
|
|
// Termine parsen
|
|
function parse_ics($ics)
|
|
{
|
|
$lines = explode("\n", $ics);
|
|
$events = [];
|
|
$event = [];
|
|
$inEvent = false;
|
|
foreach ($lines as $line) {
|
|
$line = trim($line);
|
|
if ($line === 'BEGIN:VEVENT') {
|
|
$inEvent = true;
|
|
$event = [];
|
|
} elseif ($line === 'END:VEVENT') {
|
|
$inEvent = false;
|
|
$events[] = $event;
|
|
} elseif ($inEvent) {
|
|
// Property kann Parameter enthalten, z.B. DTSTART;TZID=Europe/Berlin:20240701T19000000
|
|
$parts = explode(':', $line, 2);
|
|
if (count($parts) === 2) {
|
|
$key = $parts[0];
|
|
$val = $parts[1];
|
|
// Nur den eigentlichen Property-Namen extrahieren
|
|
$key = strtoupper(preg_replace('/;.+$/', '', $key));
|
|
$event[$key] = $val;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $events;
|
|
}
|
|
|
|
$events = parse_ics($ics);
|
|
|
|
return function () use ($events) {
|
|
return $events;
|
|
};
|