From 9f10efd6475eb9f25a75c35cc5780bee38c3c88e Mon Sep 17 00:00:00 2001 From: MaZderMind Date: Tue, 20 Dec 2016 23:12:48 +0100 Subject: [PATCH 1/2] migrate v1 api to the new conferences accessors --- view/streams-json-v1.php | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/view/streams-json-v1.php b/view/streams-json-v1.php index af0909b6..7962226b 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); From 4a7a7ed1bcc6f36fb18f7f564d8f43a7e64a2e48 Mon Sep 17 00:00:00 2001 From: MaZderMind Date: Tue, 20 Dec 2016 23:14:35 +0100 Subject: [PATCH 2/2] implement streams-api v2 fixes #6 --- README.md | 6 +-- index.php | 6 +++ view/streams-json-v2.php | 105 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 view/streams-json-v2.php diff --git a/README.md b/README.md index 9e3d278d..7aa93787 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/index.php b/index.php index 409d75e1..7b255f42 100644 --- a/index.php +++ b/index.php @@ -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-v2.php b/view/streams-json-v2.php new file mode 100644 index 00000000..524f2db9 --- /dev/null +++ b/view/streams-json-v2.php @@ -0,0 +1,105 @@ +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);