diff --git a/code/controllers/subsystems/media_tracks.dm b/code/controllers/subsystems/media_tracks.dm index 53805bcbec..d85e4baa9e 100644 --- a/code/controllers/subsystems/media_tracks.dm +++ b/code/controllers/subsystems/media_tracks.dm @@ -2,13 +2,16 @@ SUBSYSTEM_DEF(media_tracks) name = "Media Tracks" flags = SS_NO_FIRE init_order = INIT_ORDER_MEDIA_TRACKS - + /// Every track, including secret var/list/all_tracks = list() /// Non-secret jukebox tracks var/list/jukebox_tracks = list() /// Lobby music tracks var/list/lobby_tracks = list() + /// CHOMPstation edit start: Jack - Injecting casino track into new jukebox subsystem + var/list/casino_tracks = list() + /// CHOMPstation edit end /datum/controller/subsystem/media_tracks/Initialize(timeofday) load_tracks() @@ -18,19 +21,19 @@ SUBSYSTEM_DEF(media_tracks) /datum/controller/subsystem/media_tracks/proc/load_tracks() for(var/filename in config.jukebox_track_files) report_progress("Loading jukebox track: [filename]") - + if(!fexists(filename)) error("File not found: [filename]") continue - + var/list/jsonData = json_decode(file2text(filename)) - + if(!istype(jsonData)) error("Failed to read tracks from [filename], json_decode failed.") continue - + for(var/entry in jsonData) - + // Critical problems that will prevent the track from working if(!istext(entry["url"])) error("Jukebox entry in [filename]: bad or missing 'url'. Tracks must have a URL.") @@ -47,32 +50,43 @@ SUBSYSTEM_DEF(media_tracks) warning("Jukebox entry in [filename], [entry["title"]]: bad or missing 'artist'. Please consider crediting the artist.") if(!istext(entry["genre"])) warning("Jukebox entry in [filename], [entry["title"]]: bad or missing 'genre'. Please consider adding a genre.") - + var/datum/track/T = new(entry["url"], entry["title"], entry["duration"], entry["artist"], entry["genre"]) - + T.secret = entry["secret"] ? 1 : 0 T.lobby = entry["lobby"] ? 1 : 0 - + + /// CHOMPstation edit start: Jack - Injecting casino track into new jukebox subsystem + T.casino = entry["casino"] ? 1 : 0 + /// CHOMPstation edit end + all_tracks += T /datum/controller/subsystem/media_tracks/proc/sort_tracks() report_progress("Sorting media tracks...") sortTim(all_tracks, /proc/cmp_media_track_asc) - + jukebox_tracks.Cut() lobby_tracks.Cut() - + /// CHOMPstation edit start: Jack - Injecting casino track into new jukebox subsystem + casino_tracks.Cut() + /// CHOMPstation edit end + for(var/datum/track/T in all_tracks) - if(!T.secret) + /// CHOMPstation edit start: Jack - Injecting casino track into new jukebox subsystem + if(!T.secret && !T.casino) jukebox_tracks += T if(T.lobby) lobby_tracks += T + if(T.casino) + casino_tracks += T + /// CHOMPstation edit end /datum/controller/subsystem/media_tracks/proc/manual_track_add() var/client/C = usr.client if(!check_rights(R_DEBUG|R_FUN)) return - + // Required var/url = input(C, "REQUIRED: Provide URL for track, or paste JSON if you know what you're doing. See code comments.", "Track URL") as message|null if(!url) @@ -94,8 +108,9 @@ SUBSYSTEM_DEF(media_tracks) * "genre": artist of the song, REALLY try to match an existing one (text) * "secret": only on hacked jukeboxes (true/false) * "lobby": plays in the lobby (true/false) + * "casino": plays in the casino (true/false) CHOMPstation casino */ - + if(islist(json)) for(var/song in json) if(!islist(song)) @@ -104,18 +119,18 @@ SUBSYSTEM_DEF(media_tracks) var/list/songdata = song if(!songdata["url"] || !songdata["title"] || !songdata["duration"]) to_chat(C, "URL, Title, or Duration was missing from a song. Skipping.") - continue - var/datum/track/T = new(songdata["url"], songdata["title"], songdata["duration"], songdata["artist"], songdata["genre"], songdata["secret"], songdata["lobby"]) + continue + var/datum/track/T = new(songdata["url"], songdata["title"], songdata["duration"], songdata["artist"], songdata["genre"], songdata["secret"], songdata["lobby"], songdata["casino"]) all_tracks += T - + report_progress("New media track added by [C]: [T.title]") sort_tracks() return - + var/title = input(C, "REQUIRED: Provide title for track", "Track Title") as text|null if(!title) return - + var/duration = input(C, "REQUIRED: Provide duration for track (in deciseconds, aka seconds*10)", "Track Duration") as num|null if(!duration) return @@ -124,11 +139,11 @@ SUBSYSTEM_DEF(media_tracks) var/artist = input(C, "Optional: Provide artist for track", "Track Artist") as text|null if(isnull(artist)) // Cancel rather than empty string return - + var/genre = input(C, "Optional: Provide genre for track (try to match an existing one)", "Track Genre") as text|null if(isnull(genre)) // Cancel rather than empty string return - + var/secret = tgui_alert(C, "Optional: Mark track as secret?", "Track Secret", list("Yes", "Cancel", "No")) if(secret == "Cancel") return @@ -136,7 +151,7 @@ SUBSYSTEM_DEF(media_tracks) secret = TRUE else secret = FALSE - + var/lobby = tgui_alert(C, "Optional: Mark track as lobby music?", "Track Lobby", list("Yes", "Cancel", "No")) if(lobby == "Cancel") return @@ -145,13 +160,26 @@ SUBSYSTEM_DEF(media_tracks) else secret = FALSE + /// CHOMPstation edit start: Jack - Injecting casino track into new jukebox subsystem + var/casino = tgui_alert(C, "Optional: Mark track as casino music?", "Track Casino", list("Yes", "Cancel", "No")) + if(casino == "Cancel") + return + else if(secret == "Yes") + secret = TRUE + else + secret = FALSE + /// CHOMPstation edit end + var/datum/track/T = new(url, title, duration, artist, genre) - + T.secret = secret T.lobby = lobby - + /// CHOMPstation edit start: Jack - Injecting casino track into new jukebox subsystem + T.casino = casino + /// CHOMPstation edit end + all_tracks += T - + report_progress("New media track added by [C]: [title]") sort_tracks() @@ -163,7 +191,7 @@ SUBSYSTEM_DEF(media_tracks) var/track = input(C, "Input track title or URL to remove (must be exact)", "Remove Track") as text|null if(!track) return - + for(var/datum/track/T in all_tracks) if(T.title == track || T.url == track) all_tracks -= T @@ -171,7 +199,7 @@ SUBSYSTEM_DEF(media_tracks) report_progress("Media track removed by [C]: [track]") sort_tracks() return - + to_chat(C, "") /datum/controller/subsystem/media_tracks/vv_get_dropdown() diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 06323a4f06..bd11672d1d 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -179,7 +179,7 @@ /obj/machinery/media/jukebox/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() - + data["playing"] = playing data["loop_mode"] = loop_mode data["volume"] = volume @@ -331,13 +331,13 @@ /obj/machinery/media/jukebox/ghost name = "ghost jukebox" desc = "A jukebox from the nether-realms! Spooky." - + plane = PLANE_GHOSTS invisibility = INVISIBILITY_OBSERVER alpha = 127 - + icon_state = "jukebox2-virtual" - + density = FALSE hacked = TRUE @@ -348,7 +348,7 @@ // Just junk to make it sneaky - I wish a lot more stuff was on /obj/machinery/media instead of /jukebox so I could use that. /obj/machinery/media/jukebox/ghost/is_incorporeal() - return TRUE + return TRUE /obj/machinery/media/jukebox/ghost/audible_message(message, deaf_message, hearing_distance, radio_message, runemessage) return /obj/machinery/media/jukebox/ghost/visible_message(message, blind_message, list/exclude_mobs, range, runemessage) @@ -360,7 +360,7 @@ /obj/machinery/media/jukebox/ghost/attack_hand(var/mob/user as mob) return /obj/machinery/media/jukebox/ghost/update_use_power(new_use_power) - return + return /obj/machinery/media/jukebox/ghost/power_change() return /obj/machinery/media/jukebox/ghost/emp_act(severity) @@ -368,7 +368,7 @@ /obj/machinery/media/jukebox/ghost/emag_act(remaining_charges, mob/user) return /obj/machinery/media/jukebox/ghost/explode() - return + return /obj/machinery/media/jukebox/ghost/update_icon() if(playing) animate(src, alpha = 200, time = 5, loop = -1) @@ -394,16 +394,16 @@ var/client/C = usr.client if(!check_rights(R_FUN|R_ADMIN)) return - + // Required var/url = input(C, "REQUIRED: Provide URL for track", "Track URL") as text|null if(!url) return - + var/title = input(C, "REQUIRED: Provide title for track", "Track Title") as text|null if(!title) return - + var/duration = input(C, "REQUIRED: Provide duration for track (in deciseconds, aka seconds*10)", "Track Duration") as num|null if(!duration) return @@ -412,12 +412,12 @@ var/artist = input(C, "Optional: Provide artist for track", "Track Artist") as text|null if(isnull(artist)) // Cancel rather than empty string return - + // So they're obvious and grouped var/genre = "! Admin Loaded !" - + custom_tracks += new /datum/track(url, title, duration, artist, genre) - + /obj/machinery/media/jukebox/ghost/proc/manual_track_remove() var/client/C = usr.client if(!check_rights(R_FUN|R_ADMIN)) @@ -426,13 +426,13 @@ var/track = input(C, "Input track title or URL to remove (must be exact)", "Remove Track") as text|null if(!track) return - + for(var/datum/track/T in custom_tracks) if(T.title == track || T.url == track) custom_tracks -= T qdel(T) return - + to_chat(C, "") /obj/machinery/media/jukebox/ghost/vv_get_dropdown() diff --git a/code/game/machinery/jukebox_ch.dm b/code/game/machinery/jukebox_ch.dm index 38776c6653..c15ce12aa7 100644 --- a/code/game/machinery/jukebox_ch.dm +++ b/code/game/machinery/jukebox_ch.dm @@ -1,23 +1,12 @@ /obj/machinery/media/jukebox/casinojukebox name = "space casino jukebox" + desc = "A jukebox to play the tracks on the golden goose, jazzy~" icon = 'icons/obj/casino_ch.dmi' icon_state = "casinojukebox-nopower" state_base = "casinojukebox" -/* Commenting out for now due to conflicts with upstream jukebox changes. -// On initialization, copy our tracks from the global list -/obj/machinery/media/jukebox/casinojukebox/Initialize() - . = ..() - if(LAZYLEN(all_jukebox_tracks)) //Global list has tracks - tracks.Cut() - secret_tracks.Cut() - for(var/datum/track/T in all_jukebox_tracks) //Load them - if(!T.casino) - tracks -= T - secret_tracks -= T - if(T.casino) - tracks |= T - else if(!LAZYLEN(tracks)) //We don't even have default tracks - stat |= BROKEN // No tracks configured this round! -*/ + use_power = USE_POWER_OFF + +/obj/machinery/media/jukebox/casinojukebox/getTracksList() + return SSmedia_tracks.casino_tracks \ No newline at end of file diff --git a/config/jukebox.json b/config/jukebox.json index 192ab502ed..d6624c2ade 100644 --- a/config/jukebox.json +++ b/config/jukebox.json @@ -3508,5 +3508,396 @@ "lobby": false, "jukebox": true, "genre": "Rock" +}, +{ +"url" : "https://cdn.discordapp.com/attachments/404660884531707906/676726491806957568/Cassette.mp3", +"title" : "Cassette", +"duration" : 2310, +"artist" : "Efence", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Ambience" +}, +{ +"url" : "https://cdn.discordapp.com/attachments/676384242426707979/676730040624480264/Glowing_Red_Dust.mp3", +"title" : "Red Glowing Dust", +"duration" : 3370, +"artist" : "Jón Hallur Haraldsson (also known as RealX)", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Ambience" +}, +{ + +"url" : "https://cdn.discordapp.com/attachments/676384242426707979/676730820530274323/Stellardrone_-_Eternity.mp3", +"title" : "Eternity", +"duration" : 3810, +"artist" : "Stellardrone", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Ambience" +}, +{ +"duration" : 4850, +"url" : "https://cdn.discordapp.com/attachments/612993188655005697/676732888712216596/DJ-ZEK_-_Simulate.mp3", +"title" : "Simulate", +"artist" : "Fawxtrot (now know as DJ Zek)", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Ambience" +}, +{ +"duration" : 13720, +"url" : "https://cdn.discordapp.com/attachments/520929567540772873/707899715261562960/FitnessGram_20_Meter_PACER_Test_Full_Length_OFFICIAL_Audio_Version.mp3", +"title" : "The FitnessGram Pacer Test", +"artist" : "The Cooper Institute (FitnessGram)", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Ambience" +}, +{ +"duration" : 2040, +"url" : "https://cdn.discordapp.com/attachments/575066308362895444/701639140109844530/Peaceful_Orbits.mp3", +"title" : "Peaceful Orbits", +"artist" : "TeknoAXE", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Ambience" +}, +{ +"duration" : 2300, +"url" : "https://cdn.discordapp.com/attachments/575066308362895444/701639311896084511/Passing_Time_in_an_Escape_Pod.mp3", +"title" : "Passing Time in an Escape Pod", +"artist" : "TeknoAXE", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Ambience" +}, +{ +"duration" : 2790, +"url" : "https://cdn.discordapp.com/attachments/331435060735508480/613310956927451137/Persona_5_48_-_Beneath_the_Mask_-rain-.mp3", +"title" : "Beneath the Mask -Rain Version-", +"artist" : "Persona 5", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Jazz" +}, +{ +"duration" : 2100, +"url" : "https://cdn.discordapp.com/attachments/331037116094087168/543191420370944001/DragonSharkOriginal3.mp3", +"title" : "Terrorbyte/Dragon Shark theme", +"artist" : "RetroSpecter", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ +"duration" : 1600, +"url" : "https://cdn.discordapp.com/attachments/528973352728264714/583441087633555456/Prey_-_Everything_is_Going_to_Be_Ok_online-audio-converter.com.mp3", +"title" : "Everything Is Going To Be Ok", +"artist" : "Mick Gordon", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Electronic" +}, +{ +"duration" : 2440, +"url" : "https://cdn.discordapp.com/attachments/311691674130710528/463590234978910228/Saga_of_Tanya_the_Evil_-_Jingo_Jungle_Opening_ENGLISH_ver_AmaLee.mp3", +"title" : "Jingo Jungle", +"artist" : "Leeandlie http://bit.ly/Leeandlie", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Electronic" +}, +{ +"duration" : 4030, +"url" : "https://cdn.discordapp.com/attachments/311691674130710528/468345155498541066/TheMadnessOfFate.mp3", +"title" : "Madness of Fate", +"artist" : "NIIC the singing dog - http://bit.ly/NIICDOGYT", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Electronic" +}, +{ +"duration" : 2350, +"url" : "https://cdn.discordapp.com/attachments/311691674130710528/449909217403469837/Hard_Bass_School_-_narkotik_kal.mp3", +"title" : "Narkotik kal", +"artist" : "Hardbass", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Ambience" +}, +{ +"duration" : 2850, +"url" : "https://cdn.discordapp.com/attachments/528973352728264714/613807206047154217/TERRORBYTE_-_HELIOS.mp3", +"title" : "Helios", +"artist" : "TERRORBYTE", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Metal" +}, +{ +"duration" : 1110, +"url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308819422838784/System_Of_A_Down_-_Shimmy_11.mp3", +"title" : "Shimmy", +"artist" : "System of a Down", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ +"duration" : 1630, +"url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308919067049995/System_Of_A_Down_-_Science_10.mp3", +"title" : "Science", +"artist" : "System of a Down", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ +"duration" : 1750, +"url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308944706699284/System_Of_A_Down_-_Deer_Dance_03.mp3", +"title" : "deer dance", +"artist" : "System of a Down", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ + "duration" : 1790, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308945411473428/System_Of_A_Down_-_Atwa.mp3", + "title" : "Atwa", +"artist" : "System of a Down", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ + "duration" : 2400, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308969772122112/System_Of_A_Down_-_Forest_08.mp3", + "title" : "Forest", +"artist" : "System of a Down", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ + "duration" : 2110, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308978089426985/System_Of_A_Down_-_Prison_Song_01.mp3", + "title" : "Prison song", +"artist" : "System of a Down", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ + "duration" : 2150, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453308978089426985/System_Of_A_Down_-_Prison_Song_01.mp3", + "title" : "SPIDERS!", +"artist" : "System of a Down", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ + "duration" : 2320, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453309000780611604/System_Of_A_Down_-_Aerials_14.mp3", + "title" : "Aerials", +"artist" : "System of a Down", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ + "duration" : 1260, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/453309015955472394/System_Of_A_Down_-_Jet_Pilot_04.mp3", + "title" : "Jet Pilot", +"artist" : "System of a Down", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ + "duration" : 1510, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/454653832945860608/Skeleton_Man-_The_Axis_of_Awesome.mp3", + "title" : "Skeleton Man", + "artist" : "AoW", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Classical and Orchestral" +}, +{ + "duration" : 2770, + "url" : "https://cdn.discordapp.com/attachments/745916615606140938/775593951259918336/Nanook_Rubs_It.mp3", + "title" : "Nanook Rubs It", + "artist" : "Frank Zappa", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Country and Western" +}, +{ + "duration" : 3370, + "url" : "https://cdn.discordapp.com/attachments/745916615606140938/775593948307521566/Muffin_Man.mp3", + "title" : "Muffin Man", + "artist" : "Frank Zappa", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Folk and Indie" +}, +{ + "duration" : 1760, + "url" : "https://cdn.discordapp.com/attachments/404660884531707906/456271996314058752/Edgar_Rothermich_-01_Theme_from_Silent_Hill_jungle-vibe.com.mp3", + "title" : "Silent Hill", + "artist" : "Akira Yamaoka and Edgar Rothermich", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Country and Western" +}, +{ + "duration" : 1910, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490120240300052/Nightcore_-_Tetris.mp3", + "title" : "Tetris Remixed", + "artist" : "nightcore", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Electronic" +}, +{ + "duration" : 2030, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490219167154186/VERSACE_2017_-_TIX__The_Pssy_Project.mp3", + "title" : "Versance", + "artist" : "PussyProject", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Classical and Orchestral" +}, +{ + "duration" : 2400, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490229523021834/-_.mp3", + "title" : "Russian Techno", + "artist" : "Some russians", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Hip-Hop and Rap" +}, +{ + "duration" : 2200, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490231611654144/Rock_Dog_2017_Movie_Official_Lyric_Video_Glorious_by_Adam_Friedman.mp3", + "title" : "Gloriouse", + "artist" : "Rock Dog", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Rock" +}, +{ + "duration" : 2580, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490245725487104/Gigi_DAgostino_-_You_Spin_Me_Round__Tecno_Fes_2_.mp3", + "title" : "You spin me around", + "artist" : "Gigi DAgostino", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Pop" +}, +{ + "duration" : 2640, + "url" : "https://cdn.discordapp.com/attachments/377217220041900034/460490246610747402/-__Kyary_Pamyu_Pamyu_-.mp3", + "title" : "Pamyu Pamyu", + "artist" : "Kyary", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Pop" +}, +{ +"duration" : 1620, +"url" : "https://cdn.discordapp.com/attachments/377217220041900034/457628201200648202/Berserk_-_S3RL_ft_Iceman.mp3", +"title" : "Beserk", +"artist" : "S3RL ft Iceman", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Metal" +}, +{ +"duration" : 3510, +"url" : "https://cdn.discordapp.com/attachments/458630047167807488/520025625852117002/Nick_Hakim_-_Pour_Another.mp3", +"title" : "Pour Another", +"artist" : "Nick Hakim", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Jazz" +}, +{ + "duration" : 1270, + "url" : "https://cdn.discordapp.com/attachments/526693916859170816/559236326264668190/Ocean_Man.mp3", + "title" : "Ocean Man", + "artist" : "Ween", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Classical and Orchestral" +}, +{ +"duration" : 2990, +"url" : "https://cdn.discordapp.com/attachments/458630047167807488/520025672702492682/Nick_Hakim_-_I_Dont_Know.mp3", +"title" : "I dont know", +"artist" : "Nick Hakim", +"secret": false, +"lobby": false, +"jukebox": true, +"genre": "Jazz" +}, +{ +"duration" : 1830, +"url" : "https://cdn.discordapp.com/attachments/404660884531707906/614356720503881728/Underfell_Megalovania.mp3", +"title" : "Underfell", +"artist" : "keno9988iii", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Metal" +}, +{ +"duration" : 3730, +"url" : "https://cdn.discordapp.com/attachments/661630061983825938/663112074880352276/Headhunterz_-_Scrap_Attack_HQ.mp3", +"title" : "Scrap Attack", +"artist" : "Headhunterz", +"secret": true, +"lobby": false, +"jukebox": true, +"genre": "Electronic" } ] \ No newline at end of file