Compare commits

...

25 Commits

Author SHA1 Message Date
deepend 036aa94ed3 Update 'schedule/schedule.php'
continuous-integration/drone/push Build is failing Details
continuous-integration/drone Build is passing Details
2022-02-08 22:48:30 +00:00
deepend 5147f82859 Merge pull request 'Change "not product placement" slogan' (#28) from mcornick/site:master into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: tilderadio/site#28
2022-02-08 04:46:31 +00:00
Mark Cornick 0205a9b223
Change "not product placement" slogan
continuous-integration/drone/pr Build encountered an error Details
Change from tildestore.com (something unrelated to the 'verse) to
shop.tildeverse.org
2022-02-07 23:45:00 -05:00
Ben Harris 4b0b058d76 Merge pull request 'fix example config link in djinfo' (#26) from forero/tilderadio-site:master into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: tilderadio/site#26
2021-09-17 18:02:40 +00:00
Santiago Forero eedee8afd6 Merge branch 'master' into master
continuous-integration/drone/pr Build encountered an error Details
2021-09-16 22:18:11 +00:00
Santiago Forero c02cf1e929 fix example config link in djinfo
continuous-integration/drone/pr Build encountered an error Details
2021-09-16 17:05:55 -05:00
Ben Harris b926b0d380 Merge pull request 'remove one header in dmca page' (#25) from forero/tilderadio-site:master into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: tilderadio/site#25
2021-09-15 23:13:51 +00:00
Santiago Forero 43d36bfeec remove one header in dmca page
continuous-integration/drone/pr Build encountered an error Details
2021-09-15 17:13:59 -05:00
Ben Harris 324ae061a5 Merge pull request 'fix typos, mention the web player.' (#24) from lohang/site:master into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: tilderadio/site#24
2021-09-15 03:00:01 +00:00
Lohan G b7389d8907 fix typos, mention the web player.
continuous-integration/drone/pr Build encountered an error Details
2021-09-15 02:56:16 +00:00
Ben Harris 5025739ef6 reorganize links
continuous-integration/drone/push Build is passing Details
2021-09-12 21:32:37 -04:00
Ben Harris 8efcdfab8c update and clarify links
continuous-integration/drone/push Build is passing Details
2021-09-12 20:46:17 -04:00
Ben Harris e5b4379406 tidy up formatting
continuous-integration/drone/push Build is passing Details
2021-09-12 20:13:59 -04:00
Ben Harris af6bb5e0df update azuracast location
continuous-integration/drone/push Build is passing Details
2021-09-12 17:39:16 -04:00
Ben Harris 11f25e9707 Merge pull request 'Validate html' (#23) from forero/tilderadio-site:master into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: tilderadio/site#23
2021-09-01 18:36:33 +00:00
Santiago Forero 1222388339 validate schedule/ html
continuous-integration/drone/pr Build encountered an error Details
2021-09-01 12:48:18 -05:00
Santiago Forero b57596bd47 validate html 2021-09-01 12:39:26 -05:00
Ben Harris 54e91ab6e7 Merge pull request 'close unclosed divs in header.php' (#22) from forero/tilderadiosite:master into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: tilderadio/site#22
2021-09-01 02:22:43 +00:00
Santiago Forero 9cf094f4ef close unclosed divs in header.php
continuous-integration/drone/pr Build encountered an error Details
2021-08-31 21:15:32 -05:00
Ben Harris c006a40edf Merge pull request 'Add current time pointer in schedule' (#21) from cel/tilderadio-site:pointer into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: tilderadio/site#21
2021-06-08 16:05:46 +00:00
Charles E. Lehner 05e101f9e8
Misc fixes for time pointer
continuous-integration/drone/pr Build encountered an error Details
2021-06-07 22:29:23 -04:00
Charles E. Lehner 1e68d971c8
Highlight active half-hour cell
continuous-integration/drone/pr Build encountered an error Details
2021-06-07 21:04:50 -04:00
Charles E. Lehner a731a47f1c
Add current time pointer in schedule
continuous-integration/drone/pr Build encountered an error Details
2021-05-30 14:02:37 -04:00
deepend 8916d836c5 Added Mastodon link to index.php
continuous-integration/drone/push Build is passing Details
2021-05-09 00:22:28 +00:00
deepend aec6cc49ba Merge pull request 'Replace logo with new logo based on the radio emoji in Twemoji 13.0.2' (#20) from khuxkm/tilderadio-site:master into master
continuous-integration/drone/push Build is passing Details
Reviewed-on: tilderadio/site#20
2021-05-02 03:56:39 +00:00
15 changed files with 348 additions and 225 deletions

View File

@ -1,6 +1,6 @@
# redirect proper start
<IfModule mod_rewrite.c>
RewriteEngine On
Redirect 302 /listen https://radio.tildeverse.org/radio/8000/radio.ogg
Redirect 302 /listen https://azuracast.tilderadio.org/radio/8000/radio.ogg
</IfModule>
# redirect proper end

View File

@ -54,7 +54,7 @@ ontop = 1
lcd_auto = 0
[Tilde]
address = radio.tildeverse.org
address = azuracast.tilderadio.org
# live stream
port = 8005
# test stream

View File

@ -53,6 +53,7 @@
vertical-align: middle;
border-left: 1px solid #626E7E;
position: relative;
/* Height here should be synced with $cell_height in ../schedule/calendar.php */
height: 32px;
cursor: pointer;
overflow: hidden;
@ -72,6 +73,26 @@
.calendar tbody tr td.hour span {
display: block;
}
.calendar tbody tr td.active {
border: 1px solid yellow;
}
#pointer {
position: absolute;
left: 0;
right: 0;
border-top: 1px solid red;
z-index: 1;
}
.pointer-label {
color: red;
}
.pointer-label-wrapper {
color: yellow;
}
.show-title {
position: relative;
z-index: 2;
}
@media (max-width: 60em) {
.calendar-wrapper {
display: block;

View File

@ -1,21 +1,11 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://tilde.team/css/hacker.css">
<title>tilderadio dj info</title>
</head>
<body>
<div class="container">
<?php
include __DIR__.'/../header.php';
?>
<h1>how to stream</h1>
<dl>
<dt>Server:</dt>
<dd>radio.tildeverse.org</dd>
<dd>azuracast.tilderadio.org</dd>
<dt>Port:</dt>
<dd>8005</dd>
<dt>Mount Name:</dt>
@ -26,7 +16,7 @@
<a href="https://www.azuracast.com/station-management/djs/streaming_software.html">
azuracast wiki</a></p>
<p>if you're having trouble, try setting your software to broadcast 128kbps mp3</p>
<p><a href="butt.cfg.txt">example butt config</a></p>
<p><a href="/butt.cfg.txt">example butt config</a></p>
<p>pulseaudio wizardry</p>
<pre>
@ -54,10 +44,8 @@ All volume sliders to 100%
</pre>
<p>the test stream is available on port 8015 and you can listen to it
<a href="https://radio.tildeverse.org/public/test">here</a>
or <a href="https://radio.tildeverse.org/radio/8010/radio.ogg">here as ogg</a></p>
</div>
</body>
</html>
<a href="https://azuracast.tilderadio.org/public/test">here</a>
or <a href="https://azuracast.tilderadio.org/radio/8010/radio.ogg">here as ogg</a></p>
<?php
include __DIR__.'/../footer.php';

View File

@ -1,7 +1,4 @@
<?php include 'header.php'; ?>
<h1><a href="https://tilderadio.org"><img style="width:72px;margin-top:-30px;margin-right:5px;" src="./logos/tilderadio.png">tilderadio.org</a></h1>
<br>
<br>
<p><b>Digital Millennium Copyright Act ("DMCA")</b></p>
<p>tilderadio respects the intellectual property rights of others. Per the DMCA, tilderadio will respond expeditiously to claims of copyright infringement on the Site if submitted to tilderadio's Copyright Agent as described below. Upon receipt of a notice alleging copyright infringement, tilderadio will take whatever action it deems appropriate within its sole discretion, including removal of the allegedly infringing materials and termination of access for repeat infringers of copyright protected content.</p>

View File

@ -1,10 +1,11 @@
</div>
<footer class="text-center">
<a href="https://tildegit.org/tilderadio/site">page source</a> | <a href="/dmca.php">DMCA</a>
</footer>
<footer class="text-center">
<a href="https://tildegit.org/tilderadio/site">page source</a> | <a href="/dmca.php">DMCA</a>
</footer>
<script src="/js/jquery.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
</body>
</div>
</html>
<script src="/js/jquery.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
</body>
</html>

View File

@ -8,8 +8,8 @@
</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/hacker.css">
<link rel="stylesheet" href="/css/calendar.css">
<link rel="icon" type="image/png" href="https://tilderadio.org/logos/tilderadio.png"><?=isset($additional_head)?PHP_EOL." ".$additional_head.PHP_EOL:""?>
<link rel="icon" type="image/png" href="/logos/tilderadio.png">
<?=isset($additional_head) ? PHP_EOL . " " . $additional_head . PHP_EOL : ""?>
</head>
<body>
@ -19,18 +19,27 @@
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"> </span>
<span class="icon-bar"> </span>
<span class="icon-bar"> </span>
</button>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="/">home</a></li>
<li><a href="/schedule/">schedule</a></li>
<li><a href="/listen">listen now</a></li>
</ul>
<!--/.nav-collapse -->
</div>
</div>
</nav>
<br><br>
</div>
<br>
<br>
<div class="container">
<h1>
<a href="/"><img style="width:72px;margin-top:-30px;margin-right:5px;" src="/logos/tilderadio.png" alt="">tilderadio.org</a>
</h1>
<hr>

View File

@ -1,32 +1,50 @@
<?php include 'header.php'; ?>
<h1>
<a href="/"><img style="width:72px;margin-top:-30px;margin-right:5px;" src="./logos/tilderadio.png" alt="">tilderadio.org</a>
</h1>
<h4><?=json_decode(file_get_contents("https://bot.tildegit.org/api/slogan"))?></h4>
<p>
TildeRadio is Internet radio streamed by / for users of the <a href="https://tildeverse.org/">tildeverse</a>.
</p>
<p><a href="https://kiwi.tilde.chat/#tilderadio" target="_blank">Join us in #tilderadio</a>, our dedicated IRC channel on <a href="https://tilde.chat">tilde.chat</a></p>
<hr>
<h4>how to listen</h4>
<p><em><?php include 'schedule/nextdj.php'; ?></em></p>
<blockquote><?=json_decode(file_get_contents("https://bot.tildegit.org/api/slogan"))?></blockquote>
<p>tilderadio is internet radio streamed by / for users of the <a href="https://tildeverse.org/">tildeverse</a>.</p>
<p>
<iframe src="https://radio.tildeverse.org/public/tilderadio/embed" frameborder="0" allowtransparency="true" style="width: 100%; min-height: 160px; border: 0;"></iframe>
<a href="https://tilde.chat/kiwi/#tilderadio" target="_blank">Join us in #tilderadio</a>,
our dedicated IRC channel on <a href="https://tilde.chat">tilde.chat</a>
</p>
<p>
Or use the following links in your media player of choice:
<ul>
<li>https://radio.tildeverse.org/radio/8000/radio.ogg</li>
<li>https://radio.tildeverse.org/radio/8000/radio.mp3</li>
</ul>
follow us on mastodon where we announce when DJ's go live!
<a href="https://tilde.zone/@tilderadio" target="_blank">@tilderadio</a>
</p>
<hr>
<h2>how to listen</h2>
<p>use the player at the bottom of the page, or use one of the following links in your media player of choice or visit them in your browser:</p>
<ul>
<li><a href="https://tilderadio.org/listen">https://tilderadio.org/listen</a></li>
<li>
<a href="https://azuracast.tilderadio.org/radio/8000/radio.ogg">
https://azuracast.tilderadio.org/radio/8000/radio.ogg</a> (default, 192 kbps ogg vorbis)
</li>
<li>
<a href="https://azuracast.tilderadio.org/radio/8000/320k.ogg">
https://azuracast.tilderadio.org/radio/8000/320k.ogg</a> (320 kbps ogg vorbis)
</li>
<li>
<a href="https://azuracast.tilderadio.org/radio/8000/radio.mp3">
https://azuracast.tilderadio.org/radio/8000/radio.mp3</a> (192 kbps mp3)
</li>
<li>
<a href="https://azuracast.tilderadio.org/radio/8000/320k.mp3">
https://azuracast.tilderadio.org/radio/8000/320k.mp3</a> (320 kbps mp3)
</li>
</ul>
<hr>
<iframe src="https://azuracast.tilderadio.org/public/tilderadio/embed" style="width: 100%; min-height: 160px; border: 0;"></iframe>
<?php include 'footer.php'; ?>

View File

@ -1,3 +1,2 @@
<?php
$apikey = "my azuracast api key";

View File

@ -1,77 +1,92 @@
<section class="calendar-wrapper">
<h4>upcoming broadcasts</h4>
<?php
function check_in_range($start_date, $end_date, $checkdate) {
$start_ts = strtotime($start_date);
$end_ts = strtotime($end_date);
$ch_ts = strtotime($checkdate);
return (($ch_ts >= $start_ts) && ($ch_ts < $end_ts));
$start_ts = strtotime($start_date);
$end_ts = strtotime($end_date);
$ch_ts = strtotime($checkdate);
return (($ch_ts >= $start_ts) && ($ch_ts < $end_ts));
}
// Create a date range between the schedule start and end dates
$begin = new DateTime($schedule[0]['start']);
$end = new DateTime(end($schedule)['start']);
$begin = new DateTime($schedule[0]['start']);
$end = new DateTime(end($schedule)['start']);
$daterange = new DatePeriod($begin, new DateInterval('P1D'), $end);
?>
<table class="calendar">
<thead>
<tr>
<th></th>
<?php
// Loop over our date range to draw the headers
foreach($daterange as $date){
?>
<th>
<span class="day"><?php echo $date->format("d") ?></span>
<span class="long"><?php echo $date->format("l") ?></span>
<span class="short"><?php echo $date->format("D") ?></span>
</th>
<?php
}
?>
</tr>
</thead>
<tbody>
<thead>
<tr>
<th></th>
<?php
// Loop over our date range to draw the headers
foreach($daterange as $date){ ?>
<th>
<span class="day"><?php echo $date->format("d") ?></span>
<span class="long"><?php echo $date->format("l") ?></span>
<span class="short"><?php echo $date->format("D") ?></span>
</th>
<?php } ?>
</tr>
</thead>
<tbody>
<?php
// time will count us by 30-min increments through the day
$time = mktime(0, 0, 0, 1, 1);
// Loop over the day in 30 min increments
for ($i = 0; $i < 86400; $i += 1800) {
?>
for ($i = 0; $i < 86400; $i += 1800) { ?>
<tr>
<?php
// Only show row if we're on a full hour block. It's a rowspan 2
if ((($i / 1800) % 2) === 0 ) {
?>
<td class="hour" rowspan="2"><span><?php echo date('H', $time + $i) ?>:00</span></td>
<?php
}
?>
<?php
// Only show row if we're on a full hour block. It's a rowspan 2
if ((($i / 1800) % 2) === 0 ) { ?>
<td class="hour" rowspan="2"><span><?php echo date('H', $time + $i) ?>:00</span></td>
<?php } ?>
<?php
// Loop over each day of the week for this 30 min span
foreach($daterange as $date){
// merge date (changing days) and time (incrementing by 30 min) to draw calendar by row.
$merge = new DateTime($date->format('Y-m-d') .' ' .date('H:i:s', $time + $i));
// We'll now use $merge to see if any shows are airing at this time
$match = false;
foreach ($schedule as $show) {
if (check_in_range($show['start'], $show['end'], $merge->format('Y-m-d H:i:s'))) {
echo "<td>" . $show['title'] . "</td>\n";
$match = true;
break;
}
<?php
$now = new DateTime();
$halfhour = new DateInterval('PT30M');
$wrotepointer = false;
// Loop over each day of the week for this 30 min span
foreach ($daterange as $date) {
// merge date (changing days) and time (incrementing by 30 min) to draw calendar by row.
$merge = new DateTime($date->format('Y-m-d') . ' ' . date('H:i:s', $time + $i));
// Set id for this time span, for referencing in JS.
$props = 'id="show-' . $merge->getTimestamp() . '"';
// We'll now use $merge to see if any shows are airing at this time
$matchedshow = null;
foreach ($schedule as $show) {
if (check_in_range($show['start'], $show['end'], $merge->format('Y-m-d H:i:s'))) {
$matchedshow = $show;
break;
}
}
$active = false;
if (!$wrotepointer) {
// If current time is in this range, draw pointer.
$end = DateTimeImmutable::createFromMutable($merge)->add($halfhour);
if ($now >= $merge && $now < $end) {
$active = true;
$props .= ' class="active"';
}
}
echo "<td $props>";
if ($matchedshow) {
echo '<div class="show-title">' . $matchedshow['title'] . '</div>';
// if no match was found, leave an empty node
}
if ($active) {
// Cell height here should be synced with height of '.calendar tbody tr td' in ../css/calendar.css
$height = 32;
$top = round(date_diff($merge, $now)->format('%i') / 30 * ($height-1));
echo '<div id="pointer" style="top:'.$top.'px"></div>';
$wrotepointer = true;
}
echo "</td>\n";
}
// if no match was found, leave an empty node
if (! $match) {
echo "<td></td>\n";
}
}
?>
?>
</tr>
<?php
}
?>
</tbody>
<?php } ?>
</tbody>
</table>
</section>

View File

@ -1,6 +1,6 @@
<?php
$from = gmdate("Y-m-d\T00:00:00\Z",strtotime("today"));
$to = gmdate("Y-m-d\T00:00:00\Z",strtotime("today + 8 days"));
$from = gmdate("Y-m-d\T00:00:00\Z", strtotime("today"));
$to = gmdate("Y-m-d\T00:00:00\Z", strtotime("today + 8 days"));
include 'schedule.php';
function ics_formatdate($date) {
@ -19,56 +19,57 @@ header('Content-Disposition: attachment; filename="tilderadio.ics"');
define("ICS_EOL","\r\n");
// Header.
echo "BEGIN:VCALENDAR".ICS_EOL;
echo "VERSION:2.0".ICS_EOL;
echo "PRODID:tilderadio schedule".ICS_EOL;
echo "DTSTAMP:".ics_formatdate("now").ICS_EOL;
echo "BEGIN:VCALENDAR" . ICS_EOL;
echo "VERSION:2.0" . ICS_EOL;
echo "PRODID:tilderadio schedule" . ICS_EOL;
echo "DTSTAMP:" . ics_formatdate("now") . ICS_EOL;
// A list of event IDs that we have on the calendar, to avoid duplication
$event_ids = array();
$event_ids = [];
foreach ($schedule as $event) {
$id = strval($event["id"]).gmdate("DHis",strtotime($event["start"])).gmdate("DHis",strtotime($event["end"]));
if (!in_array($id,$event_ids)){
array_push($event_ids,$id);
$id = strval($event["id"]) . gmdate("DHis", strtotime($event["start"])) . gmdate("DHis", strtotime($event["end"]));
if (!in_array($id,$event_ids)) {
array_push($event_ids, $id);
// The VEVENT structure's pretty easy to generate, especially since we're already in UTC.
echo "BEGIN:VEVENT".ICS_EOL;
echo "BEGIN:VEVENT" . ICS_EOL;
// First, we need a creation date.
// Just go with now.
echo "DTSTAMP:".ics_formatdate("now").ICS_EOL;
echo "DTSTAMP:" . ics_formatdate("now") . ICS_EOL;
// Next, the event start and end.
echo "DTEND:".ics_formatdate($event["end"]).ICS_EOL;
echo "DTSTART:".ics_formatdate($event["start"]).ICS_EOL;
echo "DTEND:" . ics_formatdate($event["end"]) . ICS_EOL;
echo "DTSTART:" . ics_formatdate($event["start"]) . ICS_EOL;
// Next, the recurrence rule.
if ($event["title"]!="tomasino") {
if ($event["title"] != "tomasino") {
// We assume the format is weekly. (tomasino is the only DJ to have requested any other frequency.)
echo "RRULE:FREQ=WEEKLY".ICS_EOL;
echo "RRULE:FREQ=WEEKLY" . ICS_EOL;
} else {
// TTT only comes on the last Sunday of the month, 23:30:00 UTC to 01:00:00 UTC
if (gmdate("His",strtotime($event["start"]))=="233000" && gmdate("His",strtotime($event["end"]))=="010000") {
echo "RRULE:FREQ=MONTHLY;WKST=SU;BYDAY=SU;BYSETPOS=-1".ICS_EOL;
if (gmdate("His", strtotime($event["start"])) == "233000" && gmdate("His", strtotime($event["end"])) == "010000") {
echo "RRULE:FREQ=MONTHLY;WKST=SU;BYDAY=SU;BYSETPOS=-1" . ICS_EOL;
} else {
// his other shows are weekly though
echo "RRULE:FREQ=WEEKLY".ICS_EOL;
echo "RRULE:FREQ=WEEKLY" . ICS_EOL;
}
}
// Next, the event title, or "summary" as the spec calls it.
echo "SUMMARY:DJ ".$event["title"].ICS_EOL;
echo "SUMMARY:DJ " . $event["title"] . ICS_EOL;
// Finally, a unique ID for this event.
// To make absolutely certain we don't repeat the same event ID, I decided to use a SHA256 hash of the event structure.
echo "UID:";
echo hash("sha256",json_encode($event));
echo hash("sha256", json_encode($event));
// to avoid the validator complaining about lines longer than 75 characters, split after the hash
echo ICS_EOL." ";
echo ICS_EOL . " ";
// Now finish the address UID
echo "@tilderadio.org".ICS_EOL;
echo "@tilderadio.org" . ICS_EOL;
// Finally, close the VEVENT structure.
echo "END:VEVENT".ICS_EOL;
echo "END:VEVENT" . ICS_EOL;
// Next event?
}
}
// Finally, close out the VCALENDAR structure.
echo "END:VCALENDAR".ICS_EOL;
echo "END:VCALENDAR" . ICS_EOL;
?>

View File

@ -1,13 +1,19 @@
<?php
$additional_head='<link rel="alternate" type="text/calendar" href="https://tilderadio.org/schedule/ics.php">';
include '../header.php';
$additional_head='<link rel="stylesheet" href="/css/calendar.css">
<link rel="alternate" type="text/calendar" href="https://tilderadio.org/schedule/ics.php">';
include __DIR__ . '/../header.php';
include 'schedule.php';
?>
<h1><a href="https://tilderadio.org"><img style="width:72px;margin-top:-30px;margin-right:5px;" src="../logos/tilderadio.png">tilderadio.org</a></h1>
<h4>upcoming broadcasts</h4>
<p>all times in UTC. current time is <span id="utcdate"><?=formatdate("now")?></span>.</p>
<p>this schedule is also available in <a href="https://icalendar.org/validator.html?url=https://tilderadio.org/schedule/ics.php">iCalendar format</a>. point your calendar client at <code>https://tilderadio.org/schedule/ics.php</code>.</p>
<p>
all times in UTC. current time is <span id="utcdate"><?=formatdate("now")?></span>
<span class="pointer-label-wrapper">(</span><span class="pointer-label">&mdash;</span><span class="pointer-label-wrapper">)</span>.
</p>
<p>
this schedule is also available in <a href="https://icalendar.org/validator.html?url=https://tilderadio.org/schedule/ics.php">iCalendar format</a>.
point your calendar client at <code>https://tilderadio.org/schedule/ics.php</code>.
</p>
<?php
include 'calendar.php';
@ -33,16 +39,83 @@ include 'calendar.php';
</table>
<script>
// Update the timer as time passes.
let halfHour = 1800000;
// Gather schedule table cells by timestamp
const cells = document.querySelectorAll('.calendar tbody td');
let ranges = [];
for (const cell of Array.from(cells)) {
const m = /^show-(\d*)$/.exec(cell.id);
if (!m) continue;
ranges.push({
startTime: m[1]*1000,
cell,
});
}
ranges.sort((a, b) => {
return a.startTime - b.startTime;
});
let currentRangeI = 0;
function getCurrentRange(now) {
for (i = currentRangeI; i < ranges.length; i++) {
const range = ranges[i];
if (!range) continue;
const rangeStart = range.startTime;
if (rangeStart <= now && (rangeStart + halfHour) > now) {
return range;
}
}
}
// Update the timer and pointer as time passes.
// Because PHP gives the time on page load, people who disable Javascript won't be missing out on much.
let months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
let daysOfWeek = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
let daysOfWeek = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
function update_date() {
var d = new Date();
document.getElementById("utcdate").innerText = daysOfWeek[d.getUTCDay()]+" "+months[d.getUTCMonth()]+" "+d.getUTCDate().toString()+" "+d.getUTCHours().toString().padStart(2,'0')+":"+d.getUTCMinutes().toString().padStart(2,'0');
setTimeout(update_date,15000);
document.getElementById("utcdate").innerText =
daysOfWeek[d.getUTCDay()] + " " + months[d.getUTCMonth()] + " " +
d.getUTCDate().toString() + " " + d.getUTCHours().toString().padStart(2,'0') +
":" + d.getUTCMinutes().toString().padStart(2,'0');
setTimeout(update_date, 15000);
updatePointer(d);
}
setTimeout(update_date,15000);
setTimeout(update_date, 15000);
let pointer = document.getElementById("pointer");
// Create pointer in case it wasn't added in the page generation.
if (!pointer) {
pointer = document.createElement('div');
pointer.id = 'pointer';
}
let prevRange = getCurrentRange(new Date().getTime());
function updatePointer(d) {
// Find current cell
const range = getCurrentRange(d.getTime());
if (!range) {
// Done with schedule. Remove pointer. Need to refresh.
if (prevRange) {
prevRange.cell.removeChild(pointer);
prevRange.cell.classList.remove('active');
prevRange = null;
}
return;
}
// Move pointer to different cell if changed cell.
if (range !== prevRange) {
if (prevRange) prevRange.cell.classList.remove('active');
range.cell.classList.add('active');
range.cell.appendChild(pointer);
prevRange = range;
}
// Move pointer based on time in current cell.
const progress = (d.getTime() - range.startTime) / halfHour;
pointer.style.top = (progress * (range.cell.offsetHeight - 1)).toFixed(0) + 'px';
}
// Update pointer immediately
updatePointer(new Date());
</script>
<?php include '../footer.php'; ?>
<?php include __DIR__.'/../footer.php'; ?>

View File

@ -2,53 +2,54 @@
include 'apikey.php';
if (empty($apikey)) {
/* If we don't have the API key, assume we're developing. Pull data from live version of this file */
$context = stream_context_create([
"http" => [
"method" => "GET",
]
]);
$schedule = json_decode(file_get_contents("https://tilderadio.org/schedule/nextdj.php?json=true", false, $context), true);
/* If we don't have the API key, assume we're developing. Pull data from live version of this file */
$context = stream_context_create([
"http" => [
"method" => "GET",
]
]);
$schedule = json_decode(file_get_contents("https://tilderadio.org/schedule/nextdj.php?json=true", false, $context), true);
} else {
$context = stream_context_create([
"http" => [
"method" => "GET",
"header" => "X-API-Key: $apikey\r\n"
]
]);
$context = stream_context_create([
"http" => [
"method" => "GET",
"header" => "X-API-Key: $apikey\r\n"
]
]);
$schedule = json_decode(
file_get_contents(
"https://radio.tildeverse.org/api/station/1/schedule?rows=2",
false,
$context
),
true
);
$schedule = json_decode(
file_get_contents(
"https://azuracast.tilderadio.org/api/station/1/schedule?rows=2",
false,
$context
),
true
);
}
if (isset($_GET["json"]) && $_GET["json"] === "yes") {
echo json_encode($schedule);
echo json_encode($schedule);
} else {
$data = $schedule[0];
if ((strtotime($data["start"])-strtotime("now"))<0) {
echo $data["name"]." should be streaming now, and ";
$data = $schedule[1];
}
echo $data["name"]." will stream at ".gmdate("D M d H:i",strtotime($data["start"]))." UTC (in ";
$diff = strtotime($data["start"])-strtotime("now");
if ($diff<60) {
echo "".$diff." seconds)";
} else {
$minutes = intdiv($diff,60);
$seconds = $diff % 60;
if ($minutes<60) {
echo "".$minutes." minutes and ".$seconds." seconds)";
} else {
$hours = intdiv($minutes,60);
$minutes = $minutes % 60;
echo "".$hours." hours, ".$minutes." minutes and ".$seconds." seconds)";
}
}
echo ".";
$data = $schedule[0];
if ((strtotime($data["start"]) - strtotime("now")) < 0) {
echo $data["name"] . " should be streaming now, and ";
$data = $schedule[1];
}
echo $data["name"] . " will stream at " . gmdate("D M d H:i", strtotime($data["start"])) . " UTC (in ";
$diff = strtotime($data["start"]) - strtotime("now");
if ($diff < 60) {
echo "" . $diff . " seconds)";
} else {
$minutes = intdiv($diff, 60);
$seconds = $diff % 60;
if ($minutes<60) {
echo "" . $minutes . " minutes and " . $seconds . " seconds)";
} else {
$hours = intdiv($minutes, 60);
$minutes = $minutes % 60;
echo "" . $hours . " hours, " . $minutes . " minutes and " . $seconds . " seconds)";
}
}
echo ".";
}

View File

@ -2,35 +2,35 @@
include 'apikey.php';
if (empty($apikey)) {
/* If we don't have the API key, assume we're developing. Pull data from live version of this file */
$context = stream_context_create([
"http" => [
"method" => "GET",
]
]);
$schedule = json_decode(file_get_contents("https://tilderadio.org/schedule/schedule.php?json=yes", false, $context), true);
/* If we don't have the API key, assume we're developing. Pull data from live version of this file */
$context = stream_context_create([
"http" => [
"method" => "GET",
]
]);
$schedule = json_decode(file_get_contents("https://tilderadio.org/schedule/schedule.php?json=yes", false, $context), true);
} else {
$context = stream_context_create([
"http" => [
$context = stream_context_create([
"http" => [
"method" => "GET",
"header" => "X-API-Key: $apikey\r\n"
]
]);
]
]);
// allow ics.php to overwrite $from and $to
if (!isset($from,$to)) {
$from = gmdate("Y-m-d\TH:i:s\Z", strtotime("now + 1 day"));
$to = gmdate("Y-m-d\TH:i:s\Z", strtotime("now + 8 days"));
}
// allow ics.php to overwrite $from and $to
if (!isset($from, $to)) {
$from = gmdate("Y-m-d\TH:i:s\Z", strtotime("today"));
$to = gmdate("Y-m-d\TH:i:s\Z", strtotime("today + 8 days"));
}
$schedule = json_decode(
file_get_contents(
"https://radio.tildeverse.org/api/station/1/streamers/schedule?start=$from&end=$to",
false,
$context
),
true
);
$schedule = json_decode(
file_get_contents(
"https://azuracast.tilderadio.org/api/station/1/streamers/schedule?start=$from&end=$to",
false,
$context
),
true
);
}
usort($schedule, function ($a, $b) {

View File

@ -28,5 +28,5 @@ Dizzy? We stop the world from spinning
Where Disney Princesses Go Slumming
any slogan but "eat the poop or die"
that's not what she said!
not product placement, we promise! (tildestore.com)
SYNTH TUBA JAZZ VOMIT
not product placement, we promise! (shop.tildeverse.org)
SYNTH TUBA JAZZ VOMIT