diff options
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | index.php | 6 | ||||
-rw-r--r-- | view/streams-json-v1.php | 23 | ||||
-rw-r--r-- | view/streams-json-v2.php | 105 |
4 files changed, 117 insertions, 23 deletions
@@ -72,14 +72,14 @@ see [deploy.sh](deploy.sh) ## JSON-API -Unter der URL http://streaming.media.ccc.de/streams/v1.json bietet die +Unter der URL http://streaming.media.ccc.de/streams/v2.json bietet die Steaming-Webseite eine Übersicht über alle konfigurierten Räume und Streams in einem maschinenlesbaren Format an. Dieses kann z.B. genutzt werden, um in den diversen Anwendungen, die sich rund um das Konferenzgeschehen entwickelt haben, Player und Links zu Liveübertragungen anzubieten. Wie die URL vermuten lässt, ist die API versioniert. Dies bedeutet, dass in -der `v1.json` keine Felder *entfernt werden* oder ihre *Bedeutung ändern* – es +der `v2.json` keine Felder *entfernt werden* oder ihre *Bedeutung ändern* – es können aber durchaus *neue Felder* hinzukommen. Eine formalere Spezifikation des JSON-Formats ist tbd. Ein Beispiel kann [hier -betrachtet](https://gist.github.com/MaZderMind/d5737ab867ade7888cb4) werden. +betrachtet](https://gist.github.com/MaZderMind/a91f242efb2f446a2237d4596896efd6) werden. @@ -107,6 +107,12 @@ try { exit; } + else if($route == 'streams/v2.json') + { + require('view/streams-json-v2.php'); + exit; + } + else if($route == 'about') { // global about-page diff --git a/view/streams-json-v1.php b/view/streams-json-v1.php index af0909b..7962226 100644 --- a/view/streams-json-v1.php +++ b/view/streams-json-v1.php @@ -2,23 +2,9 @@ header('Content-Type: application/json'); -$conferences = Conferences::getActiveConferences(); - -$struct = array(); -if(isset($GLOBALS['CONFIG'])) - $saved_config = $GLOBALS['CONFIG']; - -foreach ($conferences as $conference) +foreach (Conferences::getActiveConferences() as $conference) { - /* - ok. das ist so hacky. EIGENTLICH müsste man aus ModelBase - das $GLOBALS tilgen und von der api ne v2 releasen, welche - conferences als eigenes Objekt betrachtet - */ - $GLOBALS['CONFIG'] = $conference['CONFIG']; - $GLOBALS['MANDATOR'] = $conference['slug']; - - $overview = new Overview(); + $overview = $conference->getOverview(); foreach($overview->getGroups() as $group => $rooms) { @@ -99,14 +85,11 @@ foreach ($conferences as $conference) } $struct[] = array( - 'conference' => $conference['title'], + 'conference' => $conference->getTitle(), 'group' => $group, 'rooms' => $roomstruct, ); } } -if(isset($saved_config)) - $GLOBALS['CONFIG'] = $saved_config; - echo json_encode($struct, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); diff --git a/view/streams-json-v2.php b/view/streams-json-v2.php new file mode 100644 index 0000000..524f2db --- /dev/null +++ b/view/streams-json-v2.php @@ -0,0 +1,105 @@ +<?php + +header('Content-Type: application/json'); + +foreach (Conferences::getActiveConferences() as $conference) +{ + $overview = $conference->getOverview(); + + $groupstruct = array(); + foreach($overview->getGroups() as $group => $rooms) + { + $roomstruct = array(); + foreach($rooms as $room) + { + $streams = array(); + foreach($room->getStreams() as $stream) + { + $key = $stream->getSelection().'-'.$stream->getLanguage(); + + $urls = array(); + switch($stream->getPlayerType()) + { + case 'video': + foreach ($stream->getVideoProtos() as $proto => $display) + { + $urls[$proto] = array( + 'display' => $display, + 'tech' => $stream->getVideoTech($proto), + 'url' => $stream->getVideoUrl($proto), + ); + } + break; + + case 'slides': + foreach ($stream->getSlidesProtos() as $proto => $display) + { + $urls[$proto] = array( + 'display' => $display, + 'tech' => $stream->getSlidesTech($proto), + 'url' => $stream->getSlidesUrl($proto), + ); + } + break; + + case 'audio': + foreach ($stream->getAudioProtos() as $proto => $display) + { + $urls[$proto] = array( + 'display' => $display, + 'tech' => $stream->getAudioTech($proto), + 'url' => $stream->getAudioUrl($proto), + ); + } + break; + + case 'music': + foreach ($stream->getMusicProtos() as $proto => $display) + { + $urls[$proto] = array( + 'display' => $display, + 'tech' => $stream->getMusicTech($proto), + 'url' => $stream->getMusicUrl($proto), + ); + } + break; + } + + $streams[] = array( + 'slug' => $key, + 'display' => $stream->getDisplay(), + 'type' => $stream->getPlayerType(), + 'isTranslated' => $stream->isTranslated(), + 'videoSize' => $stream->getVideoSize(), + 'urls' => $urls, + ); + } + + $roomstruct[] = array( + 'slug' => $room->getSlug(), + 'schedulename' => $room->getScheduleName(), + 'thumb' => forceslash(baseurl()).$room->getThumb(), + 'link' => forceslash(baseurl()).$room->getLink(), + 'display' => $room->getDisplay(), + 'streams' => $streams, + ); + } + + $groupstruct[] = array( + 'group' => $group, + 'rooms' => $roomstruct, + ); + } + $struct[] = array( + 'conference' => $conference->getTitle(), + 'slug' => $conference->getSlug(), + 'author' => $conference->getAuthor(), + 'description' => $conference->getDescription(), + 'keywords' => $conference->getKeywords(), + 'startsAt' => $conference->startsAt() ? $conference->startsAt()->format(DateTime::ISO8601) : null, + 'endsAt' => $conference->endsAt() ? $conference->endsAt()->format(DateTime::ISO8601) : null, + 'groups' => $groupstruct, + ); +} + +echo json_encode($struct, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); |