aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaZderMind2016-12-20 23:14:35 +0100
committerMaZderMind2016-12-20 23:14:35 +0100
commit4a7a7ed1bcc6f36fb18f7f564d8f43a7e64a2e48 (patch)
treeb4a3a882c87f318bb6943841dc04079274401dd7
parent9f10efd6475eb9f25a75c35cc5780bee38c3c88e (diff)
implement streams-api v2
fixes #6
-rw-r--r--README.md6
-rw-r--r--index.php6
-rw-r--r--view/streams-json-v2.php105
3 files changed, 114 insertions, 3 deletions
diff --git a/README.md b/README.md
index 9e3d278..7aa9378 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 409d75e..7b255f4 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 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);