mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-27 17:41:50 +00:00
* Play Internet Sound respects start time For example, adding &t=400 to youtube links. Doesn't try to parse the start time, youtube-dl does that for us already. Will probably work on most sites not just youtube. * [Play Internet Sound] now supports end time too Switched event handler for start to loadeddata from canplay loadeddata fires when the first frame is available this is quicker and more consistent than canplay, which tries to predict at least a few moments of playability being available before it fires * [Internet Sound] music_extra_data now starts null
164 lines
6.5 KiB
Plaintext
164 lines
6.5 KiB
Plaintext
/client/proc/play_sound(S as sound)
|
|
set category = "Fun"
|
|
set name = "Play Global Sound"
|
|
if(!check_rights(R_SOUND))
|
|
return
|
|
|
|
var/freq = 1
|
|
var/vol = input(usr, "What volume would you like the sound to play at?",, 100) as null|num
|
|
if(!vol)
|
|
return
|
|
vol = CLAMP(vol, 1, 100)
|
|
|
|
var/sound/admin_sound = new()
|
|
admin_sound.file = S
|
|
admin_sound.priority = 250
|
|
admin_sound.channel = CHANNEL_ADMIN
|
|
admin_sound.frequency = freq
|
|
admin_sound.wait = 1
|
|
admin_sound.repeat = 0
|
|
admin_sound.status = SOUND_STREAM
|
|
admin_sound.volume = vol
|
|
|
|
var/res = alert(usr, "Show the title of this song to the players?",, "Yes","No", "Cancel")
|
|
switch(res)
|
|
if("Yes")
|
|
to_chat(world, "<span class='boldannounce'>An admin played: [S]</span>")
|
|
if("Cancel")
|
|
return
|
|
|
|
log_admin("[key_name(src)] played sound [S]")
|
|
message_admins("[key_name_admin(src)] played sound [S]")
|
|
|
|
for(var/mob/M in GLOB.player_list)
|
|
if(M.client.prefs.toggles & SOUND_MIDI)
|
|
var/user_vol = M.client.chatOutput.adminMusicVolume
|
|
if(user_vol)
|
|
admin_sound.volume = vol * (user_vol / 100)
|
|
SEND_SOUND(M, admin_sound)
|
|
admin_sound.volume = vol
|
|
|
|
SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Global Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
|
|
/client/proc/play_local_sound(S as sound)
|
|
set category = "Fun"
|
|
set name = "Play Local Sound"
|
|
if(!check_rights(R_SOUND))
|
|
return
|
|
|
|
log_admin("[key_name(src)] played a local sound [S]")
|
|
message_admins("[key_name_admin(src)] played a local sound [S]")
|
|
playsound(get_turf(src.mob), S, 50, 0, 0)
|
|
SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/play_web_sound()
|
|
set category = "Fun"
|
|
set name = "Play Internet Sound"
|
|
if(!check_rights(R_SOUND))
|
|
return
|
|
|
|
var/ytdl = CONFIG_GET(string/invoke_youtubedl)
|
|
if(!ytdl)
|
|
to_chat(src, "<span class='boldwarning'>Youtube-dl was not configured, action unavailable</span>") //Check config.txt for the INVOKE_YOUTUBEDL value
|
|
return
|
|
|
|
var/web_sound_input = input("Enter content URL (supported sites only, leave blank to stop playing)", "Play Internet Sound via youtube-dl") as text|null
|
|
if(istext(web_sound_input))
|
|
var/web_sound_url = ""
|
|
var/stop_web_sounds = FALSE
|
|
var/list/music_extra_data = list()
|
|
if(length(web_sound_input))
|
|
|
|
web_sound_input = trim(web_sound_input)
|
|
if(findtext(web_sound_input, ":") && !findtext(web_sound_input, GLOB.is_http_protocol))
|
|
to_chat(src, "<span class='boldwarning'>Non-http(s) URIs are not allowed.</span>")
|
|
to_chat(src, "<span class='warning'>For youtube-dl shortcuts like ytsearch: please use the appropriate full url from the website.</span>")
|
|
return
|
|
var/shell_scrubbed_input = shell_url_scrub(web_sound_input)
|
|
var/list/output = world.shelleo("[ytdl] --format \"bestaudio\[ext=mp3]/best\[ext=mp4]\[height<=360]/bestaudio\[ext=m4a]/bestaudio\[ext=aac]\" --dump-single-json --no-playlist -- \"[shell_scrubbed_input]\"")
|
|
var/errorlevel = output[SHELLEO_ERRORLEVEL]
|
|
var/stdout = output[SHELLEO_STDOUT]
|
|
var/stderr = output[SHELLEO_STDERR]
|
|
if(!errorlevel)
|
|
var/list/data
|
|
try
|
|
data = json_decode(stdout)
|
|
catch(var/exception/e)
|
|
to_chat(src, "<span class='boldwarning'>Youtube-dl JSON parsing FAILED:</span>")
|
|
to_chat(src, "<span class='warning'>[e]: [stdout]</span>")
|
|
return
|
|
|
|
if (data["url"])
|
|
web_sound_url = data["url"]
|
|
var/title = "[data["title"]]"
|
|
var/webpage_url = title
|
|
if (data["webpage_url"])
|
|
webpage_url = "<a href=\"[data["webpage_url"]]\">[title]</a>"
|
|
music_extra_data["start"] = data["start_time"]
|
|
music_extra_data["end"] = data["end_time"]
|
|
|
|
var/res = alert(usr, "Show the title of and link to this song to the players?\n[title]",, "No", "Yes", "Cancel")
|
|
switch(res)
|
|
if("Yes")
|
|
to_chat(world, "<span class='boldannounce'>An admin played: [webpage_url]</span>")
|
|
if("Cancel")
|
|
return
|
|
|
|
SSblackbox.record_feedback("nested tally", "played_url", 1, list("[ckey]", "[web_sound_input]"))
|
|
log_admin("[key_name(src)] played web sound: [web_sound_input]")
|
|
message_admins("[key_name(src)] played web sound: [web_sound_input]")
|
|
else
|
|
to_chat(src, "<span class='boldwarning'>Youtube-dl URL retrieval FAILED:</span>")
|
|
to_chat(src, "<span class='warning'>[stderr]</span>")
|
|
|
|
else //pressed ok with blank
|
|
log_admin("[key_name(src)] stopped web sound")
|
|
message_admins("[key_name(src)] stopped web sound")
|
|
web_sound_url = null
|
|
stop_web_sounds = TRUE
|
|
|
|
if(web_sound_url && !findtext(web_sound_url, GLOB.is_http_protocol))
|
|
to_chat(src, "<span class='boldwarning'>BLOCKED: Content URL not using http(s) protocol</span>")
|
|
to_chat(src, "<span class='warning'>The media provider returned a content URL that isn't using the HTTP or HTTPS protocol</span>")
|
|
return
|
|
if(web_sound_url || stop_web_sounds)
|
|
for(var/m in GLOB.player_list)
|
|
var/mob/M = m
|
|
var/client/C = M.client
|
|
if((C.prefs.toggles & SOUND_MIDI) && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
|
|
if(!stop_web_sounds)
|
|
C.chatOutput.sendMusic(web_sound_url, music_extra_data)
|
|
else
|
|
C.chatOutput.stopMusic()
|
|
|
|
SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound")
|
|
|
|
/client/proc/set_round_end_sound(S as sound)
|
|
set category = "Fun"
|
|
set name = "Set Round End Sound"
|
|
if(!check_rights(R_SOUND))
|
|
return
|
|
|
|
SSticker.SetRoundEndSound(S)
|
|
|
|
log_admin("[key_name(src)] set the round end sound to [S]")
|
|
message_admins("[key_name_admin(src)] set the round end sound to [S]")
|
|
SSblackbox.record_feedback("tally", "admin_verb", 1, "Set Round End Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
/client/proc/stop_sounds()
|
|
set category = "Debug"
|
|
set name = "Stop All Playing Sounds"
|
|
if(!src.holder)
|
|
return
|
|
|
|
log_admin("[key_name(src)] stopped all currently playing sounds.")
|
|
message_admins("[key_name_admin(src)] stopped all currently playing sounds.")
|
|
for(var/mob/M in GLOB.player_list)
|
|
if(M.client)
|
|
SEND_SOUND(M, sound(null))
|
|
var/client/C = M.client
|
|
if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
|
|
C.chatOutput.stopMusic()
|
|
SSblackbox.record_feedback("tally", "admin_verb", 1, "Stop All Playing Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|