Compare commits
10 Commits
c521562c9a
...
68ac9a2005
| Author | SHA1 | Date | |
|---|---|---|---|
| 68ac9a2005 | |||
| 8512b62cb4 | |||
|
|
f928d788f9 | ||
|
|
b445ae0920 | ||
|
|
ff7b0e0502 | ||
|
|
162a0f1ec1 | ||
|
|
561d8855ee | ||
|
|
1a245160d8 | ||
|
|
4ee4e3cc0a | ||
|
|
2b9c644016 |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*~
|
||||||
@@ -1,9 +1,14 @@
|
|||||||
# OpenKJ Standalone Request Server
|
# OpenKJ Standalone Request Server
|
||||||
Standalone basic single-venue request server implementation for use with OpenKJ.
|
Standalone basic single-venue request server implementation for use with OpenKJ.
|
||||||
|
|
||||||
|
Note: This is intended for people who already know how to configure and manage their own webservers and have a general familiarity with php. The easier and more feature rich option is to use the hosted service available at https://okjsongbook.com
|
||||||
|
|
||||||
Requires php
|
Requires php
|
||||||
|
|
||||||
Can be run under either php's built in web server or under any web server with php support like apache or nginx.
|
Can be run under either php's built in web server or under any web server with php support like apache or nginx.
|
||||||
|
|
||||||
Ignores any API key specified in the OpenKJ.
|
Ignores any API key specified in the OpenKJ.
|
||||||
|
|
||||||
If you were serving this from a web server as http://10.0.0.1/requestserver, you would configure the server URL in OpenKJ to point to http://10.0.0.1/requestserver/api.php
|
If you were serving this from a web server as http://10.0.0.1/requestserver, you would configure the server URL in OpenKJ to point to http://10.0.0.1/requestserver/api.php
|
||||||
|
|
||||||
|
settings.inc should be edited with an appropriate database path that the webserver has write access to. If the database file doesn't exist, it will be created automatically.
|
||||||
|
|||||||
223
api.php
Normal file
223
api.php
Normal 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
166
global.inc
Normal file
166
global.inc
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
<?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);
|
||||||
|
$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>City Karaoke 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;
|
||||||
|
if ($accepting == 1)
|
||||||
|
{
|
||||||
|
echo("setting accepting to 1");
|
||||||
|
$db->exec("UPDATE state SET accepting=1");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo("setting accepting to 0");
|
||||||
|
$db->exec("UPDATE state SET accepting=0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAccepting()
|
||||||
|
{
|
||||||
|
global $db;
|
||||||
|
$accepting = false;
|
||||||
|
foreach ($db->query("SELECT accepting FROM state LIMIT 1") as $row)
|
||||||
|
{
|
||||||
|
$accepting = $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
16
index.php
Normal 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();
|
||||||
|
|
||||||
|
?>
|
||||||
69
search.php
Normal file
69
search.php
Normal 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>Click 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
5
settings.inc
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$venueName = 'City Karaoke';
|
||||||
|
$dbFilePath = '/home/salfter/StandaloneRequestServer/okjweb.db';
|
||||||
|
?>
|
||||||
35
submitreq-run.php
Normal file
35
submitreq-run.php
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
include('global.inc');
|
||||||
|
header("Refresh: 5; url=index.php");
|
||||||
|
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
25
submitreq.php
Normal 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.";
|
||||||
|
?>
|
||||||
101
venuestyle.css
Normal file
101
venuestyle.css
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
@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: #202020;
|
||||||
|
color: white;
|
||||||
|
padding-top: 60px;
|
||||||
|
}
|
||||||
|
input[type=text] {
|
||||||
|
border: 2px solid #202020;
|
||||||
|
padding-top: 5px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
margin-right: 5px;
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: white;
|
||||||
|
background-color: #404040;
|
||||||
|
}
|
||||||
|
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: #202020;
|
||||||
|
color: white;
|
||||||
|
text-align: left;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0px 0px 2px 0px;
|
||||||
|
}
|
||||||
|
a.navbar
|
||||||
|
{
|
||||||
|
color: #202020;;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
div.spacer
|
||||||
|
{
|
||||||
|
position: relative;
|
||||||
|
width: 90%;
|
||||||
|
top: 0;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
table
|
||||||
|
{
|
||||||
|
margin: auto;
|
||||||
|
min-width: 60%;
|
||||||
|
border: 1px;
|
||||||
|
}
|
||||||
|
td.result
|
||||||
|
{
|
||||||
|
color: white;
|
||||||
|
background-color: #202020;
|
||||||
|
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: #202020;
|
||||||
|
border: 2px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: white;
|
||||||
|
font-weight: bold;
|
||||||
|
color: white;
|
||||||
|
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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user