From cf8796a3a12784bf09dd1be7d12ddc13abf61e17 Mon Sep 17 00:00:00 2001 From: Kristy Fournier <124598538+kristy-fournier@users.noreply.github.com> Date: Wed, 5 Mar 2025 15:18:05 -0500 Subject: [PATCH] Playlist mode, adding songs work in new format --- Client/scripts.js | 46 ++++++++++++++++++------------------ Server/webbyBits.py | 57 +++++++++++++++++++-------------------------- 2 files changed, 47 insertions(+), 56 deletions(-) diff --git a/Client/scripts.js b/Client/scripts.js index 3f43bbc..d52b8e6 100644 --- a/Client/scripts.js +++ b/Client/scripts.js @@ -98,35 +98,33 @@ async function searchSongs(searchTerm){ document.getElementById("songlist").innerHTML = "" 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 - for(let i = 0; i < optionslist.length; i++) { + for(var fileName in searchResults) { + let currentSongInJSON = searchResults[fileName] let newItem = document.createElement("div"); newItem.className = "item"; - newItem.id = optionslist[i][3]; + newItem.id = fileName; let image = document.createElement("img"); try { - if (optionslist[i][2] == null) { + if (currentSongInJSON["art"] == null) { throw "no image lolz" } - image.src = optionslist[i][2]; + image.src = currentSongInJSON["art"]; } catch(err){ image.src = "./images/placeholder.png"; } - image.id = String(optionslist[i][3])+" image"; + image.id = String(fileName)+" image"; let head3 = document.createElement("h3"); - head3.innerText = optionslist[i][0]; + head3.innerText = currentSongInJSON["title"]; let head4 = document.createElement("h4"); - head4.innerText=optionslist[i][1]; + head4.innerText = currentSongInJSON["artist"]; newItem.appendChild(image); newItem.appendChild(head3); newItem.appendChild(head4); document.getElementById("songlist").appendChild(newItem); } - if (optionslist.length == 0) { + if (searchResults.length == 0) { //display error if no results document.getElementById("songlist").innerHTML = "

We might not have that one...

"; } @@ -211,29 +209,30 @@ async function generateVisualPlaylist(conditions="") { document.getElementById("playlist-alert").innerHTML = "Nothing's Queued..." } else { if (conditions=="skip-button") { - playlist.shift() + delete playlist[0] if (playlist.length==0){ 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"); newItem.className = "item"; - newItem.id = playlist[i]["file"]; + newItem.id = fileName; let image = document.createElement("img"); try { - if (playlist[i]["art"] == null) { + if (playlist[i][fileName]["art"] == null) { throw "no image lolz" } - image.src = playlist[i]["art"]; + image.src = playlist[i][fileName]["art"]; } catch(err){ image.src = "./images/placeholder.png"; } - image.id = String(playlist[i]["file"])+" image"; + image.id = String(fileName)+" image"; let head3 = document.createElement("h3"); - head3.innerText = playlist[i]["title"]; + head3.innerText = playlist[i][fileName]["title"]; let head4 = document.createElement("h4"); - head4.innerText=playlist[i]["artist"]; + head4.innerText=playlist[i][fileName]["artist"]; let head5 = document.createElement("h5"); let timeLeft =document.createElement("h5"); timeLeft.style.fontWeight = 100; @@ -241,10 +240,10 @@ async function generateVisualPlaylist(conditions="") { if (i == 0) { head5.innerHTML="Playing"; if ((conditions != "skip-button")) { - let mins = Math.floor(playlist[i]["time"]/60); - let secs = Math.floor(playlist[i]["time"]%60); - let durMins = Math.floor(playlist[i]["length"]/60); - let durSecs = Math.floor(playlist[i]["length"]%60); + let mins = Math.floor(playlist[i][fileName]["time"]/60); + let secs = Math.floor(playlist[i][fileName]["time"]%60); + let durMins = Math.floor(playlist[i][fileName]["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}); } } @@ -270,6 +269,7 @@ async function submitSong(songid) { } function checkWhatSongWasClicked(e) { itemId = e.srcElement.id; + console.log(itemId) if ((itemId.length-itemId.lastIndexOf("image") == 5) && itemId.lastIndexOf("image")!=-1) { itemId = itemId.slice(0,-6) } diff --git a/Server/webbyBits.py b/Server/webbyBits.py index 537542c..edc637c 100644 --- a/Server/webbyBits.py +++ b/Server/webbyBits.py @@ -4,12 +4,16 @@ from flask_cors import CORS import json,vlc,threading,time,random, argparse # Argparse Stuff 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') portTheUserPicked=parser.parse_args().port -soundLocation = parser.parse_args().directory -# To set the directory permenantly just uncomment the next line -# soundLocation = "/example/directory/here/" + +# open the json file as a dictionary +with open('./songDatabase.json', 'r') as handle: + songDatabaseList = json.load(handle) +soundLocation = songDatabaseList["songDirectory"] + if soundLocation[-1] == "/" or soundLocation[-1] == "\\": pass elif "/" in soundLocation: @@ -33,9 +37,6 @@ player.audio_set_volume(100) app = Flask(__name__) # because you are posting from another domain to this one, you need CORS CORS(app) -# open the json file as a dictionary -with open('./songDatabase.json', 'r') as handle: - songDatabaseList = json.load(handle) def queueSong(song): 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 # i might try to change it but this layout is embedded deep in the client tempData = {} - for i in songDatabaseList: - if ((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["title"]] = [i["artist"],i["art"],i["file"]] + for i in songDatabaseList["songData"]: + if ((songDatabaseList["songData"][i]["title"].lower().find(recieveData['search'].lower())) > -1) or (recieveData['search'] == ""): + tempData[i] = songDatabaseList["songData"][i] + try: - if (i["artist"].lower().find(recieveData['search'].lower()) > -1): - tempData[i["title"]] = [i["artist"],i["art"],i["file"]] + if (songDatabaseList["songData"][i]["artist"].lower().find(recieveData['search'].lower()) > -1): + tempData[i] = songDatabaseList["songData"][i] except: pass - + print(tempData) return tempData @app.route("/songadd", methods=["POST"]) @@ -137,26 +138,16 @@ def songadd(): def getPlaylist(): global songNext tempPlaylist = [] - # what went through my head to make past-me think this is a good idea??? - # i mean actually looping through once still shouldn't ever take that long - # but like a binary search must exist in python and be faster - # 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["playing"] = True - temp["time"] = player.get_time()/1000 - tempPlaylist.append(temp) + if songNext != None: + # Adds the currently playing song + k = songDatabaseList["songData"][songNext] + temp = k.copy() + temp["playing"] = True + temp["time"] = player.get_time()/1000 + tempPlaylist.append({songNext:temp}) for i in playlist: - # oh my goodness i did it again - # i seriously need to rewrite the databaseGenerator and this code - # 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) + tempPlaylist.append({i:songDatabaseList["songData"][i]}) + print(tempPlaylist) return tempPlaylist if __name__ == "__main__":