4d51954c3c
Remove hard coded references to hub.hackerpublicradio.org to allow hub to be run on different servers and make testing locally possible.
369 lines
14 KiB
PHP
369 lines
14 KiB
PHP
<?php
|
|
require "/home/hpr/php/include.php";
|
|
$pos = strpos($_SERVER['REQUEST_URI'], '?');
|
|
if ( ! $pos === false) {
|
|
header("Status: 412 Precondition Failed");
|
|
include '412.shtml';
|
|
file_put_contents($naughtyfile, getUserIP(), FILE_APPEND | LOCK_EX );
|
|
exit;
|
|
}
|
|
|
|
$body="give";
|
|
//$body="index_full";
|
|
include 'header.php';
|
|
|
|
// --------------------------------------------
|
|
// Clean up stale reservations
|
|
|
|
$ip = $_SERVER["REMOTE_ADDR"];
|
|
|
|
# Remove any stale requests.
|
|
# This should be enough to deter attackers while been short enough to allow real hosts to request a show.
|
|
$query_delete_old = "DELETE
|
|
FROM
|
|
reservations
|
|
WHERE
|
|
reservations.timestamp + INTERVAL 1 HOUR <= UTC_TIMESTAMP()
|
|
AND reservations.status = 'REQUEST_UNVERIFIED'";
|
|
$result_delete_old = @mysqli_query($connection, $query_delete_old);
|
|
logextra( "Deleting requests older than 1 hour" . $result_delete_old );
|
|
|
|
# Remove stale requests from this IP Address after 15 minutes.
|
|
# This should be enough to deter attackers while been short enough to allow real hosts to request a show.
|
|
$query_delete = "DELETE FROM reservations WHERE reservations.ip = '$ip' AND reservations.timestamp + INTERVAL 15 MINUTE <= UTC_TIMESTAMP() AND reservations.status = 'REQUEST_UNVERIFIED'";
|
|
$result_delete = @mysqli_query($connection, $query_delete);
|
|
logextra( "Remove stale requests from this \"${ip}\" IP Address after 15 minutes. " . $result_delete_old );
|
|
|
|
|
|
// --------------------------------------------
|
|
// Get first free slot
|
|
|
|
$query = mysqli_query($connection, "
|
|
SELECT id + 1 FROM eps mo
|
|
WHERE NOT EXISTS
|
|
(
|
|
SELECT NULL
|
|
FROM eps mi
|
|
WHERE mi.id = mo.id + 1
|
|
)
|
|
ORDER BY
|
|
id
|
|
LIMIT 1");
|
|
$next_show_num_array = mysqli_fetch_row($query);
|
|
$next_show_num = $next_show_num_array[0];
|
|
|
|
print "<!-- next_show_num is $next_show_num -->\n";
|
|
|
|
// --------------------------------------------
|
|
// Get latest published show
|
|
|
|
$query = mysqli_query($connection, "SELECT max(date), max(id) from eps WHERE eps.date <= UTC_DATE()");
|
|
$current_episode_array = mysqli_fetch_row($query);
|
|
$current_episode_date = $current_episode_array[0];
|
|
$current_episode_number = $current_episode_array[1];
|
|
|
|
print "<!-- current_episode_date is $current_episode_date -->\n";
|
|
print "<!-- current_episode_number is $current_episode_number -->\n";
|
|
|
|
// --------------------------------------------
|
|
// Get highest scheduled or reserved show
|
|
|
|
$query = mysqli_query($connection, "SELECT MAX(id) FROM eps as maxid;");
|
|
$max_episode_array = mysqli_fetch_row($query);
|
|
$max_episode_number = $max_episode_array[0];
|
|
print "<!-- max_episode_number is $max_episode_number -->\n";
|
|
|
|
// --------------------------------------------
|
|
// Get the number of shows in the reserve queue.
|
|
|
|
$query = mysqli_query($connection, "SELECT COUNT(*) as count_reserve_queue FROM reservations WHERE status = 'RESERVE_SHOW_SUBMITTED' AND ip = '127.0.0.1';");
|
|
$response_array = mysqli_fetch_row($query);
|
|
$count_reserve_queue = $response_array[0];
|
|
print "<!-- count_reserve_queue is $count_reserve_queue -->\n";
|
|
|
|
// --------------------------------------------
|
|
// Get the number of shows in the reserve queue yet to be processed.
|
|
|
|
$query = mysqli_query($connection, "SELECT COUNT(*) as count_reserve_queue_unprocessed FROM reservations WHERE status = 'RESERVE_SHOW_SUBMITTED' AND ip != '127.0.0.1';");
|
|
$response_array = mysqli_fetch_row($query);
|
|
$count_reserve_queue_unprocessed = $response_array[0];
|
|
print "<!-- count_reserve_queue_unprocessed is $count_reserve_queue_unprocessed -->\n";
|
|
|
|
// --------------------------------------------
|
|
// Populate array with future shows and reservations
|
|
$show_array = array ();
|
|
|
|
// REQUEST_UNVERIFIED → SHOW_SUBMITTED → METADATA_PROCESSED → SHOW_POSTED → MEDIA_TRANSCODED → UPLOADED_TO_IA → UPLOADED_TO_RSYNC_NET
|
|
$ep_retrieve = "SELECT hosts.host, eps.id, eps.title, eps.date FROM eps, hosts WHERE eps.valid=1 AND eps.hostid = hosts.hostid AND eps.date >= '$current_episode_date' ORDER BY date DESC";
|
|
|
|
$ep_retrieve = "SELECT
|
|
hosts.host,
|
|
eps.id,
|
|
eps.title,
|
|
eps.date,
|
|
COUNT( assets.extension) AS numfiles
|
|
FROM
|
|
eps
|
|
LEFT JOIN hosts ON eps.hostid = hosts.hostid
|
|
LEFT JOIN assets ON eps.id = assets.episode_id
|
|
WHERE
|
|
eps.valid = 1
|
|
AND eps.date >= '$current_episode_date'
|
|
GROUP BY eps.id;";
|
|
|
|
if ($result = mysqli_query($connection, $ep_retrieve)) {
|
|
while ($row = mysqli_fetch_array($result)) {
|
|
$id = $row['id'];
|
|
$date = $row['date'];
|
|
$title = $row['title'];
|
|
$host = $row['host'];
|
|
$numfiles = $row['numfiles'];
|
|
if( isset($numfiles) and $numfiles >= 3 ) {
|
|
$status = "Finished";
|
|
}
|
|
else {
|
|
$status = "Reserved";
|
|
}
|
|
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
|
|
"title" => $title,
|
|
"host" => $host,
|
|
"status" => $status
|
|
);
|
|
}
|
|
}
|
|
// REQUEST_UNVERIFIED → SHOW_SUBMITTED → METADATA_PROCESSED → SHOW_POSTED → MEDIA_TRANSCODED → UPLOADED_TO_IA → UPLOADED_TO_RSYNC_NET
|
|
|
|
// Populate array with currently processing shows EMAIL_LINK_CLICKED
|
|
$ep_retrieve = "
|
|
SELECT
|
|
reservations.ep_num,
|
|
reservations.ep_date,
|
|
reservations.status
|
|
FROM
|
|
reservations
|
|
WHERE
|
|
reservations.verified = 1
|
|
AND reservations.ep_date >= '$current_episode_date'
|
|
ORDER BY
|
|
reservations.ep_date DESC";
|
|
|
|
if ($result = mysqli_query($connection, $ep_retrieve)) {
|
|
while ($row = mysqli_fetch_array($result)) {
|
|
$id = $row['ep_num'];
|
|
$date = $row['ep_date'];
|
|
$status = $row['status'];
|
|
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
|
|
"title" => $status,
|
|
"host" => "Unverified",
|
|
"status" => "Processing"
|
|
);
|
|
}
|
|
}
|
|
|
|
// Populate array with temporary reservations.
|
|
$ep_retrieve = "SELECT r.ep_num, r.ep_date, r.timestamp + INTERVAL 1 HOUR - UTC_TIMESTAMP() AS seconds_to_expiration FROM reservations r
|
|
WHERE r.timestamp + INTERVAL 1 HOUR > UTC_TIMESTAMP() AND r.verified =0 AND r.ep_date >= '$current_episode_date' ORDER BY r.ep_date DESC";
|
|
|
|
if ($result = mysqli_query($connection, $ep_retrieve)) {
|
|
while ($row = mysqli_fetch_array($result)) {
|
|
$id = $row['ep_num'];
|
|
$date = $row['ep_date'];
|
|
$seconds_to_expiration = $row['seconds_to_expiration'];
|
|
$minutes = floor($seconds_to_expiration / 60) + 1;
|
|
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
|
|
"title" => " Available again in $minutes minutes",
|
|
"host" => "Unverified",
|
|
"status" => "Locked"
|
|
);
|
|
}
|
|
}
|
|
|
|
$ep_retrieve = "SELECT
|
|
hosts.host,
|
|
eps.id,
|
|
eps.title,
|
|
eps.date
|
|
FROM
|
|
eps,
|
|
hosts,
|
|
assets
|
|
WHERE
|
|
eps.valid = 0
|
|
AND eps.hostid = hosts.hostid
|
|
AND eps.id = assets.episode_id
|
|
AND eps.date >= '$current_episode_date'
|
|
ORDER BY
|
|
date DESC";
|
|
if ($result = mysqli_query($connection, $ep_retrieve)) {
|
|
while ($row = mysqli_fetch_array($result)) {
|
|
$id = $row['id'];
|
|
$date = $row['date'];
|
|
$title = $row['title'];
|
|
$host = $row['host'];
|
|
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
|
|
"title" => $title,
|
|
"host" => $host,
|
|
"status" => "Distributing media to the ccdn"
|
|
);
|
|
}
|
|
}
|
|
|
|
$ep_retrieve = "SELECT
|
|
hosts.host,
|
|
eps.id,
|
|
eps.title,
|
|
eps.date
|
|
FROM
|
|
eps,
|
|
hosts,
|
|
assets
|
|
WHERE
|
|
eps.valid = 1
|
|
AND eps.hostid = hosts.hostid
|
|
AND eps.id = assets.episode_id
|
|
AND assets.extension = 'ogg'
|
|
AND eps.date >= '$current_episode_date'
|
|
ORDER BY
|
|
date DESC";
|
|
if ($result = mysqli_query($connection, $ep_retrieve)) {
|
|
while ($row = mysqli_fetch_array($result)) {
|
|
$id = $row['id'];
|
|
$date = $row['date'];
|
|
$title = $row['title'];
|
|
$host = $row['host'];
|
|
$show_array[$id] = array ( "date" => date('Y-m-d', strtotime($date) ),
|
|
"title" => $title,
|
|
"host" => $host,
|
|
"status" => "Finished"
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
// --------------------------------------------
|
|
// Calculate the time to the next show
|
|
|
|
# aria-label=""
|
|
|
|
$next_show_date = date('Y-m-d', strtotime($show_array[$next_show_num - 1 ]["date"] . ' + 1 weekday'));
|
|
$days_to_wait = floor((strtotime($next_show_date) - strtotime(gmdate('Y-m-d')))/(60*60*24));
|
|
|
|
?>
|
|
<main id="maincontent">
|
|
|
|
<h1>Upload Your Show</h1>
|
|
|
|
<p>
|
|
The HPR Schedule is entirely community driven and we recommend that <strong>you</strong> decide when your show will be released.
|
|
</p>
|
|
|
|
<p>
|
|
There are only <strong><?php echo "${days_to_wait}"; ?></strong> days to wait until next free slot. Please consider <a aria-label="Help on Recording a podcast" href="<?php echo "${baseurl}about.html#recording_a_podcast"; ?>">recording</a> a show for us.
|
|
</p>
|
|
<ol>
|
|
<li>Review the updated <em><a aria-label="Learn the Stuff you need to know" href="<?php echo "${baseurl}about.html#agreement"; ?>">Stuff you need to know</a></em> page.</li>
|
|
<li>Select a date, or post to the reserve queue.</li>
|
|
<li>Click the link in the confirmation email</li>
|
|
<li>Then <a aria-label="Help on Adding an episode" href="<?php echo "${baseurl}about.html#adding_an_episode"; ?>">fill in a form</a>.</li>
|
|
</ol>
|
|
|
|
<h2 id="scheduling_guidelines">Scheduling Guidelines</h2>
|
|
<ol>
|
|
<li>You must have your audio recording ready to upload <strong>before</strong> you pick a slot.</li>
|
|
<li>New hosts, Interviews, and other time critical shows should use the first free slot.</li>
|
|
<li>Always try and fill any free slots that are available in the <strong>upcoming two weeks</strong>.</li>
|
|
<li>When the queue is filling up then leave some slots free for new contributors.</li>
|
|
<li>Post non urgent shows into the first empty week.</li>
|
|
<li>If you are uploading a series of shows then post them one every two weeks.</li>
|
|
<li>If you have a non urgent show that is timeless, then add it to the <a href="https://hackerpublicradio.org/about.html#reserve_queue">Reserve Queue</a>.</li>
|
|
</ol>
|
|
|
|
<h2 id="reserve_queue">Add to the Reserve Queue ?</h2>
|
|
|
|
<p>
|
|
<a aria-label="Post to the reserve queue" href="<?php echo "${hubBaseurl}"; ?>request.php?id=9999">Post your show to the <strong>reserve queue</strong></a> if you don't care when it will be released. <small><a aria-label="Help on the reserve queue" href="<?php echo "${baseurl}about.html#reserve_queue"; ?>">ⓘ</a></small>
|
|
</p>
|
|
|
|
<h2 id="current_schedule">Select a date in the current schedule ?</h2>
|
|
|
|
<p>
|
|
<strong>Schedule</strong> the release</a> day your show will be aired. <small><a aria-label="Help on the scheduling guidelines" href="<?php echo "${baseurl}about.html#scheduling_guidelines"; ?>">ⓘ</a></small>
|
|
</p>
|
|
|
|
<h3>Next Two Months <small><a aria-label="Help on the HPR processing workflow" href="<?php echo "${baseurl}about.html#workflow"; ?>">ⓘ</a></small></h3>
|
|
|
|
|
|
|
|
|
|
<?php
|
|
$sizeof_show_array = sizeof($show_array);
|
|
$this_episode_date = date('D Y-m-d', strtotime($current_episode_date));
|
|
$week_number = date('W', strtotime($this_episode_date));
|
|
for ( $slot = $current_episode_number; $slot < ( $current_episode_number + 60 ); $slot++ ) {
|
|
if ( !empty( $show_array[$slot] ) ) {
|
|
if ( $show_array[$slot]["status"] === "Finished" ) {
|
|
# https://hackerpublicradio.org/eps/hpr3879/index.html
|
|
# ${baseurl}/eps/hpr${slot}/index.html
|
|
echo "<span style=\"font-family:monospace;\">" . date('D Y-m-d', strtotime($show_array[$slot]["date"])) . ": <a aria-label=\"Go directly to the show hpr${slot}\" href=\"${baseurl}eps/hpr${slot}/index.html\">hpr${slot}</a></span> <strong>" . $show_array[$slot]["title"] . "</strong> by <em>" . $show_array[$slot]["host"] . "</em><br />\n";
|
|
}
|
|
else {
|
|
echo "<span style=\"font-family:monospace;\">${this_episode_date}: hpr${slot}</span> <strong>". $show_array[$slot]["status"]. ":</strong> <em>" . $show_array[$slot]["title"] . "</em>.<br />\n";
|
|
}
|
|
$sizeof_show_array--;
|
|
}
|
|
elseif ( empty( $show_array[$slot] ) ) {
|
|
echo "<span style=\"font-family:monospace;\">${this_episode_date}: <a aria-label=\"Upload to the slot hpr${slot}\" href=\"${hubBaseurl}request.php?id=${slot}\">hpr${slot}</span> is available - upload now</a>.<br />\n";
|
|
}
|
|
elseif ( $show_array[$slot]["valid"] == 0 ) {
|
|
echo "<span style=\"font-family:monospace;\">${this_episode_date}: hpr${slot}</span> <strong>Unavailable</strong>.<br />\n";
|
|
}
|
|
$this_episode_date = date('D Y-m-d', strtotime($this_episode_date . ' + 1 weekday'));
|
|
$new_week_number = date('W', strtotime($this_episode_date));
|
|
if ( $week_number != $new_week_number ) {
|
|
$week_number = $new_week_number;
|
|
echo "<span style=\"font-family:monospace;\">----------------- Week ${week_number} -----------------<br /></span>\n";
|
|
}
|
|
}
|
|
?>
|
|
|
|
<h3 id="also_scheduled">Also Scheduled</h3>
|
|
<?php
|
|
$slot--;
|
|
while ( $slot <= $max_episode_number) {
|
|
// print "<!-- slot $slot, sizeof_show_array $sizeof_show_array, sizeof_reservation_array $sizeof_reservation_array, max_episode_number $max_episode_number -->\n" ;
|
|
if ( !empty( $show_array[$slot] ) ) {
|
|
if ( $show_array[$slot]["status"] === "Finished" ) {
|
|
echo "<span style=\"font-family:monospace;\">" . date('D Y-m-d', strtotime($show_array[$slot]["date"])) . ": <a aria-label=\"Go directly to the show hpr${slot}\" href=\"${baseurl}eps/hpr${slot}/index.html\">hpr${slot}</a></span> <strong>" . $show_array[$slot]["title"] . "</strong> by <em>" . $show_array[$slot]["host"] . "</em><br />\n";
|
|
}
|
|
else {
|
|
echo "<span style=\"font-family:monospace;\">" . date('D Y-m-d', strtotime($show_array[$slot]["date"])) . ": hpr${slot}</span> <strong>". $show_array[$slot]["status"]. ":</strong> <em>" . $show_array[$slot]["title"] . "</em>.<br />\n";
|
|
}
|
|
|
|
$sizeof_show_array--;
|
|
}
|
|
$slot++;
|
|
}
|
|
?>
|
|
|
|
<h3 id="reserve_queue_overview">Reserve Queue Overview</h3>
|
|
<pre>
|
|
<?php
|
|
include 'reserve.txt';
|
|
?>
|
|
</pre>
|
|
|
|
<h3 id="pick_other_dates">Pick other dates</h3>
|
|
<p>
|
|
If you wish to pick an available slot in the next 12 months then go directly to the <a aria-label="Go to the request page" href="<?php echo "${hubBaseurl}"; ?>request.php">request page</a>.
|
|
</p>
|
|
|
|
<h3 id="workflow">Workflow</h3>
|
|
<p>
|
|
The HPR statistics are regenerated every 15 minutes and are available in <a aria-label="Go to the stats json page" href="<?php echo "${hubBaseurl}"; ?>stats.json">json format</a>. Note the format is liable to change without notice.</p>
|
|
|
|
</main>
|
|
|
|
<?php
|
|
include 'footer.html';
|
|
?>
|