Initial import

This commit is contained in:
T. Isaac Lightburn
2018-02-07 20:48:28 -06:00
parent c521562c9a
commit 2b9c644016
9 changed files with 632 additions and 0 deletions

223
api.php Normal file
View File

@@ -0,0 +1,223 @@
<?php
include_once("global.inc");
$json = file_get_contents("php://input");
$data = json_decode($json,true);
$command = $data['command'];
if ($command == '')
{
exit();
}
// API stuff for songbook mobile apps
if ($command == "venueExists")
{
$venueUrlName = $data['venueUrlName'];
$exists = venueExists($venueUrlName);
$output = array('command'=>$command,'error'=>'false', 'exists'=>$exists);
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "venueAccepting")
{
if (getAccepting())
$output = array('command'=>$command,'accepting'=>true);
else
$output = array('command'=>$command,'accepting'=>false);
header('Content-type: application/json');
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "submitRequest")
{
$songId = $data['songId'];
$singerName = $data['singerName'];
$sql = "SELECT artist,title FROM songdb WHERE song_id = $songId";
foreach ($db->query($sql) as $row) {
$artist = $row['artist'];
$title = $row['title'];
}
$stmt = $db->prepare("INSERT INTO requests (singer,artist,title) VALUES(:singerName, :artist, :title)");
$stmt->execute(array(":singerName" => $singerName, ":artist" => $artist, ":title" => $title));
newSerial();
$output = array('command'=>$command,'error'=>'false', 'success'=>true);
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "search")
{
$terms = explode(' ',$data['searchString']);
$no = count($terms);
$wherestring = '';
if ($no == 1) {
$wherestring = "WHERE (combined LIKE \"%" . $terms[0] . "%\")";
} elseif ($no >= 2) {
foreach ($terms as $i => $term) {
if ($i == 0) {
$wherestring .= "WHERE ((combined LIKE \"%" . $term . "%\")";
}
if (($i > 0) && ($i < $no - 1)) {
$wherestring .= " AND (combined LIKE \"%" . $term . "%\")";
}
if ($i == $no - 1) {
$wherestring .= " AND (combined LIKE \"%" . $term . "%\") AND(artist<>'DELETED'))";
}
}
} else {
$wherestring = "";
}
$entries = null;
$res = array();
$sql = "SELECT song_id,artist,title,combined FROM songdb $wherestring ORDER BY UPPER(artist), UPPER(title)";
foreach ($db->query($sql) as $row)
{
if ((stripos($row['combined'],'wvocal') === false) && (stripos($row['combined'],'w-vocal') === false) && (stripos($row['combined'],'vocals') === false)) {
$res[] = array('song_id'=>$row['song_id'],'artist'=>$row['artist'],'title'=>$row['title']);
}
}
$output = array("command" => "search", "songs" => $res);
header('Content-type: application/json');
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
// API stuff for OpenKJ application
if ($command == "clearDatabase")
{
$db->exec("DELETE FROM songdb");
$db->exec("DELETE FROM requests");
$newSerial = newSerial();
$output = array('command'=>$command,'error'=>'false', 'serial'=>newSerial());
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
function error($error_string) {
header('Content-type: application/json');
print(json_encode(array('command'=>$command,'error'=>'true','errorString'=>$error_string),JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "clearRequests")
{
$db->exec("DELETE FROM requests");
$output = array('command'=>$command,'error'=>'false', 'serial'=>newSerial());
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "deleteRequest")
{
$request_id = $data['request_id'];
$stmt = $db->prepare("DELETE FROM requests WHERE request_id = :requestId");
$stmt->execute(array(":requestId" => $request_id));
$output = array('command'=>$command,'error'=>'false', 'serial'=>newSerial());
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "connectionTest")
{
header('Content-type: application/json');
$output = array('command'=>$command,'connection'=>'ok');
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "addSongs")
{
$stmt = $db->prepare("INSERT OR IGNORE INTO songdb (artist, title, combined) VALUES (:artist, :title, :combined)");
$db->beginTransaction();
$errors = array();
$count = 0;
$artist = "";
$title = "";
$combined = "";
$error = "false";
foreach ($data['songs'] as $song)
{
$artist = $song['artist'];
$title = $song['title'];
$combined = $artist . " " . $title;
$inarray = array(":artist" => $artist, ":title" => $title, ":combined" => $combined);
$result = $stmt->execute($inarray);
if ($result === false)
{
$errors[] = $db->errorInfo();
$error = "true";
}
$count++;
}
$result = $db->commit();
if ($result == false)
$errors[] = $db->errorInfo();
$output['command'] = $command;
$output['error'] = $error;
$output['errors'] = $errors;
$output['entries processed'] = $count;
$output['last_artist'] = $artist;
$output['last_title'] = $title;
header('Content-type: application/json');
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "getSerial")
{
$output = array('command'=>$command,'serial'=>getSerial(),'error'=>'false');
header('Content-type: application/json');
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "getAccepting")
{
$accepting = getAccepting();
$output = array('command'=>$command,'accepting'=>$venue['accepting'],'venue_id'=>0);
header('Content-type: application/json');
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "setAccepting")
{
$accepting = (bool)$data['accepting'];
setAccepting($accepting);
$newSerial = newSerial();
$output = array('command'=>$command,'error'=>'false','venue_id'=>0,'accepting'=>$accepting,'serial'=>$newSerial);
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "getVenues")
{
$output = getVenues();
$output['command'] = $command;
$output['error'] = 'false';
header('Content-type: application/json');
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
if ($command == "getRequests")
{
$serial = getSerial();
$output = getRequests();
$output['command'] = $command;
$output['error'] = 'false';
$output['serial'] = $serial;
header('Content-type: application/json');
print(json_encode($output,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES));
exit();
}
?>

161
global.inc Normal file
View File

@@ -0,0 +1,161 @@
<?php
include("settings.inc");
$db = new PDO("sqlite:$dbFilePath");
$db->exec("CREATE TABLE IF NOT EXISTS songdb (song_id integer PRIMARY KEY AUTOINCREMENT, artist text, title TEXT, combined TEXT UNIQUE)");
$db->exec("CREATE TABLE IF NOT EXISTS state (accepting bool, serial integer NOT NULL)");
$db->exec("INSERT OR IGNORE INTO state (rowid,accepting,serial) VALUES(0,0,1)");
$db->exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_songstrings ON songdb(combined)");
$db->exec("CREATE TABLE IF NOT EXISTS requests (request_id integer PRIMARY KEY AUTOINCREMENT, artist TEXT, title TEXT, singer TEXT, request_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP)");
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$accepting = true;
$songdbtable = "songdb";
$requeststable = "requests";
if (isset($_SERVER['REFERER'])) $referer = $_SERVER['REFERER'];
function siteheader($title)
{
global $venueName;
global $screensize;
echo "<html><head>
<link href='https://fonts.googleapis.com/css?family=Audiowide' rel='stylesheet'>
<link href='https://fonts.googleapis.com/css?family=Roboto' rel='stylesheet'>
<title>$venueName Karaoke Songbook</title>
<link rel=stylesheet type=\"text/css\" href=venuestyle.css />
<script type=\"text/javascript\">
function submitreq(varid){
window.location = \"./submitreq.php?id=\" + varid;
}
</script>
</head><body>";
}
function sitefooter() {
echo "</div></body></html>";
}
function navbar($backurl)
{
if ($backurl == "")
$backurl = index.php;
global $screensize;
echo "<div class=navbar>
<span class=title>OpenKJ Songbook</span>
</div><div class=mainbody><span class=backbtn><a class=button href=\"$backurl\" class=navbar id=backlink>Back</a></span>";
}
function setAccepting($accepting)
{
global $db;
$db->exec("UPDATE state SET accepting=$accepting");
}
function getAccepting()
{
global $db;
$accepting = false;
foreach ($db->query("SELECT accepting FROM state LIMIT 1") as $row)
{
$accepting = (bool)$row['accepting'];
}
return $accepting;
}
function searchform()
{
global $db;
global $venue_id;
if (!getAccepting())
{
echo "<br><br><h2>Sorry, requests are not being accepted at this time</h2>";
}
else
{
global $url_name;
global $screensize;
echo "<br><p><form method=get action=search.php>Song search: <input type=text name=q autofocus autocomplete=off><input type=submit value=Search></form></p>";
echo '<p class=info>You may enter any part of the artist and/or title of the song. Partial words are allowed.</p>
<p class=info>For example "pai bla stone" would match "Rolling Stones, The - Paint it black".</p>';
}
}
function getSerial()
{
global $db;
$serial = -1;
foreach ($db->query("SELECT serial FROM state LIMIT 1") as $row)
{
$serial = (int)$row['serial'];
}
return $serial;
}
function newSerial()
{
global $db;
$serial = getSerial();
$newSerial = mt_rand(0,99999);
while ($newSerial == $serial)
{
$newSerial = mt_rand(0,99999);
}
$db->exec("UPDATE state SET serial=$newSerial");
return $newSerial;
}
function getVenue()
{
// We don't really do multiple venues in standalone, just fake it
global $db;
global $venueName;
$serial = -1;
$venue = array();
$venue['venue_id'] = $venue_id;
$venue['accepting'] = getAccepting();
$venue['name'] = $venueName;
$venue['url_name'] = "none";
return $venue;
}
function getVenues()
{
// We don't really do multiple venues in standalone, just fake it
global $db;
global $venueName;
$venues = array();
$venue['venue_id'] = 0;
$venue['accepting'] = getAccepting();
$venue['name'] = $venueName;
$venue['url_name'] = "none";
$venues['venues'][] = $venue;
return $venues;
}
function getRequests()
{
global $db;
$requests = array();
$result = $db->query("SELECT request_id,artist,title,singer,strftime('%s', request_time) AS unixtime FROM requests");
if ($result)
{
foreach ($result as $row)
{
$request['request_id'] = (int)$row['request_id'];
$request['artist'] = $row['artist'];
$request['title'] = $row['title'];
$request['singer'] = $row['singer'];
$request['request_time'] = (int)$row['unixtime'];
$requests['requests'][] = $request;
}
}
return $requests;
}
?>

16
index.php Normal file
View File

@@ -0,0 +1,16 @@
<?php
include("global.inc");
siteheader("Home");
navbar("index.php");
searchform();
/*
if ($screensize == 'xlarge')
{
echo "<br><br><p class=info>Want to search using your smartphone, tablet, or laptop?<br><br>Browse to songbook.openkj.org/venue/$url_name in the web browser on your device.<br><br>
";
}
*/
sitefooter();
?>

BIN
okjweb.db Normal file
View File

Binary file not shown.

69
search.php Normal file
View File

@@ -0,0 +1,69 @@
<?php
include('global.inc');
siteheader('Search Results');
navbar("index.php");
if ($_GET['q'] == '') {
echo "<p>You must enter at least one search term</p>";
die();
}
if (strlen($_GET['q']) < 3)
{
echo '<p>Your search string was too short, please try again</p>';
die();
}
echo '<br><p>Search Results<br>Tap a song to submit it</p>';
$terms = explode(' ',$_GET['q']);
$no = count($terms);
$wherestring = '';
if ($no == 1) {
$wherestring = "WHERE (combined LIKE \"%" . $terms[0] . "%\")";
} elseif ($no >= 2) {
foreach ($terms as $i => $term) {
if ($i == 0) {
$wherestring .= "WHERE ((combined LIKE \"%" . $term . "%\")";
}
if (($i > 0) && ($i < $no - 1)) {
$wherestring .= " AND (combined LIKE \"%" . $term . "%\")";
}
if ($i == $no - 1) {
$wherestring .= " AND (combined LIKE \"%" . $term . "%\") AND(artist != 'DELETED'))";
}
}
} else {
echo "<li>You must enter at least one search term</li>";
die();
}
$entries = null;
$res = array();
$sql = "SELECT song_id,artist,title,combined FROM songdb $wherestring ORDER BY UPPER(artist), UPPER(title)";
foreach ($db->query($sql) as $row)
{
if ((stripos($row['combined'],'wvocal') === false) && (stripos($row['combined'],'w-vocal') === false) && (stripos($row['combined'],'vocals') === false)) {
$res[$row['song_id']] = $row['artist'] . " - " . $row['title'];
}
}
$db = null;
$unique = array_unique($res);
foreach ($unique as $key => $val) {
$entries[] = "<tr><td class=result onclick=\"submitreq(${key})\">" . $val . "</td></tr>";
}
if (count($unique) > 0) {
echo '<table border=1>';
foreach ($entries as $song) {
echo $song;
}
echo '</table>';
} else {
echo "<p>Sorry, no match found.</p>";
}
sitefooter();
?>

5
settings.inc Normal file
View File

@@ -0,0 +1,5 @@
<?php
$venueName = 'Default Venue';
$dbFilePath = '/var/www/html/okjweb/okjweb.db';
?>

35
submitreq-run.php Normal file
View File

@@ -0,0 +1,35 @@
<?php
include('global.inc');
#header("Refresh: 15; URL=");
siteheader("Song Submitted");
$songid = $_GET['songid'];
$singer = $_GET['singer'];
if ($singer == '') {
navbar($_SERVER['HTTP_REFERER']);
echo "<p>Sorry, you must input a singer name. Please go back and try again.</p>";
die();
}
navbar("index.php");
$entries = null;
$wherestring = null;
$artist = '';
$title = '';
$sql = "SELECT artist,title FROM songdb WHERE song_id = $songid";
foreach ($db->query($sql) as $row) {
$artist = $row['artist'];
$title = $row['title'];
}
$stmt = $db->prepare("INSERT INTO requests (singer,artist,title) VALUES(:singer, :artist, :title)");
$stmt->execute(array(":singer" => $singer, ":artist" => $artist, ":title" => $title));
newSerial();
echo "<p>Song: $artist - $title</p>
<p>Submitted for singer: $singer</p>
<br><p>Please press back to return to the main screen</p>
";
sitefooter();
?>

25
submitreq.php Normal file
View File

@@ -0,0 +1,25 @@
<?php
include('global.inc');
siteheader('Submit Request');
$referer = $_SERVER['HTTP_REFERER'];
if (strpos($referer,'submitreq-run.php?screensize=$screensize') !== false)
{
navbar("index.php");
} else {
navbar($referer);
}
$songid = $_GET['id'];
$artist = '';
$title = '';
$sql = "SELECT artist,title FROM songdb WHERE song_id = $songid";
foreach ($db->query($sql) as $row) {
$artist = $row['artist'];
$title = $row['title'];
}
$db = null;
echo "<br><p>Submitting Song:<br>";
echo "<p>$artist - $title</p>";
echo "<form method=get action=submitreq-run.php><input type=hidden name=screensize value=$screensize><input type=hidden name=songid value=$songid>Please enter your name or nickname:<br><input type=text name=singer autocomplete=off autofocus><input type=submit></form>";
echo "<p class=info>If you have a common first name, please also enter your last initial or last name.<br>Doing so will help eliminate confusion and reduce the risk of your turn getting skipped.";
?>

98
venuestyle.css Normal file
View File

@@ -0,0 +1,98 @@
@import url(http://fonts.googleapis.com/css?family=Scada);
@import url(http://fonts.googleapis.com/css?family=Audiowide);
body
{
text-align: center;
font-family: 'Scada', sans-serif;
font-size: 1.2em;
font-weight: bold;
background-color: white;
color: black;
padding-top: 60px;
}
input[type=text] {
border: 2px solid black;
padding-top: 5px;
padding-bottom: 5px;
margin-right: 5px;
font-size: 1.2em;
font-weight: bold;
}
p.info
{
font-size: 1.0em;
}
div.navbar
{
# height: 50px;
width: 100%;
position: fixed;
left: 0;
top: 0;
padding-left: 5px;
padding-top: 5px;
padding-bottom: 5px;
padding-right: 5px
width: 100%;
background-color: white;
color: black;
text-align: left;
border-style: solid;
border-width: 0px 0px 2px 0px;
}
a.navbar
{
color: white;
text-decoration: none;
}
div.spacer
{
position: relative;
width: 90%;
top: 0;
height: 50px;
}
table
{
margin: auto;
min-width: 60%;
border: 1px;
}
td.result
{
color: black;
font-size: 1.6em;
font-weight: bold;
text-align: left;
padding: 20px;
border-spacing: 10px;
border-style: solid;
border-size: 2px;
}
input[type=button], input[type=submit], input[type=reset], a.button {
background-color: white;
border: 2px;
border-style: solid;
border-color: black;
font-weight: bold;
color: black;
padding: 8px 20px;
margin-top: 12px;
text-decoration: none;
font-size: 1.2em;
cursor: pointer;
}
.backbtn {
position: fixed;
top: 75px;
left: 5px;
}
.title {
font-size: 2em;
font-family: Audiowide, cursive;
float: right;
margin-right: 10px;
text-shadow: 4px 4px 4px #aaa;
}