|
2 | 2 | var/list/custom_songs = list() |
3 | 3 | var/internet_track_selected = null |
4 | 4 | var/internet_playing = FALSE |
| 5 | + var/current_stream_path = "" |
| 6 | + |
| 7 | +/obj/machinery/jukebox/Destroy() |
| 8 | + stop_internet_stream() |
| 9 | + return ..() |
5 | 10 |
|
6 | 11 | /obj/machinery/jukebox/ui_data(mob/user) |
7 | 12 | var/list/data = ..() |
8 | 13 | data["internet_sound_enabled"] = CONFIG_GET(flag/request_internet_sound) ? TRUE : FALSE |
9 | 14 |
|
10 | 15 | if(internet_track_selected) |
11 | 16 | data["track_selected"] = internet_track_selected |
12 | | - if(internet_playing) |
13 | | - data["active"] = TRUE |
| 17 | + data["active"] = internet_playing ? TRUE : FALSE |
14 | 18 |
|
15 | 19 | var/list/all_songs = data["songs"] |
16 | 20 | if(!all_songs) |
|
35 | 39 |
|
36 | 40 | if(custom_songs[track_name]) |
37 | 41 | internet_track_selected = track_name |
38 | | - internet_playing = TRUE |
39 | | - |
40 | | - var/mob/user = ui.user |
41 | | - if(user) |
42 | | - var/sound/mute_sound = sound(null) |
43 | | - mute_sound.channel = CHANNEL_JUKEBOX |
44 | | - SEND_SOUND(user, mute_sound) |
| 42 | + if(internet_playing) |
| 43 | + stop_internet_stream(ui.user) |
45 | 44 |
|
46 | 45 | if(hascall(src, "turn_off")) |
47 | 46 | call(src, "turn_off")() |
48 | 47 | else if(hascall(src, "stop_playing")) |
49 | 48 | call(src, "stop_playing")() |
50 | 49 |
|
51 | | - var/request_url = custom_songs[track_name] |
52 | | - if(user && user.client) |
53 | | - to_chat(user, span_info("Playing internet stream: [track_name]..."), confidential = TRUE) |
54 | | - GLOB.requests.music_request(user.client, request_url, null) |
55 | | - |
56 | 50 | update_static_data_for_all_viewers() |
57 | 51 | return TRUE |
58 | 52 | else |
59 | 53 | internet_track_selected = null |
60 | | - internet_playing = FALSE |
| 54 | + if(internet_playing) |
| 55 | + stop_internet_stream(ui.user) |
61 | 56 |
|
62 | 57 | if(action == "toggle") |
63 | 58 | if(internet_track_selected) |
64 | | - internet_playing = !internet_playing |
65 | 59 | var/mob/user = ui.user |
| 60 | + if(!user) |
| 61 | + return TRUE |
66 | 62 |
|
67 | | - if(!internet_playing) |
68 | | - if(user) |
69 | | - var/sound/mute_sound = sound(null) |
70 | | - mute_sound.channel = CHANNEL_JUKEBOX |
71 | | - SEND_SOUND(user, mute_sound) |
| 63 | + if(internet_playing) |
| 64 | + stop_internet_stream(user) |
72 | 65 | else |
73 | | - var/request_url = custom_songs[internet_track_selected] |
74 | | - if(user && user.client) |
75 | | - GLOB.requests.music_request(user.client, request_url, null) |
| 66 | + if(hascall(src, "turn_off")) |
| 67 | + call(src, "turn_off")() |
| 68 | + else if(hascall(src, "stop_playing")) |
| 69 | + call(src, "stop_playing")() |
| 70 | + |
| 71 | + internet_playing = TRUE |
| 72 | + update_static_data_for_all_viewers() |
| 73 | + INVOKE_ASYNC(src, TYPE_PROC_REF(/obj/machinery/jukebox, start_internet_stream), user) |
76 | 74 |
|
77 | | - update_static_data_for_all_viewers() |
78 | 75 | return TRUE |
79 | 76 |
|
80 | 77 | if(action == "request_internet_track") |
|
120 | 117 | var/display_name = "🌐 | [track_title]" |
121 | 118 | custom_songs[display_name] = request_url |
122 | 119 | internet_track_selected = display_name |
123 | | - internet_playing = TRUE |
124 | 120 |
|
125 | | - if(user) |
126 | | - var/sound/mute_sound = sound(null) |
127 | | - mute_sound.channel = CHANNEL_JUKEBOX |
128 | | - SEND_SOUND(user, mute_sound) |
129 | | - |
130 | | - if(hascall(src, "turn_off")) |
131 | | - call(src, "turn_off")() |
132 | | - else if(hascall(src, "stop_playing")) |
133 | | - call(src, "stop_playing")() |
| 121 | + if(internet_playing) |
| 122 | + stop_internet_stream(user) |
134 | 123 |
|
135 | 124 | log_internet_request("[user.key]/([user.name]) successfully loaded via Jukebox: [request_url]") |
136 | 125 | to_chat(user, span_info("Added '[display_name]' to the track list."), confidential = TRUE) |
137 | 126 |
|
138 | | - GLOB.requests.music_request(user.client, request_url, null) |
139 | | - |
140 | 127 | var/list/admin_message = list() |
141 | | - admin_message += ("[ADMIN_FULLMONTY(user)] [ADMIN_SC(user)] has played the following internet track via Jukebox:<br>") |
| 128 | + admin_message += ("[ADMIN_FULLMONTY(user)] [ADMIN_SC(user)] has added the following internet track via Jukebox:<br>") |
142 | 129 | admin_message += ("<b>[display_name]</b><br>[span_linkify(request_url)]") |
143 | 130 |
|
144 | 131 | for(var/client/admin_client in GLOB.admins) |
|
147 | 134 |
|
148 | 135 | SSblackbox.record_feedback("tally", "music_request", 1, "Music Direct Play") |
149 | 136 | update_static_data_for_all_viewers() |
| 137 | + |
| 138 | +/obj/machinery/jukebox/proc/start_internet_stream(mob/user) |
| 139 | + var/request_url = custom_songs[internet_track_selected] |
| 140 | + if(!request_url) |
| 141 | + internet_playing = FALSE |
| 142 | + update_static_data_for_all_viewers() |
| 143 | + return |
| 144 | + |
| 145 | + to_chat(user, span_notice("Downloading and processing audio.")) |
| 146 | + |
| 147 | + var/safe_url = replacetext(request_url, "\"", "") |
| 148 | + safe_url = replacetext(safe_url, ";", "") |
| 149 | + safe_url = replacetext(safe_url, "&", "") |
| 150 | + |
| 151 | + var/stream_id = rand(1111, 9999) |
| 152 | + var/output_template = "data/music_cache/yt_[stream_id]" |
| 153 | + current_stream_path = "[output_template].ogg" |
| 154 | + |
| 155 | + fdel(current_stream_path) |
| 156 | + |
| 157 | + var/shell_command = "yt-dlp -x --audio-format vorbis --audio-quality 5 -o \"[output_template].%(ext)s\" \"[safe_url]\"" |
| 158 | + |
| 159 | + shell(shell_command) |
| 160 | + |
| 161 | + var/check_attempts = 0 |
| 162 | + while(!fexists(current_stream_path) && check_attempts < 40) |
| 163 | + sleep(5) |
| 164 | + check_attempts++ |
| 165 | + |
| 166 | + if(!fexists(current_stream_path) || !internet_playing) |
| 167 | + to_chat(user, span_danger("Failed to download or extract audio from YouTube. Check server yt-dlp/ffmpeg installation.")) |
| 168 | + internet_playing = FALSE |
| 169 | + if(current_stream_path) |
| 170 | + fdel(current_stream_path) |
| 171 | + current_stream_path = "" |
| 172 | + update_static_data_for_all_viewers() |
| 173 | + return |
| 174 | + |
| 175 | + var/sound/internet_sound = sound(file(current_stream_path)) |
| 176 | + internet_sound.wait = 0 |
| 177 | + internet_sound.repeat = 0 |
| 178 | + internet_sound.channel = CHANNEL_JUKEBOX |
| 179 | + internet_sound.volume = 30 |
| 180 | + |
| 181 | + SEND_SOUND(user, internet_sound) |
| 182 | + to_chat(user, span_info("Now playing stream: [internet_track_selected].")) |
| 183 | + |
| 184 | +/obj/machinery/jukebox/proc/stop_internet_stream(mob/user) |
| 185 | + internet_playing = FALSE |
| 186 | + if(user) |
| 187 | + var/sound/mute_sound = sound(null) |
| 188 | + mute_sound.channel = CHANNEL_JUKEBOX |
| 189 | + SEND_SOUND(user, mute_sound) |
| 190 | + |
| 191 | + if(current_stream_path) |
| 192 | + fdel(current_stream_path) |
| 193 | + current_stream_path = "" |
| 194 | + |
| 195 | + update_static_data_for_all_viewers() |
0 commit comments