diff --git a/.gitignore b/.gitignore index adb36c8..743373a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -*.exe \ No newline at end of file +*.exe +.import \ No newline at end of file diff --git a/godot/Globals.gd b/godot/Globals.gd new file mode 100644 index 0000000..00c8428 --- /dev/null +++ b/godot/Globals.gd @@ -0,0 +1,22 @@ +extends Node2D + +var pid_of_dlserver = 0 +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func _notification(what): + if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST: + print("Killing dl-server, pid ",pid_of_dlserver) + OS.kill(pid_of_dlserver) + get_tree().quit() # default behavior diff --git a/godot/Globals.tscn b/godot/Globals.tscn new file mode 100644 index 0000000..b9fc1c1 --- /dev/null +++ b/godot/Globals.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Globals.gd" type="Script" id=1] + +[node name="Globals" type="Node2D"] +script = ExtResource( 1 ) diff --git a/godot/Intro.ogg b/godot/Intro.ogg new file mode 100644 index 0000000..5d65f04 Binary files /dev/null and b/godot/Intro.ogg differ diff --git a/godot/Intro.ogg.import b/godot/Intro.ogg.import new file mode 100644 index 0000000..1c6f6ae --- /dev/null +++ b/godot/Intro.ogg.import @@ -0,0 +1,15 @@ +[remap] + +importer="ogg_vorbis" +type="AudioStreamOGGVorbis" +path="res://.import/Intro.ogg-dfe75727d0e47692e220adf97ddb7ad9.oggstr" + +[deps] + +source_file="res://Intro.ogg" +dest_files=[ "res://.import/Intro.ogg-dfe75727d0e47692e220adf97ddb7ad9.oggstr" ] + +[params] + +loop=true +loop_offset=0 diff --git a/godot/MicRecord.gd b/godot/MicRecord.gd new file mode 100644 index 0000000..12d6378 --- /dev/null +++ b/godot/MicRecord.gd @@ -0,0 +1,56 @@ +extends Control + +var effect +var recording + +func _ready(): + var idx = AudioServer.get_bus_index("Record") + effect = AudioServer.get_bus_effect(idx, 0) + print("We have ",AudioServer.bus_count," busses.") + for i in range(0,2): + print("Bus ",i," is called ",AudioServer.get_bus_name(i)) + print("index of `Record` is ",idx) + print("effect is", effect) + + +func _on_RecordButton_pressed(): + if effect.is_recording_active(): + recording = effect.get_recording() + $PlayButton.disabled = false + $SaveButton.disabled = false + effect.set_recording_active(false) + $RecordButton.text = "Record" + $Status.text = "" + else: + $PlayButton.disabled = true + $SaveButton.disabled = true + effect.set_recording_active(true) + $RecordButton.text = "Stop" + $Status.text = "Recording..." + + +func _on_PlayButton_pressed(): + print(recording) + print(recording.format) + print(recording.mix_rate) + print(recording.stereo) + var data = recording.get_data() + print(data) + print(data.size()) + $AudioStreamPlayer.stream = recording + $AudioStreamPlayer.play() + + +func _on_Play_Music_pressed(): + if $AudioStreamPlayer2.playing: + $AudioStreamPlayer2.stop() + $PlayMusic.text = "Play Music" + else: + $AudioStreamPlayer2.play() + $PlayMusic.text = "Stop Music" + + +func _on_SaveButton_pressed(): + var save_path = $SaveButton/Filename.text + recording.save_to_wav(save_path) + $Status.text = "Saved WAV file to: %s\n(%s)" % [save_path, ProjectSettings.globalize_path(save_path)] diff --git a/godot/MicRecord.tscn b/godot/MicRecord.tscn new file mode 100644 index 0000000..dfb3054 --- /dev/null +++ b/godot/MicRecord.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://MicRecord.gd" type="Script" id=1] +[ext_resource path="res://Intro.ogg" type="AudioStream" id=2] + +[sub_resource type="AudioStreamMicrophone" id=1] + +[node name="MicRecord" type="Control"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -320.0 +margin_top = -240.0 +margin_right = 320.0 +margin_bottom = 240.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AudioStreamRecord" type="AudioStreamPlayer" parent="."] +stream = SubResource( 1 ) +autoplay = true +bus = "Record" + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +autoplay = true + +[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 2 ) +volume_db = -6.0 + +[node name="RecordButton" type="Button" parent="."] +margin_left = 120.0 +margin_top = 100.0 +margin_right = 240.0 +margin_bottom = 140.0 +text = "Record" + +[node name="SaveButton" type="Button" parent="."] +margin_left = 120.0 +margin_top = 180.0 +margin_right = 240.0 +margin_bottom = 220.0 +disabled = true +text = "Save WAV To:" + +[node name="Filename" type="LineEdit" parent="SaveButton"] +margin_left = 180.0 +margin_right = 340.0 +margin_bottom = 40.0 +text = "user://record.wav" +caret_blink = true +caret_blink_speed = 0.5 + +[node name="PlayButton" type="Button" parent="."] +margin_left = 300.0 +margin_top = 100.0 +margin_right = 420.0 +margin_bottom = 140.0 +disabled = true +text = "Play" + +[node name="PlayMusic" type="Button" parent="."] +margin_left = 120.0 +margin_top = 260.0 +margin_right = 240.0 +margin_bottom = 300.0 +text = "Play Music" + +[node name="Status" type="Label" parent="."] +margin_left = 120.0 +margin_top = 340.0 +margin_right = 520.0 +margin_bottom = 340.0 +[connection signal="pressed" from="RecordButton" to="." method="_on_RecordButton_pressed"] +[connection signal="pressed" from="SaveButton" to="." method="_on_SaveButton_pressed"] +[connection signal="pressed" from="PlayButton" to="." method="_on_PlayButton_pressed"] +[connection signal="pressed" from="PlayMusic" to="." method="_on_Play_Music_pressed"] diff --git a/godot/VPMain.gd b/godot/VPMain.gd new file mode 100644 index 0000000..b646e1f --- /dev/null +++ b/godot/VPMain.gd @@ -0,0 +1,20 @@ +extends VideoPlayer + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + + +func _on_VPMain_finished(): + play() diff --git a/godot/VideoPlayer.gd b/godot/VideoPlayer.gd new file mode 100644 index 0000000..cb99402 --- /dev/null +++ b/godot/VideoPlayer.gd @@ -0,0 +1,24 @@ +extends VideoPlayer + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + + +func _on_VideoPlayer_ready(): + pass + + +func _on_Control_ready(): + pass # Replace with function body. diff --git a/godot/audio.tres b/godot/audio.tres new file mode 100644 index 0000000..6715205 --- /dev/null +++ b/godot/audio.tres @@ -0,0 +1,14 @@ +[gd_resource type="AudioBusLayout" load_steps=2 format=2] + +[sub_resource type="AudioEffectRecord" id=1] +resource_name = "Record" + +[resource] +bus/1/name = "Record" +bus/1/solo = false +bus/1/mute = true +bus/1/bypass_fx = false +bus/1/volume_db = 0.0 +bus/1/send = "Master" +bus/1/effect/0/effect = SubResource( 1 ) +bus/1/effect/0/enabled = true diff --git a/godot/default_env.tres b/godot/default_env.tres new file mode 100644 index 0000000..6715205 --- /dev/null +++ b/godot/default_env.tres @@ -0,0 +1,14 @@ +[gd_resource type="AudioBusLayout" load_steps=2 format=2] + +[sub_resource type="AudioEffectRecord" id=1] +resource_name = "Record" + +[resource] +bus/1/name = "Record" +bus/1/solo = false +bus/1/mute = true +bus/1/bypass_fx = false +bus/1/volume_db = 0.0 +bus/1/send = "Master" +bus/1/effect/0/effect = SubResource( 1 ) +bus/1/effect/0/enabled = true diff --git a/godot/download_video.gd b/godot/download_video.gd new file mode 100644 index 0000000..0fae2d5 --- /dev/null +++ b/godot/download_video.gd @@ -0,0 +1,60 @@ +extends Control + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + +var lastcheck = 0 + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + lastcheck += delta + if lastcheck > 1: + print("Last check > 1...") + lastcheck = 0; + $HTTPRequest.request("http://127.0.0.1:10435/status/") + # #$HTTPRequest.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed") + + + +func _on_Control_ready(): + # TODO: cross-platform how? + #var command = OS.get_user_data_dir()+"/youtube-dl.exe -o "+OS.get_user_data_dir()+"/temp https://www.youtube.com/watch?v=x1T6QFpd0J4 > "+OS.get_user_data_dir()+"/ytdl.log" + #print(command) + #OS.execute("CMD.exe", ["/C", command], false, output) + #for line in output: + # print(line) + #o.open(OS.get_user_data_dir()+"/ytdl.log", File.READ) + #var line = "" + #while !o.eof_reached(): + # line = o.get_line() + # print(line) + #print(OS.get_user_data_dir()) + $HTTPRequest.request("http://127.0.0.1:10435/get?url=https://www.youtube.com/watch?v=x1T6QFpd0J4") + #$HTTPRequest.request("http://127.0.0.1:10435/get?url=https://player.vimeo.com/video/459151338") + #https://www.youtube.com/watch?v=x1T6QFpd0J4 + + +func _on_HTTPRequest_request_completed(result, response_code, headers, body): + #print(result) + #print(response_code) + #print(headers) + #print(body.get_string_from_utf8()) + var json = JSON.parse(body.get_string_from_utf8()) + if json.result != null: + $VBoxContainer2/DownloadProgress.value = json.result["percentage"] + if json.result["percentage"] == 100: + get_tree().change_scene("res://justplayer.tscn") + #print(json.result) + #print(json.result["percentage"]) + #pass + + +func _on_DownloadProgress_changed(): + pass # Replace with function body. diff --git a/godot/download_video.tscn b/godot/download_video.tscn new file mode 100644 index 0000000..868ebc8 --- /dev/null +++ b/godot/download_video.tscn @@ -0,0 +1,51 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://download_video.gd" type="Script" id=1] + +[node name="Control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -0.890956 +margin_top = -1.7818 +margin_right = -0.890991 +margin_bottom = -1.7818 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_left = 1.0 +margin_top = 300.0 +margin_right = 1023.0 +margin_bottom = 316.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer"] +margin_right = 1022.0 +margin_bottom = 16.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +bbcode_enabled = true +bbcode_text = "[center]Downloading and converting video[/center]" +text = "Downloading and converting video" + +[node name="VBoxContainer2" type="VBoxContainer" parent="."] +margin_left = 213.816 +margin_top = 320.724 +margin_right = 837.816 +margin_bottom = 334.724 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DownloadProgress" type="ProgressBar" parent="VBoxContainer2"] +margin_right = 624.0 +margin_bottom = 14.0 + +[node name="HTTPRequest" type="HTTPRequest" parent="."] +[connection signal="ready" from="." to="." method="_on_Control_ready"] +[connection signal="changed" from="VBoxContainer2/DownloadProgress" to="." method="_on_DownloadProgress_changed"] +[connection signal="request_completed" from="HTTPRequest" to="." method="_on_HTTPRequest_request_completed"] diff --git a/godot/icon.png b/godot/icon.png new file mode 100644 index 0000000..c98fbb6 Binary files /dev/null and b/godot/icon.png differ diff --git a/godot/icon.png.import b/godot/icon.png.import new file mode 100644 index 0000000..96cbf46 --- /dev/null +++ b/godot/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.png" +dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/godot/justplayer.gd b/godot/justplayer.gd new file mode 100644 index 0000000..6a24c26 --- /dev/null +++ b/godot/justplayer.gd @@ -0,0 +1,23 @@ +extends Control + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + + +func _on_Control_ready(): + $vp.set_stream(load(OS.get_user_data_dir()+"/test.webm")) + print($vp.get_stream_name()) + $vp.play() + pass # Replace with function body. diff --git a/godot/justplayer.tscn b/godot/justplayer.tscn new file mode 100644 index 0000000..eea1979 --- /dev/null +++ b/godot/justplayer.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://VideoPlayer.gd" type="Script" id=1] +[ext_resource path="res://justplayer.gd" type="Script" id=2] + +[node name="Control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="vp" type="VideoPlayer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +[connection signal="ready" from="." to="." method="_on_Control_ready"] +[connection signal="ready" from="vp" to="vp" method="_on_VideoPlayer_ready"] diff --git a/godot/loadscreen.png b/godot/loadscreen.png new file mode 100644 index 0000000..61a4a63 Binary files /dev/null and b/godot/loadscreen.png differ diff --git a/godot/loadscreen.png.import b/godot/loadscreen.png.import new file mode 100644 index 0000000..3517da5 --- /dev/null +++ b/godot/loadscreen.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/loadscreen.png-9b47d6976e585d82c21226a16c2b64a0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://loadscreen.png" +dest_files=[ "res://.import/loadscreen.png-9b47d6976e585d82c21226a16c2b64a0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/godot/main_menu.gd b/godot/main_menu.gd new file mode 100644 index 0000000..e743cfb --- /dev/null +++ b/godot/main_menu.gd @@ -0,0 +1,27 @@ +extends Control + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func _on_Quit_pressed(): + get_tree().quit() + + +func _on_Button_pressed(): + get_tree().change_scene("res://download_video.tscn") + + +func _on_MicTest_pressed(): + get_tree().change_scene("res://MicRecord.tscn") diff --git a/godot/main_menu.tscn b/godot/main_menu.tscn new file mode 100644 index 0000000..fffa381 --- /dev/null +++ b/godot/main_menu.tscn @@ -0,0 +1,67 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://main_menu.gd" type="Script" id=1] + +[node name="Control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 0.033 +margin_bottom = 0.200001 +alignment = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +margin_right = 1000.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +alignment = 1 + +[node name="RichTextLabel" type="RichTextLabel" parent="HBoxContainer/VBoxContainer"] +margin_top = 2.0 +margin_right = 1000.0 +margin_bottom = 17.0 +size_flags_horizontal = 3 +bbcode_enabled = true +bbcode_text = "[center]MAIN MENU[/center]" +text = "MAIN MENU" +fit_content_height = true +scroll_active = false + +[node name="Quit" type="Button" parent="HBoxContainer"] +margin_left = 1004.0 +margin_right = 1024.0 +margin_bottom = 20.0 +text = "X" +script = ExtResource( 1 ) + +[node name="GridContainer" type="GridContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 0.815 +margin_top = 50.0 +margin_bottom = -3.05176e-05 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="DownloadPlayVid" type="Button" parent="GridContainer"] +margin_right = 109.0 +margin_bottom = 20.0 +text = "Test scenario 1" + +[node name="MicTest" type="Button" parent="GridContainer"] +margin_top = 24.0 +margin_right = 109.0 +margin_bottom = 44.0 +text = "Mic Test" +[connection signal="pressed" from="HBoxContainer/Quit" to="HBoxContainer/Quit" method="_on_Quit_pressed"] +[connection signal="pressed" from="GridContainer/DownloadPlayVid" to="." method="_on_Button_pressed"] +[connection signal="pressed" from="GridContainer/MicTest" to="." method="_on_MicTest_pressed"] diff --git a/godot/project.godot b/godot/project.godot new file mode 100644 index 0000000..32183c3 --- /dev/null +++ b/godot/project.godot @@ -0,0 +1,35 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +_global_script_classes=[ ] +_global_script_class_icons={ + +} + +[application] + +config/name="ASingCrow" +run/main_scene="res://startup.tscn" +config/icon="res://icon.png" + +[audio] + +default_bus_layout="res://default_env.tres" +enable_audio_input=true + +[autoload] + +Globals="*res://Globals.tscn" + +[rendering] + +quality/driver/driver_name="GLES2" +vram_compression/import_etc=true +vram_compression/import_etc2=false diff --git a/godot/startup.gd b/godot/startup.gd new file mode 100644 index 0000000..5cc6246 --- /dev/null +++ b/godot/startup.gd @@ -0,0 +1,45 @@ +extends Control + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + +func _on_Timer_timeout(): + get_tree().change_scene("res://main_menu.tscn") + + +func _on_Timer2_timeout(): + var output = [] + var o = File.new() + var dir = Directory.new() + if !o.file_exists('user://youtube-dl.exe'): + print("Need youtube-dl") + dir.copy("./youtube-dl.exe", "user://youtube-dl.exe") + if !o.file_exists('user://ffmpeg.exe'): + print("Need ffmpeg") + dir.copy("./ffmpeg.exe", "user://ffmpeg.exe") + if !o.file_exists('user://dlserver.exe'): + print("Need dlserver") + dir.copy("./dlserver.exe", "user://dlserver.exe") + Globals.pid_of_dlserver = OS.execute(".\\dlserver.exe", [OS.get_user_data_dir()], false) + print("Started dl-server, pid ", Globals.pid_of_dlserver) + $ValidateServerRunningTimer.start() + + +func _on_ValidateServerRunningTimer_timeout(): + $HTTPRequest.request("http://127.0.0.1:10435/") + + +func _on_HTTPRequest_request_completed(result, response_code, headers, body): + print("Received ",response_code," response from server, good enough!") + $SceneChangeTimer.start() diff --git a/godot/startup.tscn b/godot/startup.tscn new file mode 100644 index 0000000..3a40495 --- /dev/null +++ b/godot/startup.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://loadscreen.png" type="Texture" id=1] +[ext_resource path="res://startup.gd" type="Script" id=2] + +[node name="Control" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": true +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_bottom = 25.0 +alignment = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +margin_right = 1024.0 +margin_bottom = 625.0 +alignment = 1 + +[node name="TextureRect" type="TextureRect" parent="HBoxContainer/VBoxContainer"] +margin_top = 12.0 +margin_right = 1024.0 +margin_bottom = 612.0 +texture = ExtResource( 1 ) + +[node name="SceneChangeTimer" type="Timer" parent="."] +wait_time = 5.0 +one_shot = true + +[node name="StartDlServerTimer" type="Timer" parent="."] +one_shot = true +autostart = true + +[node name="ValidateServerRunningTimer" type="Timer" parent="."] +one_shot = true + +[node name="HTTPRequest" type="HTTPRequest" parent="."] +[connection signal="timeout" from="SceneChangeTimer" to="." method="_on_Timer_timeout"] +[connection signal="timeout" from="StartDlServerTimer" to="." method="_on_Timer2_timeout"] +[connection signal="timeout" from="ValidateServerRunningTimer" to="." method="_on_ValidateServerRunningTimer_timeout"] +[connection signal="request_completed" from="HTTPRequest" to="." method="_on_HTTPRequest_request_completed"]