parent
3e87cb8dbe
commit
4e03152676
@ -0,0 +1,178 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
include_once("monoformat_schema.php"); |
||||||
|
include_once("monoformat_structured.php"); |
||||||
|
|
||||||
|
function replaceTalkInfo($str, $talks) { |
||||||
|
return preg_replace_callback("/\\$\\{([^}]*)\\}/", function ($matches) use ($talks) { |
||||||
|
if (str_contains($matches[1], ".")) { |
||||||
|
[$id, $what] = explode(".", $matches[1], 2); |
||||||
|
$id = (int) $id; |
||||||
|
if ($id < 0 || $id >= count($talks)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
$talk = $talks[$id]; |
||||||
|
if (array_key_exists($what, $talk)) { |
||||||
|
return $talk[$what]; |
||||||
|
} else { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
} else { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
}, $str); |
||||||
|
} |
||||||
|
|
||||||
|
$roomMapping = [ |
||||||
|
]; |
||||||
|
|
||||||
|
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("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)); |
||||||
|
|
||||||
|
?> |
||||||
Loading…
Reference in new issue