Linux support + more reliable playlist/ song downloader

This commit is contained in:
notdraimdev
2024-10-09 20:27:16 +02:00
parent 3a8ec2e6de
commit 5da51b2999
5 changed files with 75 additions and 245 deletions
+1 -1
View File
@@ -851,7 +851,7 @@ offset_left = -64.0
offset_top = -23.0
grow_horizontal = 0
grow_vertical = 0
text = "v1.4.4"
text = "v1.4.6"
horizontal_alignment = 2
[node name="SettingsButton" type="Button" parent="."]
+50 -16
View File
@@ -36,13 +36,22 @@ func download(url: String) -> Download:
func FilesMissing() -> bool:
var executable_name: String = "yt-dlp.exe" if OS.get_name() == "Windows" else "yt-dlp"
if not FileAccess.file_exists("user://%s" % executable_name):
return true
if not FileAccess.file_exists("user://ffmpeg.exe"):
return true
if not FileAccess.file_exists("user://ffprobe.exe"):
return true
if OS.get_name() == "Windows":
if not FileAccess.file_exists("user://%s" % executable_name):
return true
if not FileAccess.file_exists("user://ffmpeg.exe"):
return true
if not FileAccess.file_exists("user://ffprobe.exe"):
return true
elif OS.get_name() == "Linux":
var stuff = OS.execute("bash",PackedStringArray(["-c","ffprobe"]))
print(stuff)
if stuff != 1:
return true
var stuff2 = OS.execute("bash",PackedStringArray(["-c","ffmpeg"]))
print(stuff2)
if stuff2 != 1:
return true
return false
func setup() -> void:
@@ -59,9 +68,8 @@ func setup() -> void:
await (Engine.get_main_loop() as SceneTree).process_frame
_thread.wait_to_finish()
if OS.get_name() == "Windows":
await _setup_ffmpeg()
else:
await _setup_ffmpeg()
if OS.get_name() == "Linux":
OS.execute("chmod", PackedStringArray(["+x", OS.get_user_data_dir() + "/yt-dlp"]))
_is_setup = true
@@ -70,12 +78,33 @@ func setup() -> void:
func _setup_ffmpeg() -> void:
if not FileAccess.file_exists("user://ffmpeg.exe"):
_downloader.download(ffmpeg_sources["ffmpeg"], "user://ffmpeg.exe")
await _downloader.download_completed
if OS.get_name() == "Windows":
_downloader.download(ffmpeg_sources["ffmpeg"], "user://ffmpeg.exe")
await _downloader.download_completed
print(OS.get_distribution_name())
elif OS.get_distribution_name() in ["Ubuntu","Linux Mint","Debian"]:
var stuff = OS.execute("bash",PackedStringArray(["-c","ffmpeg"]))
print(stuff)
if stuff !=1:
push_error("FFMPEG NOT INSTALLED")
print(OS.get_distribution_name())
else:
print(OS.get_distribution_name())
if not FileAccess.file_exists("user://ffprobe.exe"):
_downloader.download(ffmpeg_sources["ffprobe"], "user://ffprobe.exe")
await _downloader.download_completed
if OS.get_name() == "Windows":
_downloader.download(ffmpeg_sources["ffprobe"], "user://ffprobe.exe")
print(OS.get_distribution_name())
await _downloader.download_completed
elif OS.get_name() == "Linux":
var stuff = OS.execute("bash",PackedStringArray(["-c","ffprobe"]))
print(stuff)
if stuff != 1:
push_error("FFPROBE NOT INSTALLED")
print(OS.get_distribution_name())
else:
print(OS.get_distribution_name())
func _update_yt_dlp(filename: String) -> void:
@@ -109,7 +138,7 @@ class Download extends RefCounted:
var _renameAudioToDiffName:bool = false
var _video_format: Video = Video.WEBM
var _audio_format: Audio = Audio.MP3
var _download_playlist:bool
func _init(url: String):
_url = url
@@ -183,9 +212,14 @@ class Download extends RefCounted:
"destination": _destination
})
options_and_arguments.append_array(["--yes-playlist","--embed-metadata","--embed-thumbnail",str("-o" + "%(title)s.%(ext)s")])
options_and_arguments.append_array(["--embed-metadata","--embed-thumbnail",str("-o" + "%(title)s.%(ext)s")])
options_and_arguments.append_array(["--no-continue", "-P", file_path, _url])
if _download_playlist:
options_and_arguments.append("--yes-playlist")
else:
options_and_arguments.append("--no-playlist")
print(options_and_arguments)
var output: Array = []
OS.execute(executable, PackedStringArray(options_and_arguments), output)
+13 -223
View File
@@ -9,7 +9,7 @@ custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../MusicPlayerExports/MusicPlayer.exe"
export_path="../Exports/Windows/Simplaudio.exe"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
@@ -68,8 +68,8 @@ dotnet/embed_build_outputs=false
[preset.1]
name="macOS"
platform="macOS"
name="Linux"
platform="Linux"
runnable=true
advanced_options=false
dedicated_server=false
@@ -77,7 +77,7 @@ custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../MusicPlayerMACExports/MusicPlayer.zip"
export_path="../Exports/Linux/Simplaudio.x86_64"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
@@ -86,235 +86,25 @@ script_export_mode=2
[preset.1.options]
export/distribution_type=1
binary_format/architecture="universal"
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=2
application/icon=""
application/icon_interpolation=4
application/bundle_identifier="com.bucket.simplaudio"
application/signature=""
application/app_category="Music"
application/short_version=""
application/version=""
application/copyright=""
application/copyright_localized={}
application/min_macos_version="10.12"
application/export_angle=0
display/high_res=true
application/additional_plist_content=""
xcode/platform_build="14C18"
xcode/sdk_version="13.1"
xcode/sdk_build="22C55"
xcode/sdk_name="macosx13.1"
xcode/xcode_version="1420"
xcode/xcode_build="14C18"
codesign/codesign=1
codesign/installer_identity=""
codesign/apple_team_id=""
codesign/identity=""
codesign/entitlements/custom_file=""
codesign/entitlements/allow_jit_code_execution=false
codesign/entitlements/allow_unsigned_executable_memory=false
codesign/entitlements/allow_dyld_environment_variables=false
codesign/entitlements/disable_library_validation=false
codesign/entitlements/audio_input=false
codesign/entitlements/camera=false
codesign/entitlements/location=false
codesign/entitlements/address_book=false
codesign/entitlements/calendars=false
codesign/entitlements/photos_library=false
codesign/entitlements/apple_events=false
codesign/entitlements/debugging=false
codesign/entitlements/app_sandbox/enabled=false
codesign/entitlements/app_sandbox/network_server=false
codesign/entitlements/app_sandbox/network_client=false
codesign/entitlements/app_sandbox/device_usb=false
codesign/entitlements/app_sandbox/device_bluetooth=false
codesign/entitlements/app_sandbox/files_downloads=0
codesign/entitlements/app_sandbox/files_pictures=0
codesign/entitlements/app_sandbox/files_music=0
codesign/entitlements/app_sandbox/files_movies=0
codesign/entitlements/app_sandbox/files_user_selected=0
codesign/entitlements/app_sandbox/helper_executables=[]
codesign/custom_options=PackedStringArray()
notarization/notarization=0
privacy/microphone_usage_description=""
privacy/microphone_usage_description_localized={}
privacy/camera_usage_description=""
privacy/camera_usage_description_localized={}
privacy/location_usage_description=""
privacy/location_usage_description_localized={}
privacy/address_book_usage_description=""
privacy/address_book_usage_description_localized={}
privacy/calendar_usage_description=""
privacy/calendar_usage_description_localized={}
privacy/photos_library_usage_description=""
privacy/photos_library_usage_description_localized={}
privacy/desktop_folder_usage_description=""
privacy/desktop_folder_usage_description_localized={}
privacy/documents_folder_usage_description=""
privacy/documents_folder_usage_description_localized={}
privacy/downloads_folder_usage_description=""
privacy/downloads_folder_usage_description_localized={}
privacy/network_volumes_usage_description=""
privacy/network_volumes_usage_description_localized={}
privacy/removable_volumes_usage_description=""
privacy/removable_volumes_usage_description_localized={}
privacy/tracking_enabled=false
privacy/tracking_domains=PackedStringArray()
privacy/collected_data/name/collected=false
privacy/collected_data/name/linked_to_user=false
privacy/collected_data/name/used_for_tracking=false
privacy/collected_data/name/collection_purposes=0
privacy/collected_data/email_address/collected=false
privacy/collected_data/email_address/linked_to_user=false
privacy/collected_data/email_address/used_for_tracking=false
privacy/collected_data/email_address/collection_purposes=0
privacy/collected_data/phone_number/collected=false
privacy/collected_data/phone_number/linked_to_user=false
privacy/collected_data/phone_number/used_for_tracking=false
privacy/collected_data/phone_number/collection_purposes=0
privacy/collected_data/physical_address/collected=false
privacy/collected_data/physical_address/linked_to_user=false
privacy/collected_data/physical_address/used_for_tracking=false
privacy/collected_data/physical_address/collection_purposes=0
privacy/collected_data/other_contact_info/collected=false
privacy/collected_data/other_contact_info/linked_to_user=false
privacy/collected_data/other_contact_info/used_for_tracking=false
privacy/collected_data/other_contact_info/collection_purposes=0
privacy/collected_data/health/collected=false
privacy/collected_data/health/linked_to_user=false
privacy/collected_data/health/used_for_tracking=false
privacy/collected_data/health/collection_purposes=0
privacy/collected_data/fitness/collected=false
privacy/collected_data/fitness/linked_to_user=false
privacy/collected_data/fitness/used_for_tracking=false
privacy/collected_data/fitness/collection_purposes=0
privacy/collected_data/payment_info/collected=false
privacy/collected_data/payment_info/linked_to_user=false
privacy/collected_data/payment_info/used_for_tracking=false
privacy/collected_data/payment_info/collection_purposes=0
privacy/collected_data/credit_info/collected=false
privacy/collected_data/credit_info/linked_to_user=false
privacy/collected_data/credit_info/used_for_tracking=false
privacy/collected_data/credit_info/collection_purposes=0
privacy/collected_data/other_financial_info/collected=false
privacy/collected_data/other_financial_info/linked_to_user=false
privacy/collected_data/other_financial_info/used_for_tracking=false
privacy/collected_data/other_financial_info/collection_purposes=0
privacy/collected_data/precise_location/collected=false
privacy/collected_data/precise_location/linked_to_user=false
privacy/collected_data/precise_location/used_for_tracking=false
privacy/collected_data/precise_location/collection_purposes=0
privacy/collected_data/coarse_location/collected=false
privacy/collected_data/coarse_location/linked_to_user=false
privacy/collected_data/coarse_location/used_for_tracking=false
privacy/collected_data/coarse_location/collection_purposes=0
privacy/collected_data/sensitive_info/collected=false
privacy/collected_data/sensitive_info/linked_to_user=false
privacy/collected_data/sensitive_info/used_for_tracking=false
privacy/collected_data/sensitive_info/collection_purposes=0
privacy/collected_data/contacts/collected=false
privacy/collected_data/contacts/linked_to_user=false
privacy/collected_data/contacts/used_for_tracking=false
privacy/collected_data/contacts/collection_purposes=0
privacy/collected_data/emails_or_text_messages/collected=false
privacy/collected_data/emails_or_text_messages/linked_to_user=false
privacy/collected_data/emails_or_text_messages/used_for_tracking=false
privacy/collected_data/emails_or_text_messages/collection_purposes=0
privacy/collected_data/photos_or_videos/collected=false
privacy/collected_data/photos_or_videos/linked_to_user=false
privacy/collected_data/photos_or_videos/used_for_tracking=false
privacy/collected_data/photos_or_videos/collection_purposes=0
privacy/collected_data/audio_data/collected=false
privacy/collected_data/audio_data/linked_to_user=false
privacy/collected_data/audio_data/used_for_tracking=false
privacy/collected_data/audio_data/collection_purposes=0
privacy/collected_data/gameplay_content/collected=false
privacy/collected_data/gameplay_content/linked_to_user=false
privacy/collected_data/gameplay_content/used_for_tracking=false
privacy/collected_data/gameplay_content/collection_purposes=0
privacy/collected_data/customer_support/collected=false
privacy/collected_data/customer_support/linked_to_user=false
privacy/collected_data/customer_support/used_for_tracking=false
privacy/collected_data/customer_support/collection_purposes=0
privacy/collected_data/other_user_content/collected=false
privacy/collected_data/other_user_content/linked_to_user=false
privacy/collected_data/other_user_content/used_for_tracking=false
privacy/collected_data/other_user_content/collection_purposes=0
privacy/collected_data/browsing_history/collected=false
privacy/collected_data/browsing_history/linked_to_user=false
privacy/collected_data/browsing_history/used_for_tracking=false
privacy/collected_data/browsing_history/collection_purposes=0
privacy/collected_data/search_hhistory/collected=false
privacy/collected_data/search_hhistory/linked_to_user=false
privacy/collected_data/search_hhistory/used_for_tracking=false
privacy/collected_data/search_hhistory/collection_purposes=0
privacy/collected_data/user_id/collected=false
privacy/collected_data/user_id/linked_to_user=false
privacy/collected_data/user_id/used_for_tracking=false
privacy/collected_data/user_id/collection_purposes=0
privacy/collected_data/device_id/collected=false
privacy/collected_data/device_id/linked_to_user=false
privacy/collected_data/device_id/used_for_tracking=false
privacy/collected_data/device_id/collection_purposes=0
privacy/collected_data/purchase_history/collected=false
privacy/collected_data/purchase_history/linked_to_user=false
privacy/collected_data/purchase_history/used_for_tracking=false
privacy/collected_data/purchase_history/collection_purposes=0
privacy/collected_data/product_interaction/collected=false
privacy/collected_data/product_interaction/linked_to_user=false
privacy/collected_data/product_interaction/used_for_tracking=false
privacy/collected_data/product_interaction/collection_purposes=0
privacy/collected_data/advertising_data/collected=false
privacy/collected_data/advertising_data/linked_to_user=false
privacy/collected_data/advertising_data/used_for_tracking=false
privacy/collected_data/advertising_data/collection_purposes=0
privacy/collected_data/other_usage_data/collected=false
privacy/collected_data/other_usage_data/linked_to_user=false
privacy/collected_data/other_usage_data/used_for_tracking=false
privacy/collected_data/other_usage_data/collection_purposes=0
privacy/collected_data/crash_data/collected=false
privacy/collected_data/crash_data/linked_to_user=false
privacy/collected_data/crash_data/used_for_tracking=false
privacy/collected_data/crash_data/collection_purposes=0
privacy/collected_data/performance_data/collected=false
privacy/collected_data/performance_data/linked_to_user=false
privacy/collected_data/performance_data/used_for_tracking=false
privacy/collected_data/performance_data/collection_purposes=0
privacy/collected_data/other_diagnostic_data/collected=false
privacy/collected_data/other_diagnostic_data/linked_to_user=false
privacy/collected_data/other_diagnostic_data/used_for_tracking=false
privacy/collected_data/other_diagnostic_data/collection_purposes=0
privacy/collected_data/environment_scanning/collected=false
privacy/collected_data/environment_scanning/linked_to_user=false
privacy/collected_data/environment_scanning/used_for_tracking=false
privacy/collected_data/environment_scanning/collection_purposes=0
privacy/collected_data/hands/collected=false
privacy/collected_data/hands/linked_to_user=false
privacy/collected_data/hands/used_for_tracking=false
privacy/collected_data/hands/collection_purposes=0
privacy/collected_data/head/collected=false
privacy/collected_data/head/linked_to_user=false
privacy/collected_data/head/used_for_tracking=false
privacy/collected_data/head/collection_purposes=0
privacy/collected_data/other_data_types/collected=false
privacy/collected_data/other_data_types/linked_to_user=false
privacy/collected_data/other_data_types/used_for_tracking=false
privacy/collected_data/other_data_types/collection_purposes=0
debug/export_console_wrapper=1
binary_format/embed_pck=false
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
binary_format/architecture="x86_64"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
export DISPLAY=:0
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
\"{temp_dir}/{exe_name}\" {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
dotnet/include_scripts_content=false
dotnet/include_debug_symbols=false
dotnet/include_debug_symbols=true
dotnet/embed_build_outputs=false
+8 -3
View File
@@ -66,10 +66,15 @@ func _on_link_button_pressed() -> void:
var path:String = GetLocalPath()
print(OS.get_executable_path())
if !OS.has_feature("editor"):
download_request.download_file = path + "download.zip"
var DownloadLink:String
if OS.get_name() == "Windows":
download_request.download_file = path + "download.zip"
DownloadLink = "https://github.com/notdraimdev/Simplaudio/releases/latest/download/Windows.zip"
elif OS.get_name() == "Linux":
DownloadLink = "https://github.com/notdraimdev/Simplaudio/releases/latest/download/Linux.zip"
if DownloadLink.is_empty() != true:
var error = download_request.request(
"https://github.com/notdraimdev/Simplaudio/releases/latest/download/Windows.zip"
DownloadLink
)
if error != OK:
print("! DOWNLOAD ERROR: " + str(error))
@@ -78,6 +83,7 @@ func _on_link_button_pressed() -> void:
else:
errorLabel.text = "downloading..."
else:
push_error("OS NOT SUPPORTED, you should not get this error but you did, congrat!")
OS.shell_open(updateLink)
func _on_download_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
@@ -90,7 +96,6 @@ func _on_download_request_completed(result: int, response_code: int, headers: Pa
errorLabel.text = "unzipping..."
print("works as expected brotha")
var unzipper:ZIPReader = ZIPReader.new() # sus
unzipper.open(GetLocalPath()+"download.zip")
var files:PackedStringArray = unzipper.get_files()
for file in files:
+3 -2
View File
@@ -8,6 +8,7 @@ extends Button
var currentlyExtending:bool
var Target:float = 50
var downloadList:bool = false
signal ContinueProcess
@onready var Parent:MainScene = get_tree().root.get_child(2)
@@ -37,11 +38,10 @@ func YTSetupCompleted():
yt_download.disabled = false
func DownloadPlaylistConf():
downloadList = true
ContinueProcess.emit()
func DownloadSingleSongConf():
var idx:int = yt_link.text.find("list=")
yt_link.text = yt_link.text.erase(idx,500)
ContinueProcess.emit()
func DownloadYTVidFromLink():
@@ -63,6 +63,7 @@ func DownloadYTVidFromLink():
download.set_destination(owner.PlaylistsLocation[owner.CurrentPlaylist])
print(owner.PlaylistsLocation[owner.CurrentPlaylist])
download.convert_to_audio(YtDlp.Audio.MP3)
download._download_playlist = downloadList
download.start()
yt_download.disabled = true
download.completely_finished.connect(DownloadCompleted)