aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--configs/conferences/31c3/config.php (renamed from configs/clients/31c3.php)2
-rw-r--r--configs/conferences/gpn15/config.php421
-rw-r--r--configs/conferences/gpn15/main.less92
-rw-r--r--configs/conferences/gpn15/wolkenbar.pngbin0 -> 25703 bytes
-rw-r--r--index.php106
-rw-r--r--lib/helper.php24
-rw-r--r--model/Conferences.php59
-rw-r--r--template/page.phtml20
8 files changed, 658 insertions, 66 deletions
diff --git a/configs/clients/31c3.php b/configs/conferences/31c3/config.php
index 391ca4d..a0f6383 100644
--- a/configs/clients/31c3.php
+++ b/configs/conferences/31c3/config.php
@@ -38,7 +38,7 @@ $GLOBALS['CONFIG']['CONFERENCE'] = array(
* Der Boolean true ist aus Abwärtskompatibilitätsgründen äquivalent zu 'after'. False ist äquivalent
* zu 'running'.
*/
- //'CLOSED' => false,
+ 'CLOSED' => false,
/**
* Titel der Konferenz (kann Leer- und Sonderzeichen enthalten)
diff --git a/configs/conferences/gpn15/config.php b/configs/conferences/gpn15/config.php
new file mode 100644
index 0000000..f81959e
--- /dev/null
+++ b/configs/conferences/gpn15/config.php
@@ -0,0 +1,421 @@
+<?php
+date_default_timezone_set('Europe/Berlin');
+
+/**
+ * Während der Entwicklung wird die BASEURL automatisch erraten
+ * In Produktionssituationen sollte manuell eine konfiguriert werden um Überraschungen zu vermeiden
+ */
+if($_SERVER['HTTP_HOST'] != 'localhost')
+ $GLOBALS['CONFIG']['BASEURL'] = 'http://streaming.media.ccc.de/';
+
+
+$GLOBALS['CONFIG']['CONFERENCE'] = array(
+ /**
+ * Am Ende der Konferenz wird durch das Umlegen dieses Schalters auf True eine Danke-Und-Kommen-Sie-
+ * Gut-Nach-Hause-Seite sowie einem Ausblick auf die kommenden Events angezeigt. Während einer
+ * Konferenz kann dieser Schalter auskommentiert oder auf false gesetzt werden.
+ */
+ 'CLOSED' => false,
+
+ /**
+ * Titel der Konferenz (kann Leer- und Sonderzeichen enthalten)
+ * Dieser im Seiten-Header, im <title>-Tag, in der About-Seite und ggf. ab weiteren Stellen als
+ * Anzeigetext benutzt
+ */
+ 'TITLE' => 'GPN15',
+
+ /**
+ * Veranstalter
+ * Wird für den <meta name="author">-Tag verdet. Wird diese Zeile auskommentiert, wird kein solcher
+ * <meta>-Tag generiert.
+ */
+ 'AUTHOR' => 'Entropia e.V.',
+
+ /**
+ * Beschreibungstext
+ * Wird für den <meta name="description">-Tag verdet. Wird diese Zeile auskommentiert, wird kein solcher
+ * <meta>-Tag generiert.
+ */
+ 'DESCRIPTION' => 'Gulaschprogrammiernacht 15',
+
+ /**
+ * Schlüsselwortliste, Kommasepariert
+ * Wird für den <meta name="keywords">-Tag verdet. Wird diese Zeile auskommentiert, wird kein solcher
+ * <meta>-Tag generiert.
+ */
+ 'KEYWORDS' => 'GPN15, Hacking, Chaos Computer Club, Video, Media, Streaming, Hacker, Entropia, Gulasch',
+
+ /**
+ * HTML-Code für den Footer (z.B. für spezielle Attribuierung mit <a>-Tags)
+ * Sollte üblicherweise nur Inline-Elemente enthalten
+ * Wird diese Zeile auskommentiert, wird die Standard-Attribuierung für (c3voc.de) verwendet
+ */
+ 'FOOTER_HTML' => '
+ by <a href="https://entropia.de">Entropia e.V</a> &amp;
+ <a href="https://c3voc.de">c3voc</a>
+ ',
+
+ /**
+ * HTML-Code für den Banner (nur auf der Startseite, direkt unter dem Header)
+ * wird üblicherweise für KeyVisuals oder Textmarke verwendet (vgl. Blaues
+ * Wischiwaschi auf http://media.ccc.de/)
+ *
+ * Dieser HTML-Block wird üblicherweise in der main.less speziell für die
+ * Konferenz umgestaltet.
+ *
+ * Wird diese Zeile auskommentiert, wird kein Banner ausgegeben.
+ */
+ //'BANNER_HTML' => '31C3 – a new dawn',
+
+ /**
+ * Link zu den Recordings
+ * Wird diese Zeile auskommentiert, wird der Link nicht angezeigt
+ */
+ 'RELEASES' => 'http://media.ccc.de/browse/conferences/gpn/gpn15/index.html',
+
+ /**
+ * Link zu einer (externen) ReLive-Übersichts-Seite
+ * Wird diese Zeile auskommentiert, wird der Link nicht angezeigt
+ */
+ //'RELIVE' => 'http://vod.c3voc.de/',
+
+ /**
+ * Alternativ kann ein ReLive-Json konfiguriert werden, um die interne
+ * ReLive-Ansicht zu aktivieren.
+ *
+ * Wird beides aktiviert, hat der externe Link Vorrang!
+ * Wird beides auskommentiert, wird der Link nicht angezeigt
+ */
+ 'RELIVE_JSON' => 'http://live.dus.c3voc.de/releases/relive/index.json',
+
+ /**
+ * APCU-Cache-Zeit in Sekunden
+ * Wird diese Zeile auskommentiert, werden die apc_*-Methoden nicht verwendet und
+ * das Relive-Json bei jedem Request von der Quelle geladen und geparst
+ */
+ //'RELIVE_JSON_CACHE' => 30*60,
+);
+
+/**
+ * Konfiguration der Stream-Übersicht auf der Startseite
+ */
+$GLOBALS['CONFIG']['OVERVIEW'] = array(
+ /**
+ * Abschnitte aud der Startseite und darunter aufgeführte Räume
+ * Es können beliebig neue Gruppen und Räume hinzugefügt werden
+ *
+ * Die Räume müssen in $GLOBALS['CONFIG']['ROOMS'] konfiguriert werden,
+ * sonst werden sie nicht angezeigt.
+ */
+ 'GROUPS' => array(
+ 'Lecture Rooms' => array(
+ 'vortragssaal',
+ 'medientheater',
+ 'blauer-salon',
+ ),
+ ),
+);
+
+
+
+/**
+ * Liste der Räume (= Audio & Video Produktionen, also auch DJ-Sets oä.)
+ */
+$GLOBALS['CONFIG']['ROOMS'] = array(
+ /**
+ * Array-Key ist der Raum-Slug, der z.B. auch zum erstellen der URLs,
+ * in $GLOBALS['CONFIG']['OVERVIEW'] oder im Feedback verwendet wird.
+ */
+ 'vortragssaal' => array(
+ /**
+ * Angezeige-Name
+ */
+ 'DISPLAY' => 'ZKM Vortragssaal',
+
+ /**
+ * ID des Video/Audio-Streams. Die Stream-ID ist davon abhängig, welches
+ * Event-Case in welchem Raum aufgebaut wird und wird üblicherweise von
+ * s1 bis s5 durchnummeriert.
+ */
+ 'STREAM' => 's2',
+
+ /**
+ * Stream-Vorschaubildchen auf der Übersichtsseite anzeigen
+ * Damit das funktioniert muss der entsprechende runit-Task auf dem
+ * CDN-Quell-Host (live.ber) laufen.
+ */
+ 'PREVIEW' => true,
+
+ /**
+ * Übersetzungstonspur aktivieren
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist werden nur
+ * die native-Streams verwendet, andernfalls wird native und translated
+ * angeboten und auch für beide Tonspuren eine Player-Seite angezeigt.
+ */
+ 'TRANSLATION' => false,
+
+ /**
+ * stereo-Tonspur statt native-Tonspur benutzen
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist werden
+ * die "native"-Mono-Streams verwendet, andernfalls wird statt "native"
+ * der Streamname "stereo" eingesetzt. Im normalen Konferenz-Setup
+ * müssen dann beide Kanäle der Kamera mit einem Signal bespielt werden.
+ */
+ 'STEREO' => false,
+
+ /**
+ * SD-Video-Stream (1024×576) verfügbar
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein SD-Video
+ * angeboten. Wird auch HD_VIDEO auf false gesetzt oder auskommentiert ist, wird
+ * für diesen Raum überhaupt kein Video angeboten.
+ *
+ * In diesem Fall wird, sofern jeweils aktiviert, Slides, Audio und zuletzt Musik
+ * als Default-Stream angenommen.
+ */
+ 'SD_VIDEO' => true,
+
+ /**
+ * HD-Video-Stream (1920×1080) verfügbar
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein HD-Video
+ * angeboten. Wird auch SD_VIDEO auf false gesetzt oder auskommentiert ist, wird
+ * für diesen Raum überhaupt kein Video angeboten.
+ *
+ * In diesem Fall wird, sofern jeweils aktiviert, Slides, Audio und zuletzt Musik
+ * als Default-Stream angenommen.
+ */
+ 'HD_VIDEO' => false,
+
+ /**
+ * Slide-Only-Stream (1024×576) verfügbar
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein Slide-Only-
+ * Stream angeboten. Für diesen Raum wird dann keim Slides-Tab angeboten.
+ *
+ * In diesem Fall wird, sofern jeweils aktiviert, Audio und zuletzt Musik als
+ * Default-Stream angenommen.
+ */
+ 'SLIDES' => false,
+
+ /**
+ * Audio-Only-Stream verfügbar
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein Audio-Only-
+ * Stream angeboten. Für diesen Raum wird dann keim Audio-Tab angeboten.
+ *
+ * In diesem Fall wird, sofern aktiviert, Musik als Default-Stream angenommen.
+ */
+ 'AUDIO' => true,
+
+ /**
+ * Musik-Stream verfügbar
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist ẃird kein Musik-Stream
+ * angeboten. Für diesen Raum wird dann keim Musik-Tab angeboten.
+ *
+ * Ist kein einziger Stream angebote, wird statt der Stream-Seite ein 404-Fehler
+ * angezeigt.
+ */
+ 'MUSIC' => false,
+
+ /**
+ * Fahrplan-Ansicht auf der Raum-Seite aktivieren (boolean)
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist,
+ * wird der Raum nicht im Fahrplan gesucht und auch auf der Startseite
+ * findet keine Darstellung statt.
+ *
+ * Ebenso können alle Fahrplan-Funktionialitäten durch auskommentieren
+ * des globalen $GLOBALS['CONFIG']['SCHEDULE']-Blocks deaktiviert werden
+ */
+ 'SCHEDULE' => true,
+
+ /**
+ * Name des Raums im Fahrplan
+ * Wenn diese Zeile auskommentiert ist wird der Raum-Slug verwendet
+ */
+ 'SCHEDULE_NAME' => 'ZKM-Vortragssaal',
+
+ /**
+ * Feedback anzeigen (boolean)
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist,
+ * taucht der Raum auch im globalen Feedback-Formular nicht auf.
+ *
+ * Ebenso können alle Feedback-Funktionialitäten durch auskommentieren
+ * des globalen $GLOBALS['CONFIG']['FEEDBACK']-Blocks deaktiviert werden
+ */
+ 'FEEDBACK' => false,
+
+ /**
+ * Subtitles-Player aktivieren (boolean)
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist,
+ * wird der Subtitles-Button und die damit verbundenen Funktionen deaktiviert.
+ *
+ * Ebenso können alle Subtitles-Funktionialitäten durch auskommentieren
+ * des globalen $GLOBALS['CONFIG']['SUBTITLES']-Blocks deaktiviert werden
+ */
+ 'SUBTITLES' => false,
+
+ /**
+ * Embed-Form aktivieren (boolean)
+ *
+ * Ist dieses Feld auf true gesetzt, wird ein Embed-Tab unter dem Video
+ * angezeigt. Darüber kann der Player als iframe eingebunden werden.
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist,
+ * wird kein Embed-Tab angeboten und die URL zum Einbetten existiert nicht.
+ *
+ * Ebenso können alle Embedding-Funktionialitäten durch auskommentieren
+ * des globalen $GLOBALS['CONFIG']['EMBED']-Blocks deaktiviert werden
+ */
+ 'EMBED' => false,
+
+ /**
+ * IRC-Link aktivieren (boolean)
+ *
+ * Solange Twitter oder IRC aktiviert ist, wird ein "Chat"-Tab mit den
+ * jeweiligen Links angezeigt.
+ *
+ * Ist dieses Feld auf true gesetzt, wird ein irc://-Link angezeigt.
+ * WebIrc wird nach dem Congress nicht mehr unterstützt ;)
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist,
+ * wird kein IRC-Link angezeigt
+ *
+ * Ebenso können alle IRC-Links durch auskommentieren
+ * des globalen $GLOBALS['CONFIG']['IRC']-Blocks deaktiviert werden
+ */
+ 'IRC' => false,
+
+ /**
+ * Mit dem Angaben in diesem Block können die Vorgaben aus dem
+ * globalen $GLOBALS['CONFIG']['IRC'] Block überschrieben werden.
+ *
+ * Der globale $GLOBALS['CONFIG']['IRC']-Block muss trotzdem existieren,
+ * da sonst überhaupt kein IRC-Link erzeugt wird. (ggf. einfach `= true` setzen)
+ */
+ 'IRC_CONFIG' => array(
+ 'DISPLAY' => '#31C3-hall-1 @ hackint',
+ 'URL' => 'irc://irc.hackint.eu:6667/31C3-hall-1',
+ ),
+
+ /**
+ * Twitter-Link aktivieren (boolean)
+ *
+ * Ist dieses Feld auf true gesetzt, wird ein Link zu Twitter angezeigt.
+ *
+ * Solange Twitter oder IRC aktiviert ist, wird ein "Chat"-Tab mit den
+ * jeweiligen Links angezeigt.
+ *
+ * Wenn diese Zeile auskommentiert oder auf false gesetzt ist,
+ * wird kein Twitter-Link angezeigt
+ *
+ * Ebenso können alle Twitter-Links durch auskommentieren
+ * des globalen $GLOBALS['CONFIG']['TWITTER']-Blocks deaktiviert werden
+ **/
+ 'TWITTER' => false,
+
+ /**
+ * Mit dem Angaben in diesem Block können die Vorgaben aus dem
+ * globalen $GLOBALS['CONFIG']['TWITTER'] Block überschrieben werden.
+ *
+ * Der globale $GLOBALS['CONFIG']['TWITTER']-Block muss trotzdem existieren,
+ * da sonst überhaupt kein IRC-Link erzeugt wird. (ggf. einfach `= true` setzen)
+ */
+ 'TWITTER_CONFIG' => array(
+ 'DISPLAY' => '#hall1 @ twitter',
+ 'TEXT' => '#31C3 #hall1',
+ ),
+ ),
+
+ 'medientheater' => array(
+ 'DISPLAY' => 'Medientheater',
+ 'STREAM' => 's3',
+ 'PREVIEW' => true,
+
+ 'TRANSLATION' => false,
+ 'SD_VIDEO' => true,
+ 'HD_VIDEO' => false,
+ 'AUDIO' => true,
+ 'SLIDES' => false,
+ 'MUSIC' => false,
+
+ 'SCHEDULE' => true,
+ 'SCHEDULE_NAME' => 'Medientheater',
+ 'FEEDBACK' => false,
+ 'SUBTITLES' => false,
+ 'EMBED' => false,
+ 'IRC' => false,
+ 'TWITTER' => false,
+ ),
+
+ 'blauer-salon' => array(
+ 'DISPLAY' => 'Blauer Salon',
+ 'STREAM' => 's4',
+ 'PREVIEW' => true,
+
+ 'TRANSLATION' => false,
+ 'SD_VIDEO' => true,
+ 'HD_VIDEO' => false,
+ 'AUDIO' => true,
+ 'SLIDES' => false,
+ 'MUSIC' => false,
+
+ 'SCHEDULE' => false,
+ 'FEEDBACK' => false,
+ 'SUBTITLES' => false,
+ 'EMBED' => false,
+ 'IRC' => false,
+ 'TWITTER' => false,
+ ),
+);
+
+
+
+/**
+ * Konfigurationen zum Konferenz-Fahrplan
+ * Wird dieser Block auskommentiert, werden alle Fahrplan-Bezogenen Features deaktiviert
+ */
+$GLOBALS['CONFIG']['SCHEDULE'] = array(
+ /**
+ * URL zum Fahrplan-XML
+ *
+ * Diese URL muss immer verfügbar sein, sonst können kann die Programm-Ansicht
+ * aufhören zu funktionieren. Wenn die Quelle unverlässlich ist ;) sollte ein
+ * externer HTTP-Cache vorgeschaltet werden.
+ */
+ 'URL' => 'http://bl0rg.net/~andi/gpn15-fahrplan/schedule.xml',
+
+ /**
+ * Nur die angegebenen Räume aus dem Fahrplan beachten
+ *
+ * Wird diese Zeile auskommentiert, werden alle Räume angezeigt
+ */
+ 'ROOMFILTER' => array('Medientheater', 'ZKM-Vortragssaal'),
+
+ /**
+ * APCU-Cache-Zeit in Sekunden
+ * Wird diese Zeile auskommentiert, werden die apc_*-Methoden nicht verwendet und
+ * der Fahrplan bei jedem Request von der Quelle geladen und geparst
+ */
+ //'CACHE' => 30*60,
+
+ /**
+ * Skalierung der Programm-Vorschau in Sekunden pro Pixel
+ */
+ 'SCALE' => 7,
+
+ /**
+ * Simuliere das Verhalten als wäre die Konferenz bereits heute
+ *
+ * Diese folgende Beispiel-Zeile Simuliert, dass das
+ * Konferenz-Datum 2014-12-29 auf den heutigen Tag 2015-02-24 verschoben ist.
+ */
+ //'SIMULATE_OFFSET' => strtotime(/* Conference-Date */ '2014-12-28') - strtotime(/* Today */ '2015-03-01'),
+ 'SIMULATE_OFFSET' => 0,
+);
diff --git a/configs/conferences/gpn15/main.less b/configs/conferences/gpn15/main.less
new file mode 100644
index 0000000..7706c49
--- /dev/null
+++ b/configs/conferences/gpn15/main.less
@@ -0,0 +1,92 @@
+@import "../../../assets/css/_structure.less";
+
+// conference specific styles here
+
+// often configured values (and their defaults):
+//
+// @brand-primary: #337ab7;
+// @text-color: @gray-dark;
+//
+// @link-color: @brand-primary;
+// @link-hover-color: darken(@link-color, 15%);
+//
+// @navbar-default-color: #777777;
+// @navbar-default-bg: #f8f8f8;
+//
+// @navbar-default-link-color: #777;
+// @navbar-default-link-hover-color: #333;
+
+html, body {
+ min-height: 100%;
+}
+
+body {
+ background-image: url("wolkenbar.png");
+ background-repeat: repeat-x;
+ background-position: bottom left;
+}
+
+.navbar-fixed-top {
+ background: @body-bg url("wolkenbar.png") repeat-x left -46px;
+ border-color: #000;
+}
+
+footer {
+ background-color: rgba(255,255,255,0.35);
+ a {
+ color: #777;
+ text-decoration: underline;
+ }
+}
+
+
+/*
+@gray-darker: #369; // #222
+@gray: #445; // #555
+@gray-light: #030333; // #999
+@gray-lighter: #0D0FAE; // #eee
+*/
+
+@body-bg: rgba(0, 122, 186, 1);
+@text-color: white;
+
+@panel-bg: lighten(@body-bg, 5%);
+
+@link-color: #ccc;
+@well-bg: @panel-bg;
+@panel-primary-border: #FFFFFF;
+@panel-default-heading-bg: darken(@body-bg, 2%);
+@panel-default-text: #FFFFFF;
+
+@navbar-default-link-color: #fff;
+@navbar-default-link-hover-color: #fff;
+@navbar-default-link-active-color: #fff;
+
+@nav-tabs-active-link-hover-color: #fff;
+@nav-link-hover-bg: lighten(@body-bg, 1%);
+
+// colors of the schedule ("Fahrplan") widget below the video-player
+//
+// @schedule-now: @brand-danger;
+// @schedule-now-bg: fade(lighten(@brand-danger, 5%), 60%);
+// @schedule-border: lighten(@brand-primary, 50%);
+//
+// @schedule-room: darken(@brand-primary, 15%);
+// @schedule-author: #444;
+//
+// @schedule-selected-room: lighten(@brand-success, 10%);
+@schedule-selected-room: #72b3d2;
+.schedule a {
+ color: #333;
+}
+
+//
+// @schedule-daychange: darken(@brand-primary, 20%);
+// @schedule-daychange-bg: fade(white, 30%);
+//
+// @schedule-gap: darken(@brand-primary, 20%);
+// @schedule-gap-bg: fade(white, 30%);
+//
+// @schedule-pause: white;
+@schedule-pause: #333;
+// @schedule-pause-bg: lighten(black, 85%);
diff --git a/configs/conferences/gpn15/wolkenbar.png b/configs/conferences/gpn15/wolkenbar.png
new file mode 100644
index 0000000..b1ffae2
--- /dev/null
+++ b/configs/conferences/gpn15/wolkenbar.png
Binary files differ
diff --git a/index.php b/index.php
index 0a527d4..f12d914 100644
--- a/index.php
+++ b/index.php
@@ -5,35 +5,47 @@ if(!ini_get('short_open_tag'))
require_once('lib/helper.php');
-$route = @$_GET['route'];
-$route = rtrim($route, '/');
+require_once('lib/PhpTemplate.php');
+require_once('lib/Exceptions.php');
+require_once('lib/less.php/Less.php');
-if($route == '')
-{
- // list of clients
- $clients = array_values(array_filter(array_map(function($file)
- {
- $info = pathinfo($file);
+require_once('model/ModelBase.php');
+require_once('model/Conferences.php');
+require_once('model/Conference.php');
+require_once('model/Feedback.php');
+require_once('model/Schedule.php');
+require_once('model/Overview.php');
+require_once('model/Room.php');
+require_once('model/RoomTab.php');
+require_once('model/RoomSelection.php');
+require_once('model/Stream.php');
+require_once('model/Relive.php');
+require_once('model/Upcoming.php');
- if($info['extension'] == 'php')
- return $info['filename'];
- }, scandir('configs/clients/'))));
+$route = @$_GET['route'];
+$route = rtrim($route, '/');
+@list($mandator, $route) = explode('/', $route, 2);
+if(!$mandator)
+{
+ // root requested
- if(count($clients) == 0)
+ if(Conferences::getActiveConferencesCount() == 0)
{
// no clients
// error
- die('no clients');
+ var_dump('no clients');
+ exit;
}
- else if(count($clients) == 1)
+ else if(Conferences::getActiveConferencesCount() == 1)
{
// one client
// redirect
- header('Location: '.baseurl().$clients[0].'/');
+ $clients = Conferences::getActiveConferences();
+ header('Location: '.forceslash( baseurl() . $clients[0] ));
exit;
}
else
@@ -42,35 +54,23 @@ if($route == '')
// show overview
// TODO Template
- print_r($clients);
+ $clients = Conferences::getActiveConferences();
+ var_dump('multiple clients');
+ var_dump($clients);
exit;
}
}
-else
+else if(!Conferences::exists($mandator))
{
- list($client, $route) = explode('/', $route, 2);
-
- $GLOBALS['CLIENT'] = $client;
- require_once('configs/clients/'.$client.'.php');
+ // old url OR wrong client OR
+ // -> error
+ die('unknown conference '.$mandator);
}
+Conferences::load($mandator);
-require_once('lib/PhpTemplate.php');
-require_once('lib/Exceptions.php');
-require_once('lib/less.php/Less.php');
-
-require_once('model/ModelBase.php');
-require_once('model/Conference.php');
-require_once('model/Feedback.php');
-require_once('model/Schedule.php');
-require_once('model/Overview.php');
-require_once('model/Room.php');
-require_once('model/RoomTab.php');
-require_once('model/RoomSelection.php');
-require_once('model/Stream.php');
-require_once('model/Relive.php');
-require_once('model/Upcoming.php');
+// PER-CONFERENCE CODE
$conference = new Conference();
$tpl = new PhpTemplate('template/page.phtml');
@@ -96,7 +96,7 @@ if(startswith('//', @$GLOBALS['CONFIG']['BASEURL']))
ob_start();
try {
-
+ // ALWAYS AVAILABLE ROUTES
if($route == 'feedback/read')
{
require('view/feedback-read.php');
@@ -114,29 +114,25 @@ try {
else if($route == 'gen/main.css')
{
- $dir = forceslash(sys_get_temp_dir());
-
- $css_file = Less_Cache::Get([
- 'assets/css/main.less' => '../../assets/css/',
- ], [
- 'sourceMap' => true,
- 'compress' => true,
- 'relativeUrls' => true,
-
- 'cache_dir' => $dir,
- ]);
-
- $css = file_get_contents($dir.$css_file);
- header('Content-Type: text/css');
- header('Content-Length: '.strlen($css));
- print($css);
+ if(Conferences::hasCustomStyles($mandator))
+ {
+ handle_lesscss_request(
+ Conferences::getCustomStyles($mandator),
+ '../../'.Conferences::getCustomStylesDir($mandator)
+ );
+ }
+ else {
+ handle_lesscss_request('assets/css/main.less', '../../assets/css/');
+ }
}
+ // HAS-NOT-BEGUN VIEW
else if(!$conference->hasBegun())
{
require('view/not-started.php');
}
+ // ROUTES AVAILABLE AFTER BUT NOT BEFORE THE CONFERENCE
else if(preg_match('@^relive/([0-9]+)$@', $route, $m))
{
$_GET = array(
@@ -150,11 +146,14 @@ try {
require('view/relive.php');
}
+
+ // HAS-ENDED VIEW
else if($conference->hasEnded())
{
require('view/closed.php');
}
+ // ROUTES AVAILABLE ONLY DURING THE CONFERENCE
else if($route == '')
{
require('view/overview.php');
@@ -226,6 +225,7 @@ try {
require('view/embed.php');
}
+ // UNKNOWN ROUTE
else
{
throw new NotFoundException();
diff --git a/lib/helper.php b/lib/helper.php
index eb9fc6d..0d4d868 100644
--- a/lib/helper.php
+++ b/lib/helper.php
@@ -18,14 +18,14 @@ function baseurl()
if(startswith('//', $base))
$base = proto().':'.$base;
- return forceslash($base.'/'.$GLOBALS['CLIENT']);
+ return forceslash(forceslash($base).@$GLOBALS['MANDATOR']);
}
$base = ssl() ? 'https://' : 'http://';
$base .= $_SERVER['HTTP_HOST'];
$base .= forceslash(dirname($_SERVER['SCRIPT_NAME']));
- return forceslash($base.$GLOBALS['CLIENT']);
+ return forceslash(forceslash($base).@$GLOBALS['MANDATOR']);
}
function forceslash($url)
@@ -41,3 +41,23 @@ function startswith($needle, $haystack)
{
return substr($haystack, 0, strlen($needle)) == $needle;
}
+
+function handle_lesscss_request($lessfile, $relative_path)
+{
+ $dir = forceslash(sys_get_temp_dir());
+
+ $css_file = Less_Cache::Get([
+ $lessfile => $relative_path,
+ ], [
+ 'sourceMap' => true,
+ 'compress' => true,
+ 'relativeUrls' => true,
+
+ 'cache_dir' => $dir,
+ ]);
+
+ $css = file_get_contents($dir.$css_file);
+ header('Content-Type: text/css');
+ header('Content-Length: '.strlen($css));
+ print($css);
+}
diff --git a/model/Conferences.php b/model/Conferences.php
new file mode 100644
index 0000000..05d3c52
--- /dev/null
+++ b/model/Conferences.php
@@ -0,0 +1,59 @@
+<?php
+
+class Conferences extends ModelBase
+{
+ const MANDATOR_DIR = 'configs/conferences/';
+
+ public static function getConferences() {
+ return array_values(array_filter(scandir(forceslash(Conferences::MANDATOR_DIR)), function($el) {
+ return $el[0] != '.';
+ }));
+ }
+ public static function getConferencesCount() {
+ return count(Conferences::getConferences());
+ }
+
+ public static function getActiveConferences() {
+ return array_values(array_filter(
+ Conferences::getConferences(), ['Conferences', 'isActive']
+ ));
+ }
+
+ public static function getActiveConferencesCount() {
+ return count(Conferences::getActiveConferences());
+ }
+
+ public static function exists($mandator) {
+ return in_array($mandator, Conferences::getConferences());
+ }
+
+ public static function isActive($mandator) {
+ if(isset($GLOBALS['CONFIG']))
+ $saved_config = $GLOBALS['CONFIG'];
+
+ Conferences::load($mandator);
+ $conf = new Conference();
+ $active = !$conf->isClosed();
+ unset($GLOBALS['CONFIG']);
+
+ if(isset($saved_config))
+ $GLOBALS['CONFIG'] = $saved_config;
+
+ return $active;
+ }
+
+ public static function hasCustomStyles($mandator) {
+ return file_exists(Conferences::getCustomStyles($mandator));
+ }
+ public static function getCustomStyles($mandator) {
+ return forceslash(Conferences::getCustomStylesDir($mandator)).'main.less';
+ }
+ public static function getCustomStylesDir($mandator) {
+ return forceslash(Conferences::MANDATOR_DIR).forceslash($mandator);
+ }
+
+ public static function load($mandator) {
+ $GLOBALS['MANDATOR'] = $mandator;
+ include(forceslash(Conferences::MANDATOR_DIR).forceslash($mandator).'config.php');
+ }
+}
diff --git a/template/page.phtml b/template/page.phtml
index bd73065..37f192a 100644
--- a/template/page.phtml
+++ b/template/page.phtml
@@ -29,20 +29,20 @@
<base href="<?=h($baseurl)?>" />
<link href="<?=h($canonicalurl)?>" rel="canonical" />
- <link href="assets/img/apple-touch-icon.png" rel="apple-touch-icon" />
- <link href="assets/img/favicon.png" rel="icon" type="image/png" />
+ <link href="../assets/img/apple-touch-icon.png" rel="apple-touch-icon" />
+ <link href="../assets/img/favicon.png" rel="icon" type="image/png" />
- <link type="text/css" rel="stylesheet" href="assets/mejs/mediaelementplayer.min.css" />
+ <link type="text/css" rel="stylesheet" href="../assets/mejs/mediaelementplayer.min.css" />
<link type="text/css" rel="stylesheet" href="gen/main.css" />
- <script type="text/javascript" src="assets/js/lib/jquery.min.js"></script>
- <script type="text/javascript" src="assets/js/lib/jquery.scrollTo.min.js"></script>
- <script type="text/javascript" src="assets/js/lib/bootstrap.min.js"></script>
- <script type="text/javascript" src="assets/js/lib/bootstrap-datepicker.min.js"></script>
- <script type="text/javascript" src="assets/js/lib/moment.min.js"></script>
+ <script type="text/javascript" src="../assets/js/lib/jquery.min.js"></script>
+ <script type="text/javascript" src="../assets/js/lib/jquery.scrollTo.min.js"></script>
+ <script type="text/javascript" src="../assets/js/lib/bootstrap.min.js"></script>
+ <script type="text/javascript" src="../assets/js/lib/bootstrap-datepicker.min.js"></script>
+ <script type="text/javascript" src="../assets/js/lib/moment.min.js"></script>
- <script type="text/javascript" src="assets/mejs/mediaelement-and-player.min.js"></script>
- <script type="text/javascript" src="assets/js/lustiges-script.js"></script>
+ <script type="text/javascript" src="../assets/mejs/mediaelement-and-player.min.js"></script>
+ <script type="text/javascript" src="../assets/js/lustiges-script.js"></script>
</head>
<body class="<?=h(is_numeric($page[0]) ? 'e'.$page : $page)?>">
<? if(!@$naked): ?>