Merge branch 'master' into aalen

This commit is contained in:
L3D 2023-10-30 23:16:01 +01:00 committed by GitHub
commit e4a18387ad
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 2485 additions and 943 deletions

View file

@ -24,11 +24,11 @@ $GLOBALS['CONFIG']['PREVIEW_DOMAIN'] = 'xlocalhost';
* Protokollfreie URLs (welche, die mit // beginnen), werden automatisch mit dem korrekten Protokoll ergänzt.
* In diesem Fall wird auch ein SSL-Umschalt-Button im Header angezeigt
*/
if(@$_SERVER['SERVER_NAME'] == 'localhost' || @$_SERVER['SERVER_NAME'] == '0.0.0.0')
if(isset($_SERVER['SERVER_NAME']) && ($_SERVER['SERVER_NAME'] == 'localhost' || $_SERVER['SERVER_NAME'] == '0.0.0.0'))
{
// keine Konfiguration -> BASEURL wird automatisch erraten
}
else if(@$_SERVER['SERVER_NAME'] == 'streaming.test.c3voc.de')
else if(isset($_SERVER['SERVER_NAME']) && ($_SERVER['SERVER_NAME'] == 'streaming.test.c3voc.de'))
{
$GLOBALS['CONFIG']['BASEURL'] = '//streaming.test.c3voc.de/';
}
@ -104,7 +104,7 @@ $GLOBALS['CONFIG']['FEEDBACK'] = array(
/**
* Konfiguration der Room-Defaults
*
* Falls in der Raum-Konfiguration innerhalb der Konferenz für diese Keys nichts definiert ist,
* Falls in der Raum-Konfiguration innerhalb der Konferenz für diese Keys nichts definiert ist,
* fällt das System auf diese Werte zurück.
*/

View file

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
width="629.33333"
height="629.33333"
viewBox="157.33333,279.83333,629.33333,629.33333"
id="svg872"
sodipodi:docname="alpaka.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
inkscape:export-filename="/home/sophie/Pictures/jugendhackt/alpaka_51509d.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<metadata
id="metadata878">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs876" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1863"
inkscape:window-height="1056"
id="namedview874"
showgrid="false"
inkscape:zoom="1.3458687"
inkscape:cx="170.52184"
inkscape:cy="314.66666"
inkscape:window-x="1977"
inkscape:window-y="1104"
inkscape:window-maximized="1"
inkscape:current-layer="g870" />
<g
fill="none"
fill-rule="nonzero"
stroke="none"
stroke-width="1"
stroke-linecap="butt"
stroke-linejoin="miter"
stroke-miterlimit="10"
stroke-dasharray=""
stroke-dashoffset="0"
font-family="none"
font-weight="none"
font-size="none"
text-anchor="none"
style="mix-blend-mode: normal"
id="g870">
<path
style="fill:#ffffff"
inkscape:connector-curvature="0"
id="path857"
d="m 328.9697,851.95455 v 0 0 -57.21212 H 271.75758 V 737.53031 H 214.54546 V 565.89395 h 57.21212 v -57.21212 h 400.48485 v 57.21212 h 57.21212 v 171.63636 h -57.21212 v 57.21212 h -57.21212 v 57.21212 z" />
<g
style="fill:#000000"
id="g865">
<rect
id="rect859"
height="7"
width="7"
transform="scale(8.17316)"
y="76.238083"
x="33.25" />
<rect
id="rect861"
height="7"
width="7"
transform="scale(8.17316)"
y="76.238083"
x="75.25" />
<path
inkscape:connector-curvature="0"
id="path863"
d="M 500.60606,737.5303 H 443.39394 V 680.31818 H 386.18182 V 794.74242 H 557.81818 V 680.31818 h -57.21212 z" />
</g>
<path
style="fill:#ea680c;fill-opacity:1"
inkscape:connector-curvature="0"
id="path867"
d="M 729.45455,337.04545 V 279.83333 H 615.03031 v 57.21212 h -57.21212 v 57.21212 H 386.18183 V 337.04545 H 328.96971 V 279.83333 H 214.54547 v 57.21212 h -57.21212 v 457.69697 h 57.21212 v 57.21212 h 57.21212 v 57.21212 h 400.48485 v -57.21212 h 57.21212 v -57.21212 h 57.21212 V 337.04545 Z m 0,400.48485 h -57.21212 v 57.21212 h -57.21212 v 57.21212 H 328.9697 V 794.74242 H 271.75758 V 737.5303 H 214.54546 V 565.89394 h 57.21212 v -57.21212 h 400.48485 v 57.21212 h 57.21212 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View file

@ -0,0 +1,386 @@
<?php
$CONFIG['CONFERENCE'] = array(
/**
* Der Startzeitpunkt der Konferenz als Unix-Timestamp. Befinden wir uns davor, wird die Closed-Seite
* mit einem Text der Art "hat noch nicht angefangen" angezeigt.
*
* Wird dieser Zeitpunkt nicht angegeben, gilt die Konferenz immer als angefangen. (Siehe aber ENDS_AT
* und CLOSED weiter unten)
*/
'STARTS_AT' => strtotime("2023-10-29 12:00"),
/**
* Der Endzeitpunkt der Konferenz als Unix-Timestamp. Befinden wir uns danach, wird eine Danke-Und-Kommen-Sie-
* Gut-Nach-Hause-Seite sowie einem Ausblick auf die kommenden Events angezeigt.
*
* Wird dieser Zeitpunkt nicht angegeben, endet die Konferenz nie. (Siehe aber CLOSED weiter unten)
*/
'ENDS_AT' => strtotime("2023-10-29 16:00"),
/**
* Hiermit kann die Funktionalitaet von STARTS_AT/ENDS_AT überschrieben werden. Der Wert 'before'
* simuliert, dass die Konferenz noch nicht begonnen hat. Der Wert 'after' simuliert, dass die Konferenz
* bereits beendet ist. 'running' simuliert eine laufende Konferenz.
*
* Der Boolean true ist aus Abwärtskompatibilitätsgründen äquivalent zu 'after'. False ist äquivalent
* zu 'running'.
*/
// 'CLOSED' => true,
/**
* 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' => 'Jugend hackt Hamburg 2023',
/**
* Veranstalter
* Wird für den <meta name="author">-Tag verdet. Wird diese Zeile auskommentiert, wird kein solcher
* <meta>-Tag generiert.
*/
'AUTHOR' => 'Jugend hackt 2023',
/**
* Beschreibungstext
* Wird für den <meta name="description">-Tag verdet. Wird diese Zeile auskommentiert, wird kein solcher
* <meta>-Tag generiert.
*/
//'DESCRIPTION' => '',
/**
* Schlüsselwortliste, Kommasepariert
* Wird für den <meta name="keywords">-Tag verdet. Wird diese Zeile auskommentiert, wird kein solcher
* <meta>-Tag generiert.
*/
// 'KEYWORDS' => '',
/**
* 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="http://jugendhackt.de/">Jugend hackt 2023</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' => '<img src="../configs/conferences/jh23hh/illustrationen.svg" class="jh-illus">',
/**
* Link zu den Recordings
* Wird diese Zeile auskommentiert, wird der Link nicht angezeigt
*/
'RELEASES' => 'https://media.ccc.de/b/events/jugendhackt/2023',
/**
* 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' => 'configs/conferences/jh-rn-2021/vod.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
*/
$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 $CONFIG['ROOMS'] konfiguriert werden,
* sonst werden sie nicht angezeigt.
*/
'GROUPS' => array(
'Lecture Rooms' => array(
'saal',
),
),
);
/**
* Liste der Räume (= Audio & Video Produktionen, also auch DJ-Sets .)
*/
$CONFIG['ROOMS'] = array(
/**
* Array-Key ist der Raum-Slug, der z.B. auch zum erstellen der URLs,
* in $CONFIG['OVERVIEW'] oder im Feedback verwendet wird.
*/
'saal' => array(
/**
* Angezeige-Name
*/
'DISPLAY' => 'Betahaus',
/**
* 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' => 's5',
/**
* 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,
/** Wenn aktiviert, wird DASH streaming angeboten */
'DASH' => true,
/**
* 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' => true,
'H264_ONLY' => true,
/**
* 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 $CONFIG['SCHEDULE']-Blocks deaktiviert werden
*/
'SCHEDULE' => true,
/**
* Name des Raums im Fahrplan
* Wenn diese Zeile auskommentiert ist wird der Raum-Slug verwendet
*/
'SCHEDULE_NAME' => 'Betahaus',
/**
* 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 $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 $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 $CONFIG['EMBED']-Blocks deaktiviert werden
*/
'EMBED' => true,
/**
* 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 $CONFIG['IRC']-Blocks deaktiviert werden
*/
'IRC' => false,
/**
* Mit dem Angaben in diesem Block können die Vorgaben aus dem
* globalen $CONFIG['IRC'] Block überschrieben werden.
*
* Der globale $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 $CONFIG['TWITTER']-Blocks deaktiviert werden
**/
'TWITTER' => true,
/**
* Mit dem Angaben in diesem Block können die Vorgaben aus dem
* globalen $CONFIG['TWITTER'] Block überschrieben werden.
*
* Der globale $CONFIG['TWITTER']-Block muss trotzdem existieren,
* da sonst überhaupt kein IRC-Link erzeugt wird. (ggf. einfach `= true` setzen)
*/
'TWITTER_CONFIG' => array(
'DISPLAY' => '#jhhh23 @ mastodon',
'TEXT' => '#jhhh23 #jugendhackt',
),
),
);
/**
* Globaler Schalter für die Embedding-Funktionalitäten
*
* Wird diese Zeile auskommentiert oder auf False gesetzt, werden alle
* Embedding-Funktionen deaktiviert.
*/
$CONFIG['EMBED'] = true;
/**
* Konfigurationen zum Konferenz-Fahrplan
* Wird dieser Block auskommentiert, werden alle Fahrplan-Bezogenen Features deaktiviert
*/
$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' => 'https://pretalx.c3voc.de/jhhh23/schedule/export/schedule.xml',
/**
* Nur die angegebenen Räume aus dem Fahrplan beachten
*
* Wird diese Zeile auskommentiert, werden alle Räume angezeigt
*/
//'ROOMFILTER' => array('Hörsaal'),
/**
* 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 */ '2019-05-21') - strtotime(/* Today */ '2019-05-19'),
'SIMULATE_OFFSET' => 0,
);
return $CONFIG;

View file

@ -0,0 +1,775 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="503.24649"
height="169.02229"
viewBox="0 0 503.2465 169.02229"
id="svg4295"
version="1.1"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
sodipodi:docname="illustrationen.svg">
<defs
id="defs4297">
<style
id="style1702">
.cls-1 {
fill: #00a6de;
}
</style>
<style
id="style1722">
.cls-1 {
fill: #00b48d;
}
.cls-2 {
fill: #fff;
}
</style>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.1747185"
inkscape:cx="316.49225"
inkscape:cy="143.00881"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
inkscape:window-width="1869"
inkscape:window-height="1056"
inkscape:window-x="1971"
inkscape:window-y="24"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-others="false"
inkscape:snap-nodes="false"
inkscape:snap-global="false">
<sodipodi:guide
position="336.33197,50.255833"
orientation="0,1"
id="guide4185"
inkscape:locked="false" />
<sodipodi:guide
position="333.80659,86.873863"
orientation="1,0"
id="guide4187"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata4300">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-0.04883092,-883.08807)">
<g
transform="translate(327.05204,882.37409)"
id="g131">
<g
id="text4153"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:40px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<g
id="g1466"
style="font-family:none;mix-blend-mode:normal;fill:none;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0"
text-anchor="none"
font-size="none"
font-weight="none"
stroke-miterlimit="10"
transform="matrix(0.26857356,0,0,0.26857356,-42.206747,807.93224)">
<g
id="Ebene_1">
<path
id="path1453"
d="m 328.9697,851.95455 v 0 0 -57.21212 H 271.75758 V 737.53031 H 214.54546 V 565.89395 h 57.21212 v -57.21212 h 400.48485 v 57.21212 h 57.21212 v 171.63636 h -57.21212 v 57.21212 h -57.21212 v 57.21212 z"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<g
id="g1461"
style="fill:#000000">
<rect
id="rect1455"
height="7"
width="7"
transform="scale(8.17316)"
y="76.238083"
x="33.25" />
<rect
id="rect1457"
height="7"
width="7"
transform="scale(8.17316)"
y="76.238083"
x="75.25" />
<path
id="path1459"
d="M 500.60606,737.5303 H 443.39394 V 680.31818 H 386.18182 V 794.74242 H 557.81818 V 680.31818 h -57.21212 z"
inkscape:connector-curvature="0" />
</g>
<path
id="path1463"
d="M 729.45455,337.04545 V 279.83333 H 615.03031 v 57.21212 h -57.21212 v 57.21212 H 386.18183 V 337.04545 H 328.96971 V 279.83333 H 214.54547 v 57.21212 h -57.21212 v 457.69697 h 57.21212 v 57.21212 h 57.21212 v 57.21212 h 400.48485 v -57.21212 h 57.21212 v -57.21212 h 57.21212 V 337.04545 Z m 0,400.48485 h -57.21212 v 57.21212 h -57.21212 v 57.21212 H 328.9697 V 794.74242 H 271.75758 V 737.5303 H 214.54546 V 565.89394 h 57.21212 v -57.21212 h 400.48485 v 57.21212 h 57.21212 z"
inkscape:connector-curvature="0"
style="fill:#ea680c" />
</g>
</g>
<g
id="g1720"
transform="translate(225.29808,883.23538)">
<polygon
id="polygon1708"
points="7,77 7,84 14,84 14,91 21,91 21,98 28,98 28,105 35,105 35,112 28,112 28,119 21,119 21,126 14,126 14,168 21,168 21,147 28,147 28,168 56,168 56,147 63,147 63,168 70,168 70,126 63,126 63,119 56,119 56,112 49,112 49,105 56,105 56,98 63,98 63,91 70,91 70,84 77,84 77,77 84,77 84,14 77,14 77,7 70,7 70,0 14,0 14,7 7,7 7,14 0,14 0,77 "
class="cls-1"
style="fill:#00a6de" />
<path
id="path1710"
d="m 28,70 h 3.5 V 66.5 H 28 v -7 H 24.5 V 56 H 14 v 3.5 H 10.5 V 63 H 14 v 3.5 h 3.5 V 70 Z m 7,14 h 3.5 V 80.5 H 35 Z m 10.5,0 H 49 v -3.5 h -3.5 z m 7,7 h -21 v 3.5 h 21 z m 21,-28 V 59.5 H 70 V 56 H 59.5 v 3.5 H 56 v 7 H 52.5 V 70 h 14 V 66.5 H 70 V 63 Z"
inkscape:connector-curvature="0" />
</g>
<g
id="g1989"
transform="translate(363.29531,883.23538)">
<g
id="g1800">
<rect
id="rect1728"
height="7"
width="7"
y="119"
x="49"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1730"
height="7"
width="7"
y="126"
x="42"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1732"
height="7"
width="7"
y="126"
x="56"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1734"
height="7"
width="7"
y="133"
x="49"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1736"
height="7"
width="7"
y="140"
x="42"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1738"
height="7"
width="7"
y="147"
x="49"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1740"
height="7"
width="7"
y="147"
x="35"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1742"
height="7"
width="7"
y="140"
x="56"
class="cls-1"
style="fill:#00b48d" />
<polygon
id="polygon1744"
points="77,147 70,147 63,147 63,154 70,154 77,154 "
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1746"
height="7"
width="7"
y="140"
x="77"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1748"
height="7"
width="7"
y="147"
x="84"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1750"
height="7"
width="7"
y="140"
x="91"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1752"
height="7"
width="7"
y="147"
x="98"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1754"
height="7"
width="7"
y="154"
x="91"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1756"
height="7"
width="7"
y="154"
x="77"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1758"
height="7"
width="7"
y="154"
x="56"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1760"
height="7"
width="7"
y="154"
x="42"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1762"
height="7"
width="7"
y="161"
x="35"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1764"
height="7"
width="7"
y="161"
x="49"
class="cls-1"
style="fill:#00b48d" />
<polygon
id="polygon1766"
points="70,161 63,161 63,168 70,168 77,168 77,161 "
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1768"
height="7"
width="7"
y="161"
x="84"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1770"
height="7"
width="7"
y="161"
x="98"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1772"
height="7"
width="7"
y="154"
x="105"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1774"
height="7"
width="7"
y="154"
x="28"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1776"
height="7"
width="7"
y="147"
x="21"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1778"
height="7"
width="7"
y="140"
x="14"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1780"
height="7"
width="7"
y="133"
x="7"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1782"
height="7"
width="7"
y="147"
x="112"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1784"
height="7"
width="7"
y="140"
x="119"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1786"
height="7"
width="7"
y="133"
x="126"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1788"
height="7"
width="7"
y="126"
x="77"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1790"
height="7"
width="7"
y="126"
x="91"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1792"
height="7"
width="7"
y="133"
x="84"
class="cls-1"
style="fill:#00b48d" />
<rect
id="rect1794"
height="7"
width="7"
y="119"
x="84"
class="cls-1"
style="fill:#00b48d" />
<polygon
id="polygon1796"
points="119,21 112,21 112,14 105,14 105,7 98,7 98,0 91,0 84,0 84,0 84,0 77,0 77,7 84,7 84,14 91,14 91,21 98,21 98,28 105,28 105,35 98,35 98,28 91,28 91,21 84,21 84,14 77,14 77,7 70,7 63,7 63,14 56,14 56,21 49,21 49,28 42,28 42,35 35,35 35,28 42,28 42,21 49,21 49,14 56,14 56,7 63,7 63,0 56,0 49,0 49,0 42,0 42,7 35,7 35,14 28,14 28,21 21,21 21,28 14,28 14,35 7,35 7,42 0,42 0,49 0,56 0,56 0,63 0,70 0,77 7,77 7,84 14,84 21,84 21,91 21,98 28,98 28,105 35,105 42,105 42,112 42,119 49,119 49,112 56,112 56,119 63,119 63,126 70,126 77,126 77,119 84,119 84,112 91,112 91,119 98,119 98,112 98,105 105,105 112,105 112,98 119,98 119,91 119,84 126,84 133,84 133,77 140,77 140,70 140,63 140,56 140,56 140,49 140,42 133,42 133,35 126,35 126,28 119,28 "
class="cls-1"
style="fill:#00b48d" />
<polygon
id="polygon1798"
points="63,140 70,140 77,140 77,133 70,133 63,133 "
class="cls-1"
style="fill:#00b48d" />
</g>
<g
id="g1818">
<rect
id="rect1802"
height="3.5"
width="3.5"
y="52.5"
x="80.5" />
<rect
id="rect1804"
height="3.5"
width="3.5"
y="52.5"
x="31.5" />
<rect
id="rect1806"
height="3.5"
width="21"
y="49"
x="84" />
<rect
id="rect1808"
height="3.5"
width="21"
y="49"
x="35" />
<rect
id="rect1810"
height="3.5"
width="3.5"
y="52.5"
x="105" />
<rect
id="rect1812"
height="3.5"
width="3.5"
y="52.5"
x="56" />
<polygon
id="polygon1814"
points="80.5,68.25 80.5,71.75 84,71.75 84,77 91,77 98,77 105,77 105,71.75 108.5,71.75 108.5,68.25 105,68.25 105,63 98,63 91,63 84,63 84,68.25 " />
<polygon
id="polygon1816"
points="31.5,68.25 31.5,71.75 35,71.75 35,77 42,77 49,77 56,77 56,71.75 59.5,71.75 59.5,68.25 56,68.25 56,63 49,63 42,63 35,63 35,68.25 " />
</g>
<g
id="g1896">
<polygon
id="polygon1820"
points="63,13.87 63,7 70,7 77,7 77,0 70,0 63,0 63,6.87 56,6.87 56,13.87 "
class="cls-2"
style="fill:#ffffff" />
<polygon
id="polygon1822"
points="70,98 77,98 77,91 70,91 63,91 63,98 "
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1824"
height="7"
width="7"
y="7"
x="77"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1826"
height="7"
width="7"
y="13.87"
x="49"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1828"
height="7"
width="7"
y="20.870001"
x="42"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1830"
height="7"
width="7"
y="27.870001"
x="35"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1832"
height="7"
width="7"
y="14"
x="84"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1834"
height="7"
width="7"
y="21"
x="91"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1836"
height="7"
width="7"
y="28"
x="98"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1838"
height="7"
width="7"
y="112"
x="84"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1840"
height="7"
width="7"
y="126"
x="84"
class="cls-2"
style="fill:#ffffff" />
<polygon
id="polygon1842"
points="63,133 70,133 77,133 77,126 70,126 63,126 "
class="cls-2"
style="fill:#ffffff" />
<polygon
id="polygon1844"
points="70,154 63,154 63,161 70,161 77,161 77,154 "
class="cls-2"
style="fill:#ffffff" />
<polygon
id="polygon1846"
points="77,140 70,140 63,140 63,147 70,147 77,147 "
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1848"
height="7"
width="7"
y="140"
x="84"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1850"
height="7"
width="7"
y="154"
x="84"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1852"
height="7"
width="7"
y="112"
x="49"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1854"
height="7"
width="7"
y="126"
x="49"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1856"
height="7"
width="7"
y="140"
x="49"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1858"
height="7"
width="7"
y="154"
x="49"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1860"
height="7"
width="7"
y="119"
x="77"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1862"
height="7"
width="7"
y="133"
x="77"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1864"
height="7"
width="7"
y="147"
x="77"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1866"
height="7"
width="7"
y="161"
x="77"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1868"
height="7"
width="7"
y="161"
x="91"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1870"
height="7"
width="7"
y="147"
x="91"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1872"
height="7"
width="7"
y="133"
x="91"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1874"
height="7"
width="7"
y="119"
x="91"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1876"
height="7"
width="7"
y="119"
x="56"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1878"
height="7"
width="7"
y="133"
x="56"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1880"
height="7"
width="7"
y="147"
x="56"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1882"
height="7"
width="7"
y="161"
x="56"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1884"
height="7"
width="7"
y="161"
x="42"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1886"
height="7"
width="7"
y="147"
x="42"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1888"
height="7"
width="7"
y="133"
x="42"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1890"
height="7"
width="7"
y="119"
x="42"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1892"
height="7"
width="7"
y="154"
x="35"
class="cls-2"
style="fill:#ffffff" />
<rect
id="rect1894"
height="7"
width="7"
y="154"
x="98"
class="cls-2"
style="fill:#ffffff" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

View file

@ -0,0 +1,198 @@
@import "../../../assets/css/_structure.less";
// conference specific styles here
// conference specific styles here
@pw-color: black;
@bg-cyan: #00a6de;
@body-text: @pw-color;
@overview-color: @pw-color;
@darker-grey: #52575b;
@dark-grey: lighten(@darker-grey, 10%);
@light-grey: lighten(@darker-grey, 20%);
@lighter-grey: lighten(@darker-grey, 30%);
// often configured values (and their defaults):
//
@brand-primary: @darker-grey;
@text-color: @body-text;
@link-color: @body-text;
@link-hover-color: @lighter-grey;
// @navbar-height: 70px;
@navbar-default-bg: @light-grey;
@navbar-default-border: @light-grey;
@navbar-default-link-color: @pw-color;
@navbar-default-link-hover-color: @link-hover-color;
@font-face {
font-family: 'Source Sans Pro';
src: url('/configs/conferences/jh23hh/SourceSansPro-Regular.ttf.woff2') format('woff2');
}
body {
background-image: url("/configs/conferences/jh23hh/bg.png");
background-repeat: repeat;
background-attachment: fixed;
background-size: 100%;
padding: @navbar-height 0;
font-family: "Source Sans Pro","Noto Sans",Arial,sans-serif;
font-size: 16px
}
h1, h2, body.overview .room a.title, body.overview .panel-primary a, .navbar-brand {
font-weight: bold;
}
.group-live {
margin-top: 60px;
}
.room {
h1 {
font-weight: bold;
margin: 40px 0 20px 0;
color: @bg-cyan;
}
}
.overview, .relive {
h1, h2 {
font-weight: bold;
margin: 40px 0 20px 0;
color: @bg-cyan;
}
}
.room, .recordings, .recording {
a, a:hover {
text-decoration: none;
color: @overview-color;
}
.panel {
//background: none;
background-color: @lighter-grey;
border: 1px solid @dark-grey;
&:hover {
text-decoration: none;
background-color: @dark-grey;
}
.panel-title {
font-size: 25px;
color: @overview-color;
}
.panel-primary {
background-color: @lighter-grey;
border-color: @lighter-grey;
color: @overview-color;
a {
color: @overview-color;
}
}
.panel-heading {
background: none;
display: block !important;
font-weight: bold;
padding: 8px 15px;
a {
color: @overview-color;
}
}
}
}
.overview .room-group-live-music .room .panel .panel-body {
margin-bottom: 0;
}
.well a {
color: @dark-grey;
text-decoration: underline;
}
.alert {
a {
text-decoration: underline;
}
&.alert-success a {
color: @state-success-text;
}
&.alert-info a {
color: @state-info-text;
}
&.alert-warning a {
color: @state-warning-text;
}
&.alert-danger a {
color: @state-danger-text;
}
}
body.multiview .cell {
color: black;
}
.closed .about a {
text-decoration: underline;
color: @brand-primary;
}
.schedule .block.pause {
color: black !important;
}
footer {
background-color: @darker-grey;
color: lightgrey;
}
.nav-tabs.nav-justified > .active > a{
border: 1px solid @dark-grey;
background-color: white;
}
.nav-tabs > li.active > a {
color: @pw-color
}
.nav-tabs > li > a {
background-color: white;
}
body.room .tab-content {
background-color: @lighter-grey;
border-left: 1px solid @dark-grey;
border-bottom: 1px solid @dark-grey;
border-right: 1px solid @dark-grey;
}
img.jh-logo {
height: 130px;
position: absolute;
top: 55px;
left: 10px;
z-index: -100;
}
img.jh-illus {
height: 100px;
position: absolute;
top: 70px;
right: 10px;
z-index: -100;
}

View file

@ -52,14 +52,20 @@ if(isset($argv) && isset($argv[1]))
try {
if(isset($_GET['htaccess']))
{
$route = @$_GET['route'];
$route = isset($_GET['route']) ? $_GET['route'] : "";
}
elseif(isset($_SERVER["REQUEST_URI"]))
{
$route = ltrim(@$_SERVER["REQUEST_URI"], '/');
$route = ltrim($_SERVER["REQUEST_URI"], '/');
// trim query params from file names
$filepath = $_SERVER["DOCUMENT_ROOT"].'/'.$route;
if (strpos($filepath, "?")) {
$filepath = substr($filepath, 0, strpos($filepath, "?"));
}
// serve static
if($route != '' && file_exists($_SERVER["DOCUMENT_ROOT"].'/'.$route))
if($route != '' && is_file($filepath))
{
return false;
}
@ -87,11 +93,12 @@ try {
'conference' => new GenericConference(),
));
if(startswith('//', @$GLOBALS['CONFIG']['BASEURL']))
if(isset($GLOBALS['CONFIG']['BASEURL']) && startswith('//', $GLOBALS['CONFIG']['BASEURL']))
{
$mandator = isset($GLOBALS['MANDATOR']) ? $GLOBALS['MANDATOR'] : "";
$tpl->set(array(
'httpsurl' => forceslash(forceslash('https:'.$GLOBALS['CONFIG']['BASEURL']).@$GLOBALS['MANDATOR']).forceslash($route).url_params(),
'httpurl' => forceslash(forceslash('http:'. $GLOBALS['CONFIG']['BASEURL']).@$GLOBALS['MANDATOR']).forceslash($route).url_params(),
'httpsurl' => forceslash(forceslash('https:'.$GLOBALS['CONFIG']['BASEURL']).$mandator).forceslash($route).url_params(),
'httpurl' => forceslash(forceslash('http:'. $GLOBALS['CONFIG']['BASEURL']).$mandator).forceslash($route).url_params(),
));
}
@ -128,7 +135,7 @@ try {
exit;
}
@list($mandator, $route) = explode('/', $route, 2);
list($mandator, $route) = array_pad(explode('/', $route, 2), 2, "");
if(!$mandator)
{
// root requested

View file

@ -13,10 +13,12 @@ if(!function_exists('h'))
class PhpTemplate
{
private $data = array();
public $file;
public function __construct($file)
{
$this->file = $file;
$this->data["naked"] = false;
}
public function set($___data = array())

View file

@ -36,6 +36,9 @@ function joinpath($parts)
function forceslash($url)
{
if ($url == NULL) {
$url = "";
}
$url = rtrim($url, '/');
if(strlen($url) > 0)
$url .= '/';
@ -241,8 +244,20 @@ function query_data($operation, $query, $variables = [], $assoc = false, $cache
if (is_null($r)) {
throw new NotFoundException();
}
// TODO: add error handling?
// TODO: should we return the cached value, when we did not get an answer?
return $assoc ? @$r['data'] : @$r->data;
if ($assoc) {
if (isset($r['data'])) {
return $r['data'];
} else {
throw new NotFoundException();
}
} else {
if (isset($r->data)) {
return $r->data;
} else {
throw new NotFoundException();
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -20,7 +20,7 @@ class Conference extends ModelBase
}
public function isPreviewEnabled() {
if(@$GLOBALS['forceopen'])
if(isset($GLOBALS['forceopen']) && $GLOBALS['forceopen'])
return true;
if($this->has('PREVIEW_DOMAIN') && ($this->get('PREVIEW_DOMAIN') == $_SERVER['SERVER_NAME']))

View file

@ -12,26 +12,32 @@ class ConferenceJson extends Conference
$c = $json->conference;
$this->start = DateTime::createFromFormat(DateTimeInterface::ISO8601, $c->start);
$this->end = DateTime::createFromFormat(DateTimeInterface::ISO8601, $c->end);
$this->html = @$c->streamingConfig->html ?: [];
$this->html = isset($c->streamingConfig->html) ? $c->streamingConfig->html : [];
$this->rooms = [];
$rooms = (is_array(@$c->rooms) ? $c->rooms : @$c->rooms->nodes) ?: [];
if (isset($c->rooms)) {
if (is_array($c->rooms)) {
$rooms = $c->rooms;
} else {
$rooms = isset($c->rooms->nodes) ? $c->rooms->nodes : [];
}
}
foreach($rooms as $r) {
if (!$r) {
continue;
}
$this->rooms[$r->slug] = array_merge(
['stream' => $r->streamId],
get_object_vars($r),
@get_object_vars($r->streamingConfig) ?: [],
@get_object_vars($r->streamingConfig->chat) ?: []
get_object_vars($r),
(isset($r->streamingConfig) ? get_object_vars($r->streamingConfig) : []),
(isset($r->streamingConfig->chat) ? get_object_vars($r->streamingConfig->chat) : [])
);
}
$groups = [];
if ( isset($c->streamingConfig->overviewPage->sections) ) {
foreach(@$c->streamingConfig->overviewPage->sections as $s) {
$groups[@$s->title] = array_map(
foreach($c->streamingConfig->overviewPage->sections as $s) {
$groups[$s->title] = array_map(
function($r) { return $r->slug; },
@$s->items ?: @$s->rooms ?: []
);
@ -44,15 +50,15 @@ class ConferenceJson extends Conference
$acronym = $mandator ?: $c->acronym;
parent::__construct(array_merge(
@get_object_vars($c->streamingConfig) ?: [],
@get_object_vars($c->streamingConfig->features) ?: [],
@get_object_vars($c->streamingConfig->features->chat) ?: [],
isset($c->streamingConfig) ? get_object_vars($c->streamingConfig) : [],
isset($c->streamingConfig->features) ? get_object_vars($c->streamingConfig->features) : [],
isset($c->streamingConfig->features->chat) ? get_object_vars($c->streamingConfig->features->chat) : [],
[
'conference' => [
'title' => $c->title,
'author' => $c->organizer,
'description' => $c->description,
'keywords' => @implode(', ', $c->keywords),
'keywords' => is_array($c->keywords) ? implode(', ', $c->keywords) : "",
// future TODO: change structure
"relive_json" => @$c->streamingConfig->features->relive !== false ? "https://cdn.c3voc.de/relive/".$acronym."/index.json" : null,
"releases" => @$c->streamingConfig->features->releases !== false ? "https://media.ccc.de/c/".$acronym : null
@ -140,21 +146,21 @@ class ConferenceJson extends Conference
return !empty($this->html->banner);
}
public function getBannerHtml() {
return @$this->html->banner;
return isset($this->html->banner) ? $this->html->banner : "";
}
public function hasFooterHtml() {
return !empty($this->html->footer);
}
public function getFooterHtml() {
return @$this->html->footer;
return isset($this->html->footer) ? $this->html->footer : "";
}
public function hasNotStartedHtml() {
return !empty($this->html->not_started);
}
public function getNotStartedHtml() {
return @$this->html->not_started;
return isset($this->html->not_started) ? $this->html->not_started : "";
}
}

View file

@ -65,7 +65,8 @@ class Conferences
}
public static function getLastConference() {
return @Conferences::getFinishedConferencesSorted()[0];
$conferences = Conferences::getFinishedConferencesSorted();
return isset($conferences[0]) ? $conferences[0] : null;
}
public static function exists($mandator) {
@ -133,7 +134,7 @@ class Conferences
}
// config option for dynamic lookup feature defined below
if (!@$GLOBALS['CONFIG']['DYNAMIC_LOOKUP']) {
if (isset($GLOBALS['CONFIG']['DYNAMIC_LOOKUP']) && !$GLOBALS['CONFIG']['DYNAMIC_LOOKUP']) {
throw new NotFoundException();;
}

View file

@ -10,9 +10,10 @@ class Feedback
}
private function get($key) {
$global_feedback_elem = isset($GLOBALS['CONFIG']['FEEDBACK'][$key]) ? $GLOBALS['CONFIG']['FEEDBACK'][$key] : "";
return $this->conference->has(['FEEDBACK', $key])
? $this->conference->get(['FEEDBACK', $key])
: @$GLOBALS['CONFIG']['FEEDBACK'][$key];
: $global_feedback_elem;
}
public function getConference() {

View file

@ -2,6 +2,8 @@
class Overview
{
public $conference;
public function __construct(Conference $conference)
{
$this->conference = $conference;

View file

@ -50,12 +50,20 @@ class Room
}
public function getSlug() {
return $this->slug;
if ($this->slug != NULL) {
return $this->slug;
} else {
return "";
}
}
private function get($key, $fallbackValue = null) {
$keychain = 'ROOMS.'.$this->getSlug().'.'.$key;
return $this->conference->get($keychain, $fallbackValue ?: @$GLOBALS['CONFIG']['ROOM_DEFAULTS'][$key]);
$fallback = null;
if (isset($GLOBALS['CONFIG']['ROOM_DEFAULTS'][$key])) {
$fallback = $GLOBALS['CONFIG']['ROOM_DEFAULTS'][$key];
}
return $this->conference->get($keychain, $fallbackValue ?: $fallback);
}
private function has($key) {

View file

@ -2,6 +2,9 @@
class RoomSelection
{
public $room;
public $selection;
public function __construct(Room $room, $selection)
{
$this->room = $room;

View file

@ -2,6 +2,9 @@
class RoomTab
{
public $room;
public $tab;
public function __construct(Room $room, $tab)
{
$this->room = $room;

View file

@ -54,7 +54,8 @@ class Schedule
public function getMappedRoom($scheduleRoom) {
$mapping = $this->getScheduleToRoomSlugMapping();
return $this->getConference()->getRoomIfExists( @$mapping[$scheduleRoom] );
$room = isset($mapping[$scheduleRoom]) ? $mapping[$scheduleRoom] : "";
return $this->getConference()->getRoomIfExists( $room );
}
public function getScheduleDisplayTime($basetime = null)
@ -68,12 +69,16 @@ class Schedule
private function fetchSchedule()
{
$schedule = @file_get_contents($this->getScheduleCache());
if(!$schedule)
try {
$schedule = file_get_contents($this->getScheduleCache());
if(!$schedule)
return null;
return simplexml_load_string($schedule);
} catch (ErrorException $e) {
return null;
return simplexml_load_string($schedule);
}
}
public function getRoomSchedule($roomName, $roomGuid) {
@ -359,7 +364,15 @@ class Schedule
$this->mapping = array();
foreach($this->getConference()->get('ROOMS') as $slug => $room)
{
$key = @$room['name'] ?: @$room['SCHEDULE_NAME'] ?: @$room['DISPLAY'] ?: $slug;
// json has 'name', config.php has 'SCHEDULE_NAME' and 'DISPLAY'
$key = $slug;
if (isset($room['name'])) {
$key = $room['name'];
} elseif ($room['SCHEDULE_NAME']) {
$key = $room['SCHEDULE_NAME'];
} elseif ($room['DISPLAY']) {
$key = $room['DISPLAY'];
}
$this->mapping[$key] = $slug;
}
}

View file

@ -2,6 +2,11 @@
class Stream
{
public $room;
public $selection;
public $language;
public $translation_label;
public function __construct(Room $room, $selection, $language, $translation_label = null)
{
$this->room = $room;

View file

@ -102,7 +102,7 @@
<div class="form-group">
<label for="datetime">Date/Time</label>
<input type="text" value="<?=h(strftime('%d.%m.%Y %H:%I'))?>" name="datetime" id="datetime" class="form-control" />
<input type="text" value="<?=h(date('d.m.Y H:i'))?>" name="datetime" id="datetime" class="form-control" />
</div>
<div class="form-group">

View file

@ -25,8 +25,13 @@
<div class="room <? if(isset($room) && ($roomname == $room->getScheduleName() || ($scheduleRoom && $scheduleRoom->getId() === $room->getId()))): ?>highlight<? endif ?>" style="width: <?= h($totalWidth) ?>px">
<? $fromstart = 0; ?>
<? foreach($events as $event): ?>
<? $special = isset($event['special']) ? $event['special'] : ''; ?>
<? $event_is_optout = isset($event['optout']) ? $event['optout'] : false; ?>
<? $event_guid = isset($event['guid']) ? $event['guid'] : ''; ?>
<? $event_url = isset($event['url']) ? $event['url'] : ''; ?>
<? $event_title = isset($event['title']) ? $event['title'] : ''; ?>
<div
class="block <?=h(@$event['special'] ?: 'event')?> <?=h((@$event['optout']) ? 'optout' : '')?>"
class="block <?=h($special ?: 'event')?> <?=h($event_is_optout ? 'optout' : '')?>"
style="width: <?=h(round($event['duration'] / $schedule->getScale()))?>px; left: <?=h(round($fromstart / $schedule->getScale()))?>px"
data-start="<?=intval($event['start'])?>"
data-end="<?=intval($event['end'])?>"
@ -42,21 +47,21 @@
href="<?=h($scheduleRoom->createTabObject()->getLink($roomname))?>"
<? endif ?>
title="Switch to <?=h($scheduleRoom->getDisplay())?>"
onmouseover="showEventDetails(event, {title:'<?=@$event['title']?>', guid:'<?=@$event['guid']?>', url:'<?=@$event['url']?>', type:'<?=@$event['special']?>'})"
onmouseover="showEventDetails(event, {title:'<?=$event_title?>', guid:'<?=$event_guid?>', url:'<?=$event_url?>', type:'<?=@$special?>'})"
>
<? else: ?>
<div class="inner">
<? endif ?>
<? if(@$event['special'] == 'daychange'): ?>
<? if(@$special == 'daychange'): ?>
<h3><?=h($event['title'])?></h3>
<? elseif(@$event['special'] == 'gap'): ?>
<? elseif(@$special == 'gap'): ?>
<!--h3>Gap</h3-->
<? elseif(@$event['special'] == 'pause'): ?>
<? elseif(@$special == 'pause'): ?>
<h3><?=h($event['title'])?></h3>
@ -70,7 +75,7 @@
</h4>
<? endif ?>
<h3 title="<?=$event['title']?>">
<?=h($event['title'])?><? if (@$event['optout']): ?><i> (no recording)</i><? endif ?>
<?=h($event['title'])?><? if ($event_is_optout): ?><i> (no recording)</i><? endif ?>
</h3>
<? if(! empty(trim($event['speaker']))): ?>
<h5>by&nbsp;<?=h($event['speaker'])?></h5>

View file

@ -104,14 +104,15 @@
$upcoming = @$upcomingTalksPerRoom[ $room->getSlug() ] ?: [];
// echo var_dump($upcoming);
$current = @$upcoming['current'];
$next = @$upcoming['next']; ?>
$next = @$upcoming['next'];
$next_is_special = isset($next['special']) ? $next['special'] : false; ?>
<div class="program-schedule">
<? if($current && !@$current['special']): ?>
<div class="talk current-talk" title="<?=h(@$current['title'] ?: 'none') ?>">
<strong>Now (since <?=date('G:i', @$current['start']) ?>):</strong><br/>
<span class="t"><?=h(@$current['title'] ?: 'none') ?></span>
</div>
<? endif; if($next && !@$next['special']): ?>
<? endif; if($next && !$next_is_special): ?>
<div class="talk next-talk" title="<?=h(@$next['title'] ?: 'none') ?>">
<strong>Next (<?=date('G:i', @$next['start']) ?>):</strong><br/>
<span class="t"><?=h(@$next['title'] ?: 'none') ?></span>

View file

@ -6,7 +6,7 @@ echo $tpl->render(array(
'page' => 'allclosed',
'title' => 'See you soon … somewhere else!',
'next' => @$events[0],
'next' => isset($events[0]) ? $events[0] : null,
'events' => $events,
'last' => Conferences::getLastConference(),
));

View file

@ -6,6 +6,6 @@ echo $tpl->render(array(
'page' => 'closed',
'title' => 'See you soon … somewhere else!',
'next' => @$events[0],
'next' => isset($events[0]) ? $events[0] : null,
'events' => $events,
));

View file

@ -28,5 +28,5 @@ echo $tpl->render(array(
'room' => $room,
'stream' => $stream,
'autoplay' => @$_GET['autoplay'],
'autoplay' => isset($_GET['autoplay']) ? $_GET['autoplay'] : false,
));

View file

@ -5,5 +5,5 @@ echo $tpl->render(array(
'title' => 'Stream-Übersicht',
'rooms' => $conference->getRooms(),
'selection' => @$_GET['selection'],
'selection' => isset($_GET['selection']) ? $_GET['selection'] : "",
));