Completely redid database layout #2

Merged
kristy-fournier merged 6 commits from dev into main 2025-03-05 15:50:36 -05:00
2 changed files with 47 additions and 56 deletions
Showing only changes of commit cf8796a3a1 - Show all commits

View file

@ -98,35 +98,33 @@ async function searchSongs(searchTerm){
document.getElementById("songlist").innerHTML = "" document.getElementById("songlist").innerHTML = ""
searchResults = await getFromServer({search:searchTerm},"search").then() searchResults = await getFromServer({search:searchTerm},"search").then()
for (let index in searchResults) {
optionslist.push([index,searchResults[index][0],searchResults[index][1],searchResults[index][2]]);
}
//generate the visual song list //generate the visual song list
for(let i = 0; i < optionslist.length; i++) { for(var fileName in searchResults) {
let currentSongInJSON = searchResults[fileName]
let newItem = document.createElement("div"); let newItem = document.createElement("div");
newItem.className = "item"; newItem.className = "item";
newItem.id = optionslist[i][3]; newItem.id = fileName;
let image = document.createElement("img"); let image = document.createElement("img");
try { try {
if (optionslist[i][2] == null) { if (currentSongInJSON["art"] == null) {
throw "no image lolz" throw "no image lolz"
} }
image.src = optionslist[i][2]; image.src = currentSongInJSON["art"];
} catch(err){ } catch(err){
image.src = "./images/placeholder.png"; image.src = "./images/placeholder.png";
} }
image.id = String(optionslist[i][3])+" image"; image.id = String(fileName)+" image";
let head3 = document.createElement("h3"); let head3 = document.createElement("h3");
head3.innerText = optionslist[i][0]; head3.innerText = currentSongInJSON["title"];
let head4 = document.createElement("h4"); let head4 = document.createElement("h4");
head4.innerText=optionslist[i][1]; head4.innerText = currentSongInJSON["artist"];
newItem.appendChild(image); newItem.appendChild(image);
newItem.appendChild(head3); newItem.appendChild(head3);
newItem.appendChild(head4); newItem.appendChild(head4);
document.getElementById("songlist").appendChild(newItem); document.getElementById("songlist").appendChild(newItem);
} }
if (optionslist.length == 0) { if (searchResults.length == 0) {
//display error if no results //display error if no results
document.getElementById("songlist").innerHTML = "<h1>We might not have that one...</h1>"; document.getElementById("songlist").innerHTML = "<h1>We might not have that one...</h1>";
} }
@ -211,29 +209,30 @@ async function generateVisualPlaylist(conditions="") {
document.getElementById("playlist-alert").innerHTML = "Nothing's Queued..." document.getElementById("playlist-alert").innerHTML = "Nothing's Queued..."
} else { } else {
if (conditions=="skip-button") { if (conditions=="skip-button") {
playlist.shift() delete playlist[0]
if (playlist.length==0){ if (playlist.length==0){
document.getElementById("playlist-alert").innerHTML = "Nothing's Queued..." document.getElementById("playlist-alert").innerHTML = "Nothing's Queued..."
} }
} }
for (i in playlist) { for (let i in playlist) {
let fileName = Object.keys(playlist[i])[0]
let newItem = document.createElement("div"); let newItem = document.createElement("div");
newItem.className = "item"; newItem.className = "item";
newItem.id = playlist[i]["file"]; newItem.id = fileName;
let image = document.createElement("img"); let image = document.createElement("img");
try { try {
if (playlist[i]["art"] == null) { if (playlist[i][fileName]["art"] == null) {
throw "no image lolz" throw "no image lolz"
} }
image.src = playlist[i]["art"]; image.src = playlist[i][fileName]["art"];
} catch(err){ } catch(err){
image.src = "./images/placeholder.png"; image.src = "./images/placeholder.png";
} }
image.id = String(playlist[i]["file"])+" image"; image.id = String(fileName)+" image";
let head3 = document.createElement("h3"); let head3 = document.createElement("h3");
head3.innerText = playlist[i]["title"]; head3.innerText = playlist[i][fileName]["title"];
let head4 = document.createElement("h4"); let head4 = document.createElement("h4");
head4.innerText=playlist[i]["artist"]; head4.innerText=playlist[i][fileName]["artist"];
let head5 = document.createElement("h5"); let head5 = document.createElement("h5");
let timeLeft =document.createElement("h5"); let timeLeft =document.createElement("h5");
timeLeft.style.fontWeight = 100; timeLeft.style.fontWeight = 100;
@ -241,10 +240,10 @@ async function generateVisualPlaylist(conditions="") {
if (i == 0) { if (i == 0) {
head5.innerHTML="Playing"; head5.innerHTML="Playing";
if ((conditions != "skip-button")) { if ((conditions != "skip-button")) {
let mins = Math.floor(playlist[i]["time"]/60); let mins = Math.floor(playlist[i][fileName]["time"]/60);
let secs = Math.floor(playlist[i]["time"]%60); let secs = Math.floor(playlist[i][fileName]["time"]%60);
let durMins = Math.floor(playlist[i]["length"]/60); let durMins = Math.floor(playlist[i][fileName]["length"]/60);
let durSecs = Math.floor(playlist[i]["length"]%60); let durSecs = Math.floor(playlist[i][fileName]["length"]%60);
timeLeft.innerHTML = mins.toString() +":"+ secs.toLocaleString('en-US', {minimumIntegerDigits: 2,useGrouping: false}) + "/"+ durMins.toString()+":"+durSecs.toLocaleString('en-US', {minimumIntegerDigits: 2,useGrouping: false}); timeLeft.innerHTML = mins.toString() +":"+ secs.toLocaleString('en-US', {minimumIntegerDigits: 2,useGrouping: false}) + "/"+ durMins.toString()+":"+durSecs.toLocaleString('en-US', {minimumIntegerDigits: 2,useGrouping: false});
} }
} }
@ -270,6 +269,7 @@ async function submitSong(songid) {
} }
function checkWhatSongWasClicked(e) { function checkWhatSongWasClicked(e) {
itemId = e.srcElement.id; itemId = e.srcElement.id;
console.log(itemId)
if ((itemId.length-itemId.lastIndexOf("image") == 5) && itemId.lastIndexOf("image")!=-1) { if ((itemId.length-itemId.lastIndexOf("image") == 5) && itemId.lastIndexOf("image")!=-1) {
itemId = itemId.slice(0,-6) itemId = itemId.slice(0,-6)
} }

View file

@ -4,12 +4,16 @@ from flask_cors import CORS
import json,vlc,threading,time,random, argparse import json,vlc,threading,time,random, argparse
# Argparse Stuff # Argparse Stuff
parser=argparse.ArgumentParser(description="Options for the Webby Bits") parser=argparse.ArgumentParser(description="Options for the Webby Bits")
parser.add_argument('-d','--directory',help="Directory of the song files (make sure this matches the directory used for the databaseGenerator)", default="./sound/") # this is no longer needed assuming my file works correctly with the generator
# parser.add_argument('-d','--directory',help="Directory of the song files (make sure this matches the directory used for the databaseGenerator)", default="./sound/")
parser.add_argument('-p','--port',help="Port to host on, not the same as the web (client) port",default='19054') parser.add_argument('-p','--port',help="Port to host on, not the same as the web (client) port",default='19054')
portTheUserPicked=parser.parse_args().port portTheUserPicked=parser.parse_args().port
soundLocation = parser.parse_args().directory
# To set the directory permenantly just uncomment the next line # open the json file as a dictionary
# soundLocation = "/example/directory/here/" with open('./songDatabase.json', 'r') as handle:
songDatabaseList = json.load(handle)
soundLocation = songDatabaseList["songDirectory"]
if soundLocation[-1] == "/" or soundLocation[-1] == "\\": if soundLocation[-1] == "/" or soundLocation[-1] == "\\":
pass pass
elif "/" in soundLocation: elif "/" in soundLocation:
@ -33,9 +37,6 @@ player.audio_set_volume(100)
app = Flask(__name__) app = Flask(__name__)
# because you are posting from another domain to this one, you need CORS # because you are posting from another domain to this one, you need CORS
CORS(app) CORS(app)
# open the json file as a dictionary
with open('./songDatabase.json', 'r') as handle:
songDatabaseList = json.load(handle)
def queueSong(song): def queueSong(song):
with playlistLock: with playlistLock:
@ -116,16 +117,16 @@ def searchSongDB():
# the way i put the data in a list was really dumb looking back, i could and should have used a list of dictioaries like i was before # the way i put the data in a list was really dumb looking back, i could and should have used a list of dictioaries like i was before
# i might try to change it but this layout is embedded deep in the client # i might try to change it but this layout is embedded deep in the client
tempData = {} tempData = {}
for i in songDatabaseList: for i in songDatabaseList["songData"]:
if ((i["title"].lower().find(recieveData['search'].lower())) > -1) or (recieveData['search'] == ""): if ((songDatabaseList["songData"][i]["title"].lower().find(recieveData['search'].lower())) > -1) or (recieveData['search'] == ""):
# In future i would change this to index based on the filename so that it is definately unique tempData[i] = songDatabaseList["songData"][i]
tempData[i["title"]] = [i["artist"],i["art"],i["file"]]
try: try:
if (i["artist"].lower().find(recieveData['search'].lower()) > -1): if (songDatabaseList["songData"][i]["artist"].lower().find(recieveData['search'].lower()) > -1):
tempData[i["title"]] = [i["artist"],i["art"],i["file"]] tempData[i] = songDatabaseList["songData"][i]
except: except:
pass pass
print(tempData)
return tempData return tempData
@app.route("/songadd", methods=["POST"]) @app.route("/songadd", methods=["POST"])
@ -137,26 +138,16 @@ def songadd():
def getPlaylist(): def getPlaylist():
global songNext global songNext
tempPlaylist = [] tempPlaylist = []
# what went through my head to make past-me think this is a good idea??? if songNext != None:
# i mean actually looping through once still shouldn't ever take that long # Adds the currently playing song
# but like a binary search must exist in python and be faster k = songDatabaseList["songData"][songNext]
# wait no binary search only helps if they're sorted
# i mean i guess i could sort them and make searching faster
for k in songDatabaseList:
if k["file"] == songNext:
temp = k.copy() temp = k.copy()
temp["playing"] = True temp["playing"] = True
temp["time"] = player.get_time()/1000 temp["time"] = player.get_time()/1000
tempPlaylist.append(temp) tempPlaylist.append({songNext:temp})
for i in playlist: for i in playlist:
# oh my goodness i did it again tempPlaylist.append({i:songDatabaseList["songData"][i]})
# i seriously need to rewrite the databaseGenerator and this code print(tempPlaylist)
# wait isn't this literally useless code???
# oh no the playlist only contains names
# i should really have used an object for this.
for j in songDatabaseList:
if j["file"] == i:
tempPlaylist.append(j)
return tempPlaylist return tempPlaylist
if __name__ == "__main__": if __name__ == "__main__":