aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaZderMind2016-12-20 23:21:20 +0100
committerMaZderMind2016-12-20 23:21:20 +0100
commit9af641e5854d6edb83be6666794eb4d5371dcd8f (patch)
tree489bc3fd4a838d0489a4db35c1f2db73b8f1a5d8
parent6776bbbc887895b1dccd2dcb416a34958b4bc0a1 (diff)
parent4a7a7ed1bcc6f36fb18f7f564d8f43a7e64a2e48 (diff)
Merge branch 'master' into events/33c3
Diffstat (limited to '')
-rw-r--r--README.md6
-rw-r--r--index.php6
-rw-r--r--view/streams-json-v1.php23
-rw-r--r--view/streams-json-v2.php105
4 files changed, 117 insertions, 23 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 a100570..3b128c4 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-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);