= count($talks)) { return ""; } $talk = $talks[$id]; if (array_key_exists($what, $talk)) { return $talk[$what]; } else { return ""; } } else { return ""; } }, $str); } $roomMapping = [ "1020ba76eb04" => "a873f07f-4ab2-57ea-9183-99b187e8b0cf", // Medientheater "001122334466" => "0273ef15-d23a-5413-9c74-3edc092b6ee8", // Kubus "001122334477" => "80d66dbe-d978-57b5-86e2-b3d480136b9a", // Vortragssaal ]; if (!isset($_GET["mac"]) or !array_key_exists($_GET["mac"], $roomMapping)) { /* We didn't find this device in the mapping, so let's just * send a default file to the user. */ Header("Content-Type: application/octet-stream"); readfile(dirname(__FILE__) . "/noroom.bin"); exit(0); } $roomGUID = strtolower($roomMapping[$_GET["mac"]]); $pretalx = json_decode(file_get_contents("https://cfp.gulas.ch/gpn24/schedule/export/schedule.json"), true); $roomName = null; foreach ($pretalx["schedule"]["conference"]["rooms"] as $room) { $thisRoomGUID = strtolower($room["guid"]); if ($thisRoomGUID === $roomGUID) { $roomName = $room["name"]; break; } } if ($roomName === null) { die("Room not found!"); } $talks = []; $now = new DateTimeImmutable("now"); foreach ($pretalx["schedule"]["conference"]["days"] as $day) { if (!array_key_exists($roomName, $day["rooms"])) { continue; } $roomTalks = $day["rooms"][$roomName]; foreach ($roomTalks as $t) { [$h, $m] = explode(":", $t["duration"]); $duration = $h * 3600 + $m * 60; $duration = DateInterval::createFromDateString("$duration sec"); $speakers = []; foreach ($t["persons"] as $person) { array_push($speakers, $person["name"]); } $talkBegin = new DateTimeImmutable($t["date"]); $talkEnd = $talkBegin->add($duration); if ($talkEnd < $now) { continue; } $talk = [ "Time" => $talkBegin->format("H:i"), "Duration" => $duration->format("H:i"), "Persons" => implode(", ", $speakers), "Title" => $t["title"], "_start" => $talkBegin, "_end" => $talkEnd, ]; array_push($talks, $talk); } } $template = file_get_contents(dirname(__FILE__) . "/template.bin"); $template = monoformat\parseFile($template); if (count($template->sections) != 1 or $template->sections[0]->sectionType() != monoformat\SectionType::AlwaysDrawn) { die("Invalid section in template file"); } $elements = []; for ($i = 0; $i < $template->sections[0]->elementCount(); ++$i) { array_push($elements, $template->sections[0]->elementAt($i)); } $end_template = file_get_contents(dirname(__FILE__) . "/endscreen.bin"); $end_template = monoformat\parseFile($end_template); if (count($end_template->sections) != 1 or $end_template->sections[0]->sectionType() != monoformat\SectionType::AlwaysDrawn) { die("Invalid section in end screen template file"); } $end_elements = []; for ($i = 0; $i < $end_template->sections[0]->elementCount(); ++$i) { array_push($end_elements, $end_template->sections[0]->elementAt($i)); } $n = 42; $last = false; if ($n > count($talks)) { $n = count($talks); $last = true; } $lastEnd = 0; $outputFile = new monoformat\File(); if (!$last) { $section = new monoformat\ExpiryDateSection(); $section->setExpiryDate($talks[$n - 1]["_end"]->getTimestamp()); array_push($outputFile->sections, $section); } for ($i = 0; $i < $n; ++$i) { $subTalks = array_slice($talks, $i); $end = $subTalks[0]["_end"]->getTimestamp(); $section = new monoformat\TimeBasedDrawnSection(); $section->setDrawOnFront(true); $section->setDrawOnBack(true); $section->setClearBeforeDrawing(true); $section->setStartTimestamp($lastEnd); $section->setEndTimestamp($end); foreach ($elements as $element) { if ($element->elementType() == monoformat\ElementType::ClippedText) { $x = $element->x(); $y = $element->y(); $width = $element->width(); $height = $element->height(); $textFlags = $element->textFlags(); $fontIndex = $element->fontIndex(); $text = replaceTalkInfo($element->text(), $subTalks); $element = new monoformat\ClippedTextElement($x, $y, $width, $height, $textFlags, $fontIndex, $text); } else if ($element->elementType() == monoformat\ElementType::HScrollText) { $x = $element->x(); $y = $element->y(); $width = $element->width(); $height = $element->height(); $textFlags = $element->textFlags(); $flags = $element->flags(); $scrollSpeed = $element->scrollSpeed(); $fontIndex = $element->fontIndex(); $text = replaceTalkInfo($element->text(), $subTalks) . " "; $element = new monoformat\HScrollTextElement($x, $y, $width, $height, $textFlags, $flags, $scrollSpeed, $fontIndex, $text); } $section->appendElement($element); } array_push($outputFile->sections, $section); $lastEnd = $end; } if ($last) { $section = new monoformat\TimeBasedDrawnSection(); $section->setDrawOnFront(true); $section->setDrawOnBack(true); $section->setClearBeforeDrawing(true); $section->setStartTimestamp($lastEnd); // Set this far enough in the future that it doesn't matter $section->setEndTimestamp($lastEnd + 86400 * 300); foreach ($end_elements as $element) { $section->appendElement($element); } array_push($outputFile->sections, $section); } Header("Content-Type: application/octet-stream"); print(monoformat\serializeFile($outputFile)); ?>