yodel/Main.gd

128 lines
3.6 KiB
GDScript

extends Control
signal finished
var os: String
var executable: String
var video_url: String setget set_url
var analyzed: bool = false setget set_analyzed
var audio_only: bool = false
var format_checked: bool = false setget set_format_checked
var ratelimit_checked: bool = false setget set_ratelimit_checked
var finished: bool = false
var lastLine: String = ""
onready var analyzeWarning = $Panel/Margin/Main/Settings/General/VBox/Format/Option as HBoxContainer
onready var analyzeButton = $Panel/Margin/Main/Settings/General/VBox/Format/Option/Button as Button
onready var formatCheckbox = $Panel/Margin/Main/Settings/General/VBox/Format/Checkbox as CheckBox
onready var formatMenu = $Panel/Margin/Main/Settings/General/VBox/Format/MenuButton as OptionButton
onready var rateLimitValue = $Panel/Margin/Main/Settings/Network/VBox/RateLimit/Value as LineEdit
onready var progressText = $ProgressBG/ProgressPanel/TextEdit as TextEdit
onready var downloadButton = $Panel/Margin/Main/Actions/Download as Button
func _analyze():
run_youtubedl(["-F", video_url])
func _download():
var output = run_youtubedl_blocking(["--get-filename", video_url])
$FileDialog.current_file = output[0].strip_edges()
$FileDialog.popup_centered_ratio()
func _download_with_name(name):
run_youtubedl(["-o", name, video_url])
func set_url(new_val):
video_url = new_val
set_analyzed(false)
downloadButton.disabled = video_url.length() == 0
func _url_changed(new_text):
set_url(new_text)
func set_analyzed(new_val):
analyzed = new_val
analyzeWarning.visible = !analyzed
analyzeButton.disabled = video_url.length() == 0
formatCheckbox.disabled = !analyzed
formatMenu.disabled = !analyzed or !format_checked
func _format_checkbox_changed(button_pressed):
set_format_checked(button_pressed)
func set_format_checked(new_val):
format_checked = new_val
formatMenu.disabled = !analyzed or !format_checked
func _audio_checkbox_changed(button_pressed):
audio_only = button_pressed
func _ratelimit_checkbox_changed(button_pressed):
set_ratelimit_checked(button_pressed)
func set_ratelimit_checked(new_val):
ratelimit_checked = new_val
rateLimitValue.editable = ratelimit_checked
func _ready():
os = OS.get_name()
match os:
"Windows", "UWP", "OSX", "Server", "X11":
pass
_:
OS.alert("OS not supported")
get_tree().quit(1)
var output = []
func run_youtubedl_thread(params: Array):
output = []
var exit = 0
match os:
"Windows", "UWP":
params.push_front("bin\\youtube-dl.exe")
exit = OS.execute("bin\\sorun_win.exe", params, true, output, true)
finished = true
var socketUDP = null
func run_youtubedl_blocking(params):
output = []
var exit = 0
match os:
"Windows", "UWP":
exit = OS.execute("bin\\youtube-dl.exe", params, true, output, true)
return output
func run_youtubedl(params):
print(params)
finished = false
var execute_thread = Thread.new()
execute_thread.start(self, "run_youtubedl_thread", params)
$ProgressBG.visible = true
yield(get_tree().create_timer(0.5), "timeout")
# Start UDP client
socketUDP = PacketPeerUDP.new()
socketUDP.set_dest_address("127.0.0.1", 8987)
socketUDP.put_var(0)
progressText.text = ""
$Timer.start()
func _timer_tick():
while socketUDP.get_available_packet_count() > 0:
var newstr = socketUDP.get_packet().get_string_from_ascii() as String
if newstr == "<EOF>\n":
emit_signal("finished")
return
if newstr.ends_with("\n") == false:
newstr += "\n"
progressText.text += newstr
lastLine = newstr.strip_edges()
progressText.scroll_vertical = 999
func _on_finish():
$ProgressBG.visible = false
func _target_selected(path):
_download_with_name(path.strip_edges())