Skip to content

Commit afe3fa0

Browse files
committed
add extraction by yt-dlp and ffmpeg
1 parent 600b6d4 commit afe3fa0

1 file changed

Lines changed: 84 additions & 38 deletions

File tree

  • modular_meta/features/jukeboxes_music/code

modular_meta/features/jukeboxes_music/code/music.dm

Lines changed: 84 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,19 @@
22
var/list/custom_songs = list()
33
var/internet_track_selected = null
44
var/internet_playing = FALSE
5+
var/current_stream_path = ""
6+
7+
/obj/machinery/jukebox/Destroy()
8+
stop_internet_stream()
9+
return ..()
510

611
/obj/machinery/jukebox/ui_data(mob/user)
712
var/list/data = ..()
813
data["internet_sound_enabled"] = CONFIG_GET(flag/request_internet_sound) ? TRUE : FALSE
914

1015
if(internet_track_selected)
1116
data["track_selected"] = internet_track_selected
12-
if(internet_playing)
13-
data["active"] = TRUE
17+
data["active"] = internet_playing ? TRUE : FALSE
1418

1519
var/list/all_songs = data["songs"]
1620
if(!all_songs)
@@ -35,46 +39,39 @@
3539

3640
if(custom_songs[track_name])
3741
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)
4544

4645
if(hascall(src, "turn_off"))
4746
call(src, "turn_off")()
4847
else if(hascall(src, "stop_playing"))
4948
call(src, "stop_playing")()
5049

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-
5650
update_static_data_for_all_viewers()
5751
return TRUE
5852
else
5953
internet_track_selected = null
60-
internet_playing = FALSE
54+
if(internet_playing)
55+
stop_internet_stream(ui.user)
6156

6257
if(action == "toggle")
6358
if(internet_track_selected)
64-
internet_playing = !internet_playing
6559
var/mob/user = ui.user
60+
if(!user)
61+
return TRUE
6662

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)
7265
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)
7674

77-
update_static_data_for_all_viewers()
7875
return TRUE
7976

8077
if(action == "request_internet_track")
@@ -120,25 +117,15 @@
120117
var/display_name = "🌐 | [track_title]"
121118
custom_songs[display_name] = request_url
122119
internet_track_selected = display_name
123-
internet_playing = TRUE
124120

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)
134123

135124
log_internet_request("[user.key]/([user.name]) successfully loaded via Jukebox: [request_url]")
136125
to_chat(user, span_info("Added '[display_name]' to the track list."), confidential = TRUE)
137126

138-
GLOB.requests.music_request(user.client, request_url, null)
139-
140127
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>")
142129
admin_message += ("<b>[display_name]</b><br>[span_linkify(request_url)]")
143130

144131
for(var/client/admin_client in GLOB.admins)
@@ -147,3 +134,62 @@
147134

148135
SSblackbox.record_feedback("tally", "music_request", 1, "Music Direct Play")
149136
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

Comments
 (0)