Compare commits

..

3 Commits

Author SHA1 Message Date
Bucket Of Chicken 63be2bb195 Merge pull request #4 from notdraimdev/development
Development to main merge
2024-09-25 18:00:19 +02:00
Bucket Of Chicken d6736d8ff5 Merge pull request #3 from notdraimdev/development
Fixed wrong playlist at start
2024-09-16 16:45:12 +02:00
Bucket Of Chicken 090e226053 Merge pull request #1 from notdraimdev/development
Development
2024-09-12 22:09:11 +02:00
48 changed files with 488 additions and 1299 deletions
-31
View File
@@ -1,31 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
-20
View File
@@ -1,20 +0,0 @@
shader_type canvas_item;
void vertex() {
// Called for every vertex the material is visible on.
}
void fragment() {
vec2 animatedUV;
animatedUV.x = (sin(UV.x + (TIME))/2.0)+0.5;
animatedUV.y = (sin(UV.y + (TIME+(PI/2.0)))/2.0)+0.5;
float color1 = 1.0 *animatedUV.x;
float color2 = 1.0 *animatedUV.y;
COLOR = vec4((color1*0.7)+(color2*0.3),(color1*0.5)+(color2*0.5),(color1*0.3)+(color2*0.7),1);
}
//void light() {
// Called for every pixel for every light affecting the CanvasItem.
// Uncomment to replace the default light processing function with this one.
//}
-14
View File
@@ -1,14 +0,0 @@
extends ColorRect
@onready var StandardColor = color
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if get_parent().is_hovered():
color = StandardColor.lightened(0.3)
else:
color = StandardColor
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 769 B

-34
View File
@@ -1,34 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bmbxyma4ra46p"
path="res://.godot/imported/Download.png-3a4ebaeb081d510c32ff24ab28484d7b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Download.png"
dest_files=["res://.godot/imported/Download.png-3a4ebaeb081d510c32ff24ab28484d7b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
+96 -382
View File
@@ -1,4 +1,4 @@
[gd_scene load_steps=69 format=3 uid="uid://b2sygl55s6fng"]
[gd_scene load_steps=59 format=3 uid="uid://b2sygl55s6fng"]
[ext_resource type="Script" path="res://main.gd" id="1_ubs1p"]
[ext_resource type="Texture2D" uid="uid://b8on1case224h" path="res://LoopPressed.png" id="2_iolk5"]
@@ -11,13 +11,13 @@
[ext_resource type="Texture2D" uid="uid://ba5wdmchyy50n" path="res://nighttime-in-the-hills-henry-porter.jpg" id="6_8abnc"]
[ext_resource type="Texture2D" uid="uid://ctb4s2nks73rx" path="res://Play.png" id="8_5v7u3"]
[ext_resource type="Shader" path="res://CoverShader.gdshader" id="8_4531v"]
[ext_resource type="Shader" path="res://Background1.gdshader" id="8_xtnau"]
[ext_resource type="Shader" path="res://Main.gdshader" id="10_20857"]
[ext_resource type="Texture2D" uid="uid://b00wlqid2jdvi" path="res://BigLogo.png" id="10_xnj6a"]
[ext_resource type="Texture2D" uid="uid://0r1tx6l1lc6x" path="res://settingscog.png" id="11_esjel"]
[ext_resource type="Script" path="res://cover.gd" id="12_3v50a"]
[ext_resource type="Script" path="res://playlists_panel.gd" id="12_8ie8y"]
[ext_resource type="Script" path="res://settings_button.gd" id="12_073mb"]
[ext_resource type="Texture2D" uid="uid://bdpat2sfflaxq" path="res://Youtube_logo.png" id="12_bc5ym"]
[ext_resource type="Texture2D" uid="uid://myq6n4bshduj" path="res://search.png" id="12_cv2gm"]
[ext_resource type="Script" path="res://search_bar.gd" id="12_mr42x"]
[ext_resource type="Script" path="res://select_playlist.gd" id="12_of5fe"]
@@ -29,16 +29,6 @@
[ext_resource type="Texture2D" uid="uid://1rstn6r2wisy" path="res://X.png" id="14_mioc4"]
[ext_resource type="Script" path="res://Spinning.gd" id="14_rhw4k"]
[ext_resource type="Script" path="res://yt_tab_button.gd" id="16_2t15p"]
[ext_resource type="Script" path="res://help_button.gd" id="17_4b8oh"]
[ext_resource type="Script" path="res://songs_menu.gd" id="27_f8wx0"]
[ext_resource type="PackedScene" uid="uid://bel6i6wdbexw4" path="res://search_results.tscn" id="27_g8wmp"]
[ext_resource type="Texture2D" uid="uid://bmbxyma4ra46p" path="res://Download.png" id="29_v44vi"]
[ext_resource type="Script" path="res://update_checker.gd" id="30_byc5i"]
[ext_resource type="Script" path="res://patch_notes_button.gd" id="31_hjsj1"]
[ext_resource type="Script" path="res://CustomButtonColor.gd" id="32_pwgec"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_kvkfy"]
shader = ExtResource("8_xtnau")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_ku7tv"]
shader = ExtResource("10_20857")
@@ -94,6 +84,14 @@ keycode = 82
[sub_resource type="Shortcut" id="Shortcut_axi6u"]
events = [SubResource("InputEventKey_0jlka")]
[sub_resource type="InputEventKey" id="InputEventKey_117g0"]
device = -1
ctrl_pressed = true
keycode = 83
[sub_resource type="Shortcut" id="Shortcut_8p5o4"]
events = [SubResource("InputEventKey_117g0")]
[sub_resource type="InputEventKey" id="InputEventKey_5af16"]
device = -1
keycode = 32
@@ -147,20 +145,6 @@ keycode = 81
[sub_resource type="Shortcut" id="Shortcut_g3fcr"]
events = [SubResource("InputEventKey_puhgg")]
[sub_resource type="InputEventKey" id="InputEventKey_117g0"]
device = -1
ctrl_pressed = true
keycode = 83
[sub_resource type="Shortcut" id="Shortcut_8p5o4"]
events = [SubResource("InputEventKey_117g0")]
[sub_resource type="LabelSettings" id="LabelSettings_b1152"]
font_size = 31
[sub_resource type="LabelSettings" id="LabelSettings_ivhc6"]
font_size = 20
[node name="Node2D" type="Control"]
layout_mode = 3
anchors_preset = 15
@@ -172,11 +156,6 @@ script = ExtResource("1_ubs1p")
LoopPressed = ExtResource("2_iolk5")
LoopNotPressed = ExtResource("5_c2g63")
[node name="OSMediaIntigration" type="Control" parent="."]
anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="WallpaperManager" type="Node2D" parent="." node_paths=PackedStringArray("Daytime", "Evening", "Nighttime")]
script = ExtResource("4_y372l")
Daytime = NodePath("../Daytime")
@@ -226,17 +205,6 @@ grow_vertical = 2
expand_mode = 5
stretch_mode = 6
[node name="UpdatingBG" type="ColorRect" parent="."]
visible = false
modulate = Color(1, 1, 1, 0.011)
material = SubResource("ShaderMaterial_kvkfy")
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Logo" type="Sprite2D" parent="."]
visible = false
modulate = Color(1, 1, 1, 0.686275)
@@ -279,7 +247,7 @@ script = ExtResource("12_3v50a")
layout_mode = 0
offset_left = 20.0
offset_top = 24.0
offset_right = 256.0
offset_right = 257.0
offset_bottom = 80.0
focus_mode = 0
toggle_mode = true
@@ -287,30 +255,20 @@ shortcut = SubResource("Shortcut_vp2fh")
text = "Playlists"
script = ExtResource("12_of5fe")
[node name="PlaylistPanelHolder" type="Control" parent="."]
layout_mode = 1
anchors_preset = 9
anchor_bottom = 1.0
offset_left = -30.0
offset_right = -30.0
offset_bottom = -190.0
grow_horizontal = 2
grow_vertical = 2
metadata/_edit_use_anchors_ = true
[node name="PlaylistsPanel" type="Control" parent="PlaylistPanelHolder"]
[node name="PlaylistsPanel" type="Control" parent="."]
visible = false
layout_mode = 2
anchors_preset = 0
anchor_bottom = 1.0
offset_left = 19.0
offset_top = 88.0
offset_right = 393.0
offset_bottom = 48.0
offset_bottom = -132.0
grow_vertical = 2
script = ExtResource("12_8ie8y")
metadata/_edit_use_anchors_ = true
[node name="ColorRect" type="ColorRect" parent="PlaylistPanelHolder/PlaylistsPanel"]
[node name="ColorRect" type="ColorRect" parent="PlaylistsPanel"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
@@ -319,7 +277,7 @@ grow_horizontal = 2
grow_vertical = 2
color = Color(0.14902, 0.14902, 0.14902, 1)
[node name="PlaylistsContainer" type="ScrollContainer" parent="PlaylistPanelHolder/PlaylistsPanel"]
[node name="PlaylistsContainer" type="ScrollContainer" parent="PlaylistsPanel"]
layout_mode = 1
anchors_preset = -1
anchor_left = 0.0174419
@@ -331,66 +289,48 @@ grow_vertical = 2
follow_focus = true
horizontal_scroll_mode = 0
[node name="VBoxContainer" type="VBoxContainer" parent="PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer"]
[node name="VBoxContainer" type="VBoxContainer" parent="PlaylistsPanel/PlaylistsContainer"]
custom_minimum_size = Vector2(365.295, 0)
layout_mode = 2
size_flags_horizontal = 6
size_flags_vertical = 0
[node name="Label" type="Label" parent="PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer"]
[node name="Label" type="Label" parent="PlaylistsPanel/PlaylistsContainer/VBoxContainer"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 0
text = "PLAYLISTS"
label_settings = SubResource("LabelSettings_0fjy0")
[node name="HBoxContainer" type="HBoxContainer" parent="PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer"]
[node name="HBoxContainer" type="HBoxContainer" parent="PlaylistsPanel/PlaylistsContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 4
size_flags_stretch_ratio = 0.0
alignment = 1
[node name="CreatePlaylist" type="Button" parent="PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer"]
[node name="CreatePlaylist" type="Button" parent="PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer"]
custom_minimum_size = Vector2(155, 42.335)
layout_mode = 2
focus_mode = 0
text = "Create
Playlist"
[node name="Control" type="Control" parent="PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer"]
[node name="Control" type="Control" parent="PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer"]
custom_minimum_size = Vector2(7.55, 0)
layout_mode = 2
[node name="PlayAll" type="Button" parent="PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer"]
[node name="PlayAll" type="Button" parent="PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer"]
custom_minimum_size = Vector2(155, 42.335)
layout_mode = 2
focus_mode = 0
toggle_mode = true
text = "Play all"
[node name="PlaylistsHolder" type="VBoxContainer" parent="PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer"]
[node name="PlaylistsHolder" type="VBoxContainer" parent="PlaylistsPanel/PlaylistsContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 4
alignment = 1
[node name="YtTabButton" type="Button" parent="."]
texture_filter = 1
layout_mode = 1
anchors_preset = -1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -77.0
offset_top = 131.0
offset_right = -5.0
offset_bottom = 203.0
grow_horizontal = 0
grow_vertical = 2
scale = Vector2(0.79, 0.79)
focus_mode = 0
toggle_mode = true
icon = ExtResource("29_v44vi")
script = ExtResource("16_2t15p")
[node name="YoutubeMenuHolder" type="Control" parent="."]
layout_mode = 1
anchors_preset = 1
@@ -416,7 +356,7 @@ anchor_bottom = 1.0
offset_left = -7.0
offset_top = -5.0
offset_right = 7.0
offset_bottom = 4.0
offset_bottom = 5.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0.14902, 0.14902, 0.14902, 1)
@@ -425,7 +365,7 @@ color = Color(0.14902, 0.14902, 0.14902, 1)
layout_mode = 1
offset_right = 229.0
offset_bottom = 47.0
placeholder_text = "Link to download"
placeholder_text = "Youtube link(can be playlist)"
[node name="YTDownload" type="Button" parent="YoutubeMenuHolder/Youtube menu"]
layout_mode = 1
@@ -452,24 +392,6 @@ offset_bottom = 72.0
text = "NOTE: speeds depend on your internet"
label_settings = SubResource("LabelSettings_fiiw4")
[node name="HelpButton" type="Button" parent="YoutubeMenuHolder/Youtube menu"]
custom_minimum_size = Vector2(32, 32)
layout_mode = 1
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -38.83
offset_top = -40.0
offset_right = 1.17004
grow_horizontal = 0
grow_vertical = 0
focus_mode = 0
text = "?"
script = ExtResource("17_4b8oh")
Open = "https://notdraimdev.github.io/SimplSite/GettingStarted.html"
[node name="CreatePlaylistsMenu" type="Control" parent="."]
visible = false
layout_mode = 1
@@ -583,6 +505,31 @@ focus_mode = 0
shortcut = SubResource("Shortcut_axi6u")
text = "Randomize"
[node name="SettingsButton" type="Button" parent="."]
layout_mode = 1
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -77.0
offset_top = 23.0
offset_right = -5.0
offset_bottom = 95.0
grow_horizontal = 0
scale = Vector2(0.79, 0.79)
focus_mode = 0
shortcut = SubResource("Shortcut_8p5o4")
icon = ExtResource("11_esjel")
script = ExtResource("12_073mb")
[node name="SettingsPopup" type="Popup" parent="."]
position = Vector2i(319, 85)
size = Vector2i(591, 501)
[node name="SettingsMenuChild" parent="SettingsPopup" instance=ExtResource("13_7atry")]
offset_left = -272.0
offset_top = 8.0
offset_bottom = 458.0
[node name="FileDialog" type="FileDialog" parent="."]
title = "Open a Directory"
position = Vector2i(28, 115)
@@ -687,12 +634,12 @@ anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 67.0
offset_top = -132.0
offset_top = -120.0
offset_right = -200.0
offset_bottom = -95.0
offset_bottom = -89.0
grow_horizontal = 2
grow_vertical = 0
text = "Please make a Playlist "
text = "Please select a directory"
label_settings = SubResource("LabelSettings_6prit")
clip_text = true
text_overrun_behavior = 2
@@ -704,7 +651,7 @@ anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 68.0
offset_top = -106.0
offset_top = -99.0
offset_right = -199.0
offset_bottom = -68.0
grow_horizontal = 2
@@ -766,7 +713,7 @@ alignment = 1
caret_blink = true
script = ExtResource("12_mr42x")
[node name="SongsMenu" type="Button" parent="."]
[node name="SongsMenu" type="MenuButton" parent="."]
layout_mode = 1
anchors_preset = -1
anchor_right = 1.0
@@ -775,21 +722,16 @@ offset_top = 24.0
offset_right = -328.0
offset_bottom = 80.0
grow_horizontal = 2
focus_mode = 0
text = "Select Songs"
script = ExtResource("27_f8wx0")
flat = false
[node name="SearchResults" parent="." instance=ExtResource("27_g8wmp")]
visible = false
layout_mode = 1
anchors_preset = -1
anchor_left = 0.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 264.5
offset_top = 84.225
offset_right = -264.5
offset_bottom = -263.775
[node name="SearchResults" type="PopupMenu" parent="."]
handle_input_locally = false
position = Vector2i(265, 80)
size = Vector2i(623, 300)
wrap_controls = false
max_size = Vector2i(625, 300)
allow_search = false
[node name="VolumeButton" type="Button" parent="."]
texture_filter = 1
@@ -839,6 +781,32 @@ offset_right = 179.0
offset_bottom = -11.0
grow_vertical = 0
[node name="DiscordMenuHolder" type="Control" parent="."]
layout_mode = 3
anchors_preset = 0
offset_left = 1042.0
offset_top = 174.0
offset_right = 1082.0
offset_bottom = 214.0
[node name="YtTabButton" type="Button" parent="."]
layout_mode = 1
anchors_preset = -1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -97.0
offset_top = 109.0
offset_right = 551.0
offset_bottom = 560.0
grow_horizontal = 0
grow_vertical = 2
scale = Vector2(0.105, 0.105)
focus_mode = 0
toggle_mode = true
icon = ExtResource("12_bc5ym")
flat = true
script = ExtResource("16_2t15p")
[node name="Version" type="Label" parent="."]
layout_mode = 1
anchors_preset = 3
@@ -850,66 +818,9 @@ offset_left = -64.0
offset_top = -23.0
grow_horizontal = 0
grow_vertical = 0
text = "v1.5.0"
text = "v1.3.2"
horizontal_alignment = 2
[node name="SettingsButton" type="Button" parent="."]
layout_mode = 1
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -77.0
offset_top = 23.0
offset_right = -5.0
offset_bottom = 95.0
grow_horizontal = 0
scale = Vector2(0.79, 0.79)
focus_mode = 0
toggle_mode = true
shortcut = SubResource("Shortcut_8p5o4")
icon = ExtResource("11_esjel")
script = ExtResource("12_073mb")
[node name="SettingsHolder" type="Control" parent="."]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_top = -294.0
offset_bottom = -294.0
grow_horizontal = 2
grow_vertical = 2
[node name="SettingsPopup" type="Control" parent="SettingsHolder"]
visible = false
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -295.5
offset_right = 295.5
offset_bottom = 501.0
grow_horizontal = 2
[node name="ColorRect" type="ColorRect" parent="SettingsHolder/SettingsPopup"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0.14902, 0.14902, 0.14902, 1)
metadata/_edit_use_anchors_ = true
[node name="SettingsMenuChild" parent="SettingsHolder/SettingsPopup" instance=ExtResource("13_7atry")]
layout_mode = 1
offset_left = -280.0
offset_top = 8.0
offset_right = 296.0
offset_bottom = 501.0
[node name="WavDisclaimer" type="AcceptDialog" parent="."]
transparent_bg = true
title = "WAV disclaimer"
@@ -923,220 +834,23 @@ dialog_text = "wav files are not supported yet"
[node name="PlaylistOrSong" type="ConfirmationDialog" parent="."]
initial_position = 2
size = Vector2i(473, 106)
visible = true
ok_button_text = "Download Playlist"
dialog_text = "Do you want to download the song or the Entire playlist?"
dialog_autowrap = true
cancel_button_text = "Download Song"
[node name="UpdateChecker" type="Control" parent="."]
layout_mode = 1
anchors_preset = 3
anchor_left = 1.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = -40.0
offset_top = -40.0
grow_horizontal = 0
grow_vertical = 0
script = ExtResource("30_byc5i")
errorColor = Color(0.981984, 0, 0.065929, 1)
[node name="HTTPRequest" type="HTTPRequest" parent="UpdateChecker"]
timeout = 5.0
[node name="DownloadRequest" type="HTTPRequest" parent="UpdateChecker"]
[node name="ColorRect" type="ColorRect" parent="UpdateChecker"]
layout_mode = 0
offset_left = -214.0
offset_top = -144.0
offset_right = -24.0
offset_bottom = -44.0
color = Color(0.14902, 0.14902, 0.14902, 1)
[node name="UpdateAvailableText" type="Label" parent="UpdateChecker/ColorRect"]
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -68.0
offset_right = 68.0
offset_bottom = 23.0
grow_horizontal = 2
text = "Update Available!"
horizontal_alignment = 1
vertical_alignment = 1
[node name="PatchNotesButton" type="Button" parent="UpdateChecker/ColorRect"]
z_index = 4
layout_mode = 1
anchors_preset = 14
anchor_top = 0.5
anchor_right = 1.0
anchor_bottom = 0.5
offset_top = -24.0
offset_bottom = 12.0
grow_horizontal = 2
grow_vertical = 2
text = "View patch notes"
flat = true
script = ExtResource("31_hjsj1")
[node name="ColorRect" type="ColorRect" parent="UpdateChecker/ColorRect/PatchNotesButton"]
z_index = -1
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
color = Color(0.19706, 0.279877, 0.326012, 1)
script = ExtResource("32_pwgec")
[node name="LinkButton" type="Button" parent="UpdateChecker/ColorRect"]
z_index = 1
layout_mode = 1
anchors_preset = 12
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = -38.0
grow_horizontal = 2
grow_vertical = 0
text = "Update"
flat = true
[node name="ColorRect" type="ColorRect" parent="UpdateChecker/ColorRect/LinkButton"]
z_index = -1
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
color = Color(0.264012, 0.463229, 0.504783, 1)
script = ExtResource("32_pwgec")
[node name="CloseBuen" type="Button" parent="UpdateChecker/ColorRect"]
layout_mode = 1
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -72.0
offset_bottom = 72.0
grow_horizontal = 0
scale = Vector2(0.25, 0.25)
pivot_offset = Vector2(72, 0)
icon = ExtResource("14_mioc4")
flat = true
[node name="UpdatingNotification" type="Control" parent="."]
visible = false
custom_minimum_size = Vector2(400, 200)
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -20.0
offset_top = -20.0
offset_right = 20.0
offset_bottom = 20.0
grow_horizontal = 2
grow_vertical = 2
[node name="ColorRect" type="ColorRect" parent="UpdatingNotification"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
color = Color(0.262745, 0.462745, 0.505882, 1)
[node name="ColorRect2" type="ColorRect" parent="UpdatingNotification"]
layout_mode = 1
anchors_preset = -1
anchor_right = 1.0
anchor_bottom = 0.245
grow_horizontal = 2
color = Color(0.196078, 0.278431, 0.32549, 1)
[node name="Label" type="Label" parent="UpdatingNotification"]
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -20.0
offset_right = 20.0
offset_bottom = 23.0
grow_horizontal = 2
text = "Simplaudio is Updating!"
label_settings = SubResource("LabelSettings_b1152")
horizontal_alignment = 1
vertical_alignment = 1
[node name="Label2" type="Label" parent="UpdatingNotification"]
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -142.0
offset_top = 52.0
offset_right = 142.0
offset_bottom = 153.0
grow_horizontal = 2
text = "Please wait.
Simplaudio will restart automatically
this wont take long"
horizontal_alignment = 1
[node name="LoadingIMG" type="Sprite2D" parent="UpdatingNotification"]
position = Vector2(199, 115)
rotation = 1.5708
scale = Vector2(-0.5, 0.5)
texture = ExtResource("13_de5ej")
script = ExtResource("14_rhw4k")
[node name="Error" type="Label" parent="UpdatingNotification"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -20.0
offset_top = 57.0
offset_right = 20.0
offset_bottom = 80.0
grow_horizontal = 2
grow_vertical = 2
label_settings = SubResource("LabelSettings_ivhc6")
horizontal_alignment = 1
[node name="deleteConfirm" type="ConfirmationDialog" parent="."]
initial_position = 2
dialog_text = "Are you sure you want to delete"
[connection signal="toggled" from="SelectPlaylist" to="SelectPlaylist" method="_on_toggled"]
[connection signal="pressed" from="PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer/CreatePlaylist" to="PlaylistPanelHolder/PlaylistsPanel" method="_on_create_playlist_pressed"]
[connection signal="toggled" from="PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer/PlayAll" to="PlaylistPanelHolder/PlaylistsPanel" method="_on_play_all_toggled"]
[connection signal="toggled" from="YtTabButton" to="YtTabButton" method="_on_toggled"]
[connection signal="pressed" from="PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer/CreatePlaylist" to="PlaylistsPanel" method="_on_create_playlist_pressed"]
[connection signal="toggled" from="PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer/PlayAll" to="PlaylistsPanel" method="_on_play_all_toggled"]
[connection signal="dir_selected" from="CreatePlaylistsMenu/FileDialog" to="CreatePlaylistsMenu" method="_on_file_dialog_dir_selected"]
[connection signal="text_changed" from="CreatePlaylistsMenu/ScrollContainer/VBoxContainer/PlaylistName" to="CreatePlaylistsMenu" method="_on_playlist_name_text_changed"]
[connection signal="pressed" from="CreatePlaylistsMenu/ScrollContainer/VBoxContainer/SelectDirButton" to="CreatePlaylistsMenu" method="_on_select_dir_button_pressed"]
[connection signal="pressed" from="CreatePlaylistsMenu/ScrollContainer/VBoxContainer/CreatePlaylistButton" to="CreatePlaylistsMenu" method="_on_create_playlist_button_pressed"]
[connection signal="pressed" from="CreatePlaylistsMenu/CloseButton" to="CreatePlaylistsMenu" method="_on_close_button_pressed"]
[connection signal="pressed" from="SettingsButton" to="SettingsButton" method="_on_pressed"]
[connection signal="toggled" from="SearchToggle" to="SearchToggle" method="_on_toggled"]
[connection signal="text_submitted" from="SearchBar" to="SearchBar" method="_on_text_submitted"]
[connection signal="index_pressed" from="SearchResults" to="SearchBar" method="_on_search_results_index_pressed"]
[connection signal="toggled" from="VolumeButton" to="VolumeButton" method="_on_toggled"]
[connection signal="toggled" from="SettingsButton" to="SettingsButton" method="_on_toggled"]
[connection signal="request_completed" from="UpdateChecker/HTTPRequest" to="UpdateChecker" method="_on_http_request_completed"]
[connection signal="request_completed" from="UpdateChecker/DownloadRequest" to="UpdateChecker" method="_on_download_request_completed"]
[connection signal="pressed" from="UpdateChecker/ColorRect/LinkButton" to="UpdateChecker" method="_on_link_button_pressed"]
[connection signal="pressed" from="UpdateChecker/ColorRect/CloseBuen" to="UpdateChecker" method="_on_close_buen_pressed"]
[connection signal="toggled" from="YtTabButton" to="YtTabButton" method="_on_toggled"]
+1 -1
View File
@@ -148,7 +148,7 @@ transient = false
ok_button_text = "Open"
file_mode = 0
access = 2
filters = PackedStringArray("*.png", "*.jpg ", "*.jpeg", "*.gif", "*")
filters = PackedStringArray("*.png", "*.jpg", "*.jpeg", "*")
show_hidden_files = true
use_native_dialog = true
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cm5ps3a716wr0"
path="res://.godot/imported/XSmall.png-2fa29ed3d6c0476862944f7e0885c6ed.ctex"
uid="uid://bdpat2sfflaxq"
path="res://.godot/imported/Youtube_logo.png-22e44a6c4c4bd7a2da4492032ea62686.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://XSmall.png"
dest_files=["res://.godot/imported/XSmall.png-2fa29ed3d6c0476862944f7e0885c6ed.ctex"]
source_file="res://Youtube_logo.png"
dest_files=["res://.godot/imported/Youtube_logo.png-22e44a6c4c4bd7a2da4492032ea62686.ctex"]
[params]
+2 -2
View File
@@ -9,7 +9,7 @@ Button/styles/focus = SubResource("StyleBoxEmpty_1t7mm")
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_5vqdt"]
[sub_resource type="Image" id="Image_qsij4"]
[sub_resource type="Image" id="Image_nigg1"]
data = {
"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 168, 224, 224, 224, 233, 224, 224, 224, 236, 224, 224, 224, 170, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 234, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 239, 230, 230, 230, 30, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 168, 224, 224, 224, 255, 224, 224, 224, 186, 224, 224, 224, 32, 224, 224, 224, 33, 224, 224, 224, 187, 224, 224, 224, 255, 225, 225, 225, 167, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 33, 255, 255, 255, 0, 255, 255, 255, 0, 227, 227, 227, 36, 224, 224, 224, 255, 224, 224, 224, 234, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 237, 224, 224, 224, 255, 224, 224, 224, 33, 255, 255, 255, 0, 255, 255, 255, 0, 229, 229, 229, 38, 224, 224, 224, 255, 224, 224, 224, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 164, 224, 224, 224, 255, 224, 224, 224, 187, 225, 225, 225, 34, 227, 227, 227, 36, 224, 224, 224, 192, 224, 224, 224, 255, 224, 224, 224, 162, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 225, 225, 225, 215, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 229, 224, 224, 224, 32, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 24, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 210, 224, 224, 224, 161, 224, 224, 224, 232, 224, 224, 224, 231, 225, 225, 225, 159, 230, 230, 230, 30, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 107, 224, 224, 224, 255, 224, 224, 224, 210, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 105, 230, 230, 230, 20, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 224, 224, 224, 130, 255, 255, 255, 1, 255, 255, 255, 1, 225, 225, 225, 134, 224, 224, 224, 224, 225, 225, 225, 223, 224, 224, 224, 132, 255, 255, 255, 1, 255, 255, 255, 6, 224, 224, 224, 137, 224, 224, 224, 231, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 130, 225, 225, 225, 133, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 129, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 65, 224, 224, 224, 255, 224, 224, 224, 220, 225, 225, 225, 223, 224, 224, 224, 255, 226, 226, 226, 61, 224, 224, 224, 65, 224, 224, 224, 255, 224, 224, 224, 222, 224, 224, 224, 231, 224, 224, 224, 255, 227, 227, 227, 62, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 67, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 222, 224, 224, 224, 255, 227, 227, 227, 63, 225, 225, 225, 67, 224, 224, 224, 255, 224, 224, 224, 219, 224, 224, 224, 230, 224, 224, 224, 255, 227, 227, 227, 63, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 127, 224, 224, 224, 129, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 126, 225, 225, 225, 135, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 128, 224, 224, 224, 220, 224, 224, 224, 219, 225, 225, 225, 127, 255, 255, 255, 0, 255, 255, 255, 5, 225, 225, 225, 134, 224, 224, 224, 229, 224, 224, 224, 255, 255, 255, 255, 0),
"format": "RGBA8",
@@ -19,7 +19,7 @@ data = {
}
[sub_resource type="ImageTexture" id="ImageTexture_gdtpn"]
image = SubResource("Image_qsij4")
image = SubResource("Image_nigg1")
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_7v0rg"]
+18 -51
View File
@@ -36,22 +36,13 @@ func download(url: String) -> Download:
func FilesMissing() -> bool:
var executable_name: String = "yt-dlp.exe" if OS.get_name() == "Windows" else "yt-dlp"
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
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
return false
func setup() -> void:
@@ -68,8 +59,9 @@ func setup() -> void:
await (Engine.get_main_loop() as SceneTree).process_frame
_thread.wait_to_finish()
await _setup_ffmpeg()
if OS.get_name() == "Linux":
if OS.get_name() == "Windows":
await _setup_ffmpeg()
else:
OS.execute("chmod", PackedStringArray(["+x", OS.get_user_data_dir() + "/yt-dlp"]))
_is_setup = true
@@ -78,33 +70,12 @@ func setup() -> void:
func _setup_ffmpeg() -> void:
if not FileAccess.file_exists("user://ffmpeg.exe"):
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())
_downloader.download(ffmpeg_sources["ffmpeg"], "user://ffmpeg.exe")
await _downloader.download_completed
if not FileAccess.file_exists("user://ffprobe.exe"):
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())
_downloader.download(ffmpeg_sources["ffprobe"], "user://ffprobe.exe")
await _downloader.download_completed
func _update_yt_dlp(filename: String) -> void:
@@ -138,7 +109,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
@@ -212,17 +183,13 @@ class Download extends RefCounted:
"destination": _destination
})
options_and_arguments.append_array(["--embed-metadata","--embed-thumbnail",str("-o" + "%(title)s.%(ext)s")])
options_and_arguments.append_array(["--yes-playlist","--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)
print(options_and_arguments)
self._thread_finished.call_deferred()
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2023 B0TLANNER Games
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-139
View File
@@ -1,139 +0,0 @@
# Godot GIF
<br>
<p align="center">
<img src="./docs-images/logo.gif" alt="Logo" width="128" height="128" />
</p>
<p align="center">
<a href="https://github.com/BOTLANNER/godot-gif/actions/workflows/build_releases.yml"><img alt="GitHub Build" src="https://github.com/BOTLANNER/godot-gif/actions/workflows/build_releases.yml/badge.svg" height="20"/></a>
<a href="https://github.com/BOTLANNER/godot-gif/blob/develop/LICENSE.txt"><img alt="MIT License" src="https://img.shields.io/github/license/BOTLANNER/godot-gif" height="20"/></a>
</p>
## Description
GDExtension for Godot 4+ to load GIF files as [AnimatedTexture](https://docs.godotengine.org/en/stable/classes/class_animatedtexture.html) and/or [SpriteFrames](https://docs.godotengine.org/en/stable/classes/class_spriteframes.html).
NOTE: ~~**AnimatedTexture**~~ has been marked as deprecated according to development docs and could be removed in a future version of Godot.
## Usage
### Editor
Gif files can be imported at edit time as one of the supported types via Import options.
<details open>
<summary>Editor Imports Options</summary>
![Editor Imports Options](./docs-images/EditorImportSettings.gif)
</details>
See the [Editor Imports](./demo/editor_imports_example.tscn) example scene.
<details open>
<summary>Editor Imports Example</summary>
![Editor Imports](./docs-images/EditorImports.gif)
</details>
<hr/>
### Runtime
Gif files can be loaded at runtime as one of the supported types via the `GifManager` singleton.
`GifManager` exposes the following methods for loading gifs either from file or from bytes directly:
![GifManager Methods](./docs-images/methods.png)
e.g. to load from file
```py
get_node("AnimFromRuntimeFile").texture = GifManager.animated_texture_from_file("res://examples/file/optic.gif")
get_node("AnimatedSprite2RuntimeFile").sprite_frames = GifManager.sprite_frames_from_file("res://examples/file/optic.gif")
```
See the [Runtime Imports](./demo/main.tscn) example scene.
<details open>
<summary>Runtime Imports Example</summary>
![Runtime Imports](./docs-images/RuntimeImports.gif)
</details>
## Installation
Download the `gdextension` artifact from the [latest successful build](https://github.com/BOTLANNER/godot-gif/actions/workflows/build_releases.yml). (It should be right at the bottom of the **Summary**)
![image](https://github.com/BOTLANNER/godot-gif/assets/16349308/f28867c6-f669-45f2-9309-dbb17cec2031)
Extract the contents to your Godot project directory.
You should have an `addons` directory at the root with the following structure:
```bash
└───addons
└───godotgif
│ godotgif.gdextension
│ LICENSE.txt
│ README.md
└───bin
│ godotgif.windows.template_debug.x86_32.dll
│ godotgif.windows.template_debug.x86_64.dll
│ godotgif.windows.template_release.x86_32.dll
│ godotgif.windows.template_release.x86_64.dll
│ libgodotgif.android.template_debug.arm64.so
│ libgodotgif.android.template_release.arm64.so
│ libgodotgif.linux.template_debug.x86_32.so
│ libgodotgif.linux.template_debug.x86_64.so
│ libgodotgif.linux.template_release.x86_32.so
│ libgodotgif.linux.template_release.x86_64.so
├───godotgif.macos.template_debug.framework
│ libgodotgif.macos.template_debug
└───godotgif.macos.template_release.framework
libgodotgif.macos.template_release
```
Open your project. Any exisitng gifs should auto-import. New gifs in the project directory will automatically import as `SpriteFrames`. To convert them into `AnimatedTexture`, update the [import settings](#editor).
The `GifManager` class should also now be available for access within GDScript.
## Contributing
### Setup
Ensure **SCons** is setup. Refer to [Introduction to the buildsystem](https://docs.godotengine.org/en/stable/contributing/development/compiling/introduction_to_the_buildsystem.html)
* If using a different version of Godot, be sure to dump the bindings e.g.
```sh
godot --dump-extension-api extension_api.json
```
* Compile with
```sh
scons platform=<platform> custom_api_file=extension_api.json
```
### Debugging
This repository is configured for use with [VSCode](https://code.visualstudio.com/)
[Launch configurations](./.vscode/launch.json) have been setup for both debugging in editor and in runtime provided certain **VSCode** extensions are present and environment variables are defined.
The following environment variables are required:
1. `GODOT_PATH` - The directory in which Godot is installed
1. `GODOT_EXECUTABLE` - The executable name of the Godot installation
### More Details
Refer to [GDExtension C++ example](https://docs.godotengine.org/en/stable/tutorials/scripting/gdextension/gdextension_cpp_example.html)
## License
Unless otherwise specified, the extension is released under the
[MIT license](LICENSE.txt).
See the full list of third-party libraries with their licenses used by this
extension at [src/thirdparty/README.md](src/thirdparty/README.md).
This implementation heavily borrowed inspiration from the [gif module](https://github.com/goostengine/goost/tree/gd3/modules/gif) for [Goost](https://github.com/goostengine/goost) that is currently only based on Godot 3
-23
View File
@@ -1,23 +0,0 @@
[configuration]
entry_symbol = "godot_gif_library_init"
compatibility_minimum = "4.1"
[libraries]
macos.debug = "bin/godotgif.macos.template_debug.framework/libgodotgif.macos.template_debug"
macos.release = "bin/godotgif.macos.template_release.framework/libgodotgif.macos.template_release"
windows.debug.x86_32 = "bin/godotgif.windows.template_debug.x86_32.dll"
windows.release.x86_32 = "bin/godotgif.windows.template_release.x86_32.dll"
windows.debug.x86_64 = "bin/godotgif.windows.template_debug.x86_64.dll"
windows.release.x86_64 = "bin/godotgif.windows.template_release.x86_64.dll"
linux.debug.x86_64 = "bin/libgodotgif.linux.template_debug.x86_64.so"
linux.release.x86_64 = "bin/libgodotgif.linux.template_release.x86_64.so"
linux.debug.arm64 = "bin/libgodotgif.linux.template_debug.arm64.so"
linux.release.arm64 = "bin/libgodotgif.linux.template_release.arm64.so"
linux.debug.rv64 = "bin/libgodotgif.linux.template_debug.rv64.so"
linux.release.rv64 = "bin/libgodotgif.linux.template_release.rv64.so"
android.debug.x86_64 = "bin/libgodotgif.android.template_debug.x86_64.so"
android.release.x86_64 = "bin/libgodotgif.android.template_release.x86_64.so"
android.debug.arm64 = "bin/libgodotgif.android.template_debug.arm64.so"
android.release.arm64 = "bin/libgodotgif.android.template_release.arm64.so"
+1 -1
View File
@@ -4,7 +4,7 @@ extends Control
@onready var file_dialog: FileDialog = $FileDialog
@onready var current_directory: Label = $ScrollContainer/VBoxContainer/CurrentDirectory
@onready var playlist_name: LineEdit = $ScrollContainer/VBoxContainer/PlaylistName
@onready var playlists_holder: VBoxContainer = $"../PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer/PlaylistsHolder"
@onready var playlists_holder: VBoxContainer = $"../PlaylistsPanel/PlaylistsContainer/VBoxContainer/PlaylistsHolder"
const PLAYLIST_DISPLAY = preload("res://PlaylistDisplay.tscn")
+2 -1
View File
@@ -5,7 +5,8 @@ var HzDec = {0:"32 Hz",
2:"320 Hz",
3:"1000 Hz",
4:"3200 Hz",
5:"10000 Hz"}
5:"3200 Hz",
6:"10000 Hz"}
var gainValueLabels:Array = []
var gainValueSlider:Array = []
+223 -13
View File
@@ -9,7 +9,7 @@ custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../Exports/Windows/Simplaudio.exe"
export_path="../MusicPlayerExports/MusicPlayer.exe"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
@@ -68,8 +68,8 @@ dotnet/embed_build_outputs=false
[preset.1]
name="Linux"
platform="Linux"
name="macOS"
platform="macOS"
runnable=true
advanced_options=false
dedicated_server=false
@@ -77,7 +77,7 @@ custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../Exports/Linux/Simplaudio.x86_64"
export_path="../MusicPlayerMACExports/MusicPlayer.zip"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
@@ -86,25 +86,235 @@ 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=1
binary_format/embed_pck=false
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
binary_format/architecture="x86_64"
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
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}\"
\"{temp_dir}/{exe_name}\" {cmd_args}"
open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
dotnet/include_scripts_content=false
dotnet/include_debug_symbols=true
dotnet/include_debug_symbols=false
dotnet/embed_build_outputs=false
-15
View File
@@ -1,15 +0,0 @@
extends Button
@export var Open:String
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
func _pressed() -> void:
OS.shell_open(Open)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
+76 -155
View File
@@ -18,21 +18,20 @@ extends Control
@onready var yt_link: LineEdit = $"YoutubeMenuHolder/Youtube menu/YTLink"
@onready var yt_download: Button = $"YoutubeMenuHolder/Youtube menu/YTDownload"
@onready var loading_img: Sprite2D = $"YoutubeMenuHolder/Youtube menu/LoadingIMG"
@onready var songs_menu: Button = $SongsMenu
@onready var songs_menu: MenuButton = $SongsMenu
@onready var version: Label = $Version
@onready var paused_indicator: TextureRect = $PausedIndicator
@onready var settings_menu_child: Settings = $SettingsHolder/SettingsPopup/SettingsMenuChild
@onready var settings_popup: Popup = $SettingsPopup
@onready var settings_menu_child: Settings = $SettingsPopup/SettingsMenuChild
@onready var artist_name: Label = $ArtistName
@onready var user_bg: TextureRect = $UserBG
@onready var playlists_holder: VBoxContainer = $PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer/PlaylistsHolder
@onready var play_all: Button = $PlaylistPanelHolder/PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer/PlayAll
@onready var playlists_panel: Control = $PlaylistsPanel
@onready var playlists_holder: VBoxContainer = $PlaylistsPanel/PlaylistsContainer/VBoxContainer/PlaylistsHolder
@onready var play_all: Button = $PlaylistsPanel/PlaylistsContainer/VBoxContainer/HBoxContainer/PlayAll
@onready var album_name: Label = $Album
@onready var playlist_or_song: ConfirmationDialog = $PlaylistOrSong
@onready var search_results: SearchResults = $SearchResults
@onready var delete_confirm: ConfirmationDialog = $deleteConfirm
@onready var search_bar: LineEdit = $SearchBar
var DiscordUsername:String
const PLAYLIST_DISPLAY = preload("res://PlaylistDisplay.tscn")
const PAUSE = preload("res://Pause.png")
@@ -66,12 +65,8 @@ var PlayAllLists:bool
@export var LoopPressed:Texture2D
@export var LoopNotPressed:Texture2D
signal ContinueDelete
var deleteSong:bool
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
get_tree().root.min_size = Vector2(850,492)
current_progress.drag_ended.connect(SongDragStopped)
current_progress.drag_started.connect(SongDragStarted)
loop.pressed.connect(LoopSong)
@@ -81,8 +76,7 @@ func _ready() -> void:
volume_slider.value_changed.connect(SetVolume)
skip.pressed.connect(Skip)
go_back.pressed.connect(GoBack)
search_results.index_pressed.connect(SetSong)
search_results.song_deleted.connect(deletesong)
songs_menu.get_popup().index_pressed.connect(SetSong)
var Strin:String
for Arg in OS.get_cmdline_args():
if Arg.to_lower().ends_with(".mp3") or Arg.to_lower().ends_with(".wav"):
@@ -109,9 +103,6 @@ func _ready() -> void:
child.PlaylistSongs = Playlists[Playlist]
playlists_holder.add_child(child)
if data != null:
if data.has("DiscordUsername"):
DiscordUsername = data["DiscordUsername"]
print("stiff ",data)
if data.has("Volume"):
print(data["Volume"])
SetVolume(data["Volume"])
@@ -174,91 +165,41 @@ func _ready() -> void:
DirectorySelected(Strin)
PlaySongs()
#PlaySongs()
DiscordRPC.app_id = 1276916292170809426
setUpDiscord()
for child in get_children(true):
if child is Control:
child.focus_mode = child is LineEdit
DiscordRPC.refresh()
# this is boolean if everything worked
print("Discord working: " + str(DiscordRPC.get_is_discord_working()))
# Set the first custom text row of the activity here
if textSongs.size() >= CurrentIDX:
if textSongs.size() > CurrentIDX:
DiscordRPC.details = textSongs[CurrentIDX]
# Set the second custom text row of the activity here
DiscordRPC.state = ""
# Image key for small image from "Art Assets" from the Discord Developer website
DiscordRPC.large_image = "logo"
# Tooltip text for the large image
SplashStrings = ["the party just started!"]
var LText = SplashStrings.pick_random()
print(LText)
DiscordRPC.large_image_text = LText
# Image key for large image from "Art Assets" from the Discord Developer website
DiscordRPC.small_image = ""
# Tooltip text for the small image
DiscordRPC.small_image_text = "Nothing"
# "02:41 elapsed" timestamp for the activity
# Always refresh after changing the values!
DiscordRPC.refresh()
func setUpDiscord():
DiscordRPC.app_id = 13
print("stibidiii ",DiscordRPC.get_current_user())
if DiscordUsername == "vrenthusiest" or DiscordRPC.get_current_user().get("username") == "vrenthusiest":
DiscordRPC.app_id = 1302002529378369568
else:
DiscordRPC.app_id = 1276916292170809426
DiscordRPC.refresh()
print("stiff chicks ",DiscordRPC.get_current_user())
DiscordUsername = DiscordRPC.get_current_user().get("username")
DiscordRPC.refresh()
if DiscordRPC.app_id == 1302002529378369568:
DiscordRPC.large_image = "changed"
DiscordRPC.start_timestamp = Time.get_unix_time_from_system()
else:
DiscordRPC.large_image = "logo"
# this is boolean if everything worked
print("Discord working: " + str(DiscordRPC.get_is_discord_working()))
# Set the first custom text row of the activity here
if textSongs.size() >= CurrentIDX:
if textSongs.size() > CurrentIDX:
DiscordRPC.details = textSongs[CurrentIDX]
# Set the second custom text row of the activity here
DiscordRPC.state = ""
# Image key for small image from "Art Assets" from the Discord Developer website
# Tooltip text for the large image
SplashStrings = ["the party just started!"]
var LText = SplashStrings.pick_random()
print(LText)
DiscordRPC.large_image_text = LText
# Image key for large image from "Art Assets" from the Discord Developer website
DiscordRPC.small_image = ""
# Tooltip text for the small image
DiscordRPC.small_image_text = "Nothing"
# "02:41 elapsed" timestamp for the activity
# Always refresh after changing the values!
DiscordRPC.refresh()
func deletesong(idx:int):
var currentDir:String= CurrentDir
currentDir += "/" + textSongs[idx]
delete_confirm.show()
delete_confirm.dialog_text = "are you sure you want to delete \n" + textSongs[idx] +"?"
delete_confirm.confirmed.connect(deleteConfirmed)
delete_confirm.canceled.connect(deleteCancelled)
await ContinueDelete
delete_confirm.canceled.disconnect(deleteCancelled)
delete_confirm.confirmed.disconnect(deleteConfirmed)
if deleteSong:
print("deleted + " + currentDir)
deleteSong = false
var dir = DirAccess.remove_absolute(currentDir)
print("error code " +str(dir) + " (zero is good)")
if dir == 0:
textSongs.remove_at(idx)
if search_bar.visible:
search_bar.updateResults()
else:
songs_menu._pressed()
Playlists[CurrentPlaylist].erase(textSongs[idx])
func deleteCancelled():
deleteSong = false
ContinueDelete.emit()
func deleteConfirmed():
deleteSong = true
ContinueDelete.emit()
func SongDragStopped(Changed:bool):
if Changed:
music_player.play(current_progress.value * CurrentSongLenth / current_progress.max_value)
if Paused:
pausePlay()
UpdateProgressSlider = true
if DiscordRPC.app_id != 1302002529378369568:
DiscordRPC.start_timestamp = int(Time.get_unix_time_from_system() - (current_progress.value * CurrentSongLenth / current_progress.max_value))
DiscordRPC.refresh()
DiscordRPC.start_timestamp = int(Time.get_unix_time_from_system() - (current_progress.value * CurrentSongLenth / current_progress.max_value))
DiscordRPC.refresh()
func SongDragStarted():
UpdateProgressSlider = false
@@ -330,15 +271,16 @@ func PlaySongs():
if music_player.playing:
Paused = true
DiscordRPC.state = "Paused"
music_player.stream_paused = true
play_list.icon = PLAY
if DiscordRPC.app_id != 1302002529378369568:
DiscordRPC.state = "Paused"
print(DiscordRPC.get_current_user())
print(DiscordRPC.get_current_user())
else:
if DiscordRPC.app_id != 1302002529378369568:
DiscordRPC.start_timestamp = int(Time.get_unix_time_from_system() - (current_progress.value * CurrentSongLenth / current_progress.max_value))
print(DiscordRPC.get_current_user())
DiscordRPC.start_timestamp = int(Time.get_unix_time_from_system() - (current_progress.value * CurrentSongLenth / current_progress.max_value))
print(DiscordRPC.get_current_user())
if DiscordRPC.get_current_user().get("username") == "_bucketofchicken":
DiscordRPC.state = "i made the music player btw"
else:
DiscordRPC.state = "Listening To Music"
Paused = false
music_player.stream_paused = false
@@ -366,8 +308,7 @@ func PlaySongs():
if !CurrentDir.ends_with(CurrentPlaylist):
GetSongs(PlaylistsLocation[CurrentPlaylist])
var CurrentSongDir:String = PlaylistsLocation[CurrentPlaylist] + "/" + textSongs[index]
if DiscordRPC.app_id != 1302002529378369568:
DiscordRPC.details = textSongs[index].replace(".mp3","")
DiscordRPC.details = textSongs[index].replace(".mp3","")
print(CurrentSongDir)
var sonnname:String = textSongs[index]
sonnname = sonnname.replace(".mp3", "")
@@ -417,11 +358,11 @@ func GetSongs(dir:String):
wav_disclaimer.show()
SeenWAVDisclaimer = true
#print(songs)
search_results.clear()
songs_menu.get_popup().clear(true)
textSongs = songs
for song in textSongs:
var nam = song
search_results.add_item(nam)
var nam = song.replace(".mp3", "")
songs_menu.get_popup().add_item(nam)
func Randomize():
if textSongs.size() != 0:
@@ -440,10 +381,10 @@ func Randomize():
Randomized = true
search_results.clear()
songs_menu.get_popup().clear(true)
for song in textSongs:
var nam = song
search_results.add_item(nam)
var nam = song.replace(".mp3", "")
songs_menu.get_popup().add_item(nam)
#print(textSongs)
func PlaylistSelected(Playlist:String,PlaylistLocation:String):
@@ -470,32 +411,43 @@ func _process(_delta: float) -> void:
BackroundSetup = true
if currentSaveTime < 0:
currentSaveTime = SaveInterval
DiscordUsername = DiscordRPC.get_current_user().get("username")
print(DiscordRPC.get_current_user())
SaveEverything()
print("yoo")
@warning_ignore("integer_division")
UpdateSplashes()
if DiscordRPC.get_is_discord_working():
print(DiscordRPC.get_current_user()["username"])
SplashStrings = ["Total listening time: %s!" % str(str(int(TimeSpentListening/60)/60 )
+ "h : " + str((int(TimeSpentListening) / 60) % 60) + "m : " +
str(int(TimeSpentListening) % 60) + "s"),
"Version: %s" % version.text,"🤷‍♂️","This Changes every ~11 seconds",
"hello everybody my name is %s" % DiscordRPC.get_current_user()["username"],
"wash your dishes, i know you got some","Running on %s" % OS.get_distribution_name(),
"%s is cooking" % DiscordRPC.get_current_user()["username"], "debugging" if OS.has_feature("editor") else "Release build",
"this user chose to show you all this info","Playing a Banger",
":steamhappy:","This is a sign that crocodiles live in water",
"Space? SPACE?! SPAAAAAAAAAAAAACE!!!",
"i love gd colonge",
"listening with reverb" if settings_menu_child.reverb_check.button_pressed else
"not listening with reverb","the cake is edible",
"what a great song!","this message is useless",
"stop reading these","why are you reading these",
"hello from mars", "hello to mars","there is a fly in my room",
"yippee!","What, are they allergic to bathtubs or something"]
print(DiscordRPC.get_current_user()["username"])
print(TimeSpentListening)
var LText = SplashStrings.pick_random()
DiscordRPC.large_image_text = LText
if DiscordRPC.get_is_discord_working():
DiscordRPC.refresh()
DiscordRPC.refresh()
# "59:59 remaining" timestamp for the activity
if music_player.playing:
TimeSpentListening += _delta
CurrentPausedIndicatorShaderIntensity = lerp(CurrentPausedIndicatorShaderIntensity,0.0,0.1)
if DiscordRPC.app_id != 1302002529378369568:
if DiscordRPC.get_current_user().get("username") == "_bucketofchicken":
DiscordRPC.state = "i made the music player btw"
else:
DiscordRPC.state = "Listening To Music"
CurrentPausedIndicatorShaderIntensity = lerp(CurrentPausedIndicatorShaderIntensity,0.0,0.1)
else:
if DiscordRPC.app_id != 1302002529378369568:
DiscordRPC.start_timestamp = int(0)
DiscordRPC.state = "Paused"
if DiscordRPC.get_is_discord_working():
DiscordRPC.refresh()
DiscordRPC.start_timestamp = int(0)
DiscordRPC.state = "Paused"
DiscordRPC.refresh()
CurrentPausedIndicatorShaderIntensity = lerp(CurrentPausedIndicatorShaderIntensity,1.0,0.1)
if DiscordRichPresenceEnabled:
DiscordRPC.run_callbacks()
@@ -534,32 +486,7 @@ func _process(_delta: float) -> void:
DiscordRPC.refresh()
func UpdateSplashes():
if DiscordRPC.app_id != 1302002529378369568:
if DiscordRPC.get_is_discord_working():
SplashStrings = ["Total listening time: %s!" % str(str(int(TimeSpentListening/60)/60 )
+ "h : " + str((int(TimeSpentListening) / 60) % 60) + "m : " +
str(int(TimeSpentListening) % 60) + "s"),
"Version: %s" % version.text,"🤷‍♂️","This Changes every ~11 seconds",
"hello everybody my name is %s" % DiscordRPC.get_current_user()["username"],
"wash your dishes, i know you got some","Running on %s" % OS.get_distribution_name(),
"%s is cooking" % DiscordRPC.get_current_user()["username"], "debugging" if OS.has_feature("editor") else "Release build",
"this user chose to show you all this info","Playing a Banger",
":steamhappy:","This is a sign that crocodiles live in water",
"Space? SPACE?! SPAAAAAAAAAAAAACE!!!",
"i love gd colonge",
"listening with reverb" if settings_menu_child.reverb_check.button_pressed else
"not listening with reverb","the cake is edible",
"what a great song!","this message is useless",
"stop reading these","why are you reading these",
"hello from mars", "hello to mars","there is a fly in my room",
"yippee!","What, are they allergic to bathtubs or something",
"Did you know, a 737 can land with up to 33knots of wind!",
"Welcome to todays JahresSchau",
"ram is very useful","your cpu is tasty","main course: Nvidia GPU",
"SCHOTTLAND FUER IMMER","i eat airborne vehicles","linus trovalds",
"","\(〇_o)/","Nuh Uh!","Yuh Huh","Breaching.",
"I get a narcissistic injury when the wall ignores me","totally not using %s" % version.text]
func SaveEverything():
@@ -582,8 +509,7 @@ func SaveEverything():
"CompressionRatio" : settings_menu_child.ratio_slider.value ,
"CompressionGain" : settings_menu_child.gain_slider.value,
"CurrentCustomBackroundImageDirectory" : CurrentCustomBackroundImageDirectory,
"PlayAllLists" : PlayAllLists,
"DiscordUsername" : DiscordRPC.get_current_user().get("username")
"PlayAllLists" : PlayAllLists
}
saveUserdata(Data)
savePlaylists()
@@ -604,7 +530,6 @@ func saveUserdata(content):
var file = FileAccess.open("user://data.dat", FileAccess.WRITE)
@warning_ignore("static_called_on_instance")
file.store_string(Marshalls.utf8_to_base64(json.stringify(content)))
file.close()
func loadUserdata():
var json = JSON.new()
@@ -617,10 +542,8 @@ func loadUserdata():
else:
@warning_ignore("static_called_on_instance")
content = json.parse_string(Marshalls.base64_to_utf8(file.get_as_text()))
file.close()
return content
else:
file.close()
return null
func loadPlaylists():
@@ -637,5 +560,3 @@ func loadPlaylists():
print(PlaylistsLocation)
print(Playlists.keys())
print("Playlists")
file.close()
file2.close()
-4
View File
@@ -1,4 +0,0 @@
extends Button
func _pressed() -> void:
OS.shell_open("https://notdraimdev.github.io/SimplSite/notes.html")
+1 -1
View File
@@ -6,7 +6,7 @@ extends Control
@onready var options_dropdown: MenuButton = $HSplitContainer/HBoxContainer/OptionsDropdown
@onready var confirmation: ConfirmationDialog = $ConfirmationDialog
@onready var Parent:MainScene = get_tree().root.get_child(3)
@onready var Parent:MainScene = get_tree().root.get_child(2)
@export var Current:bool
var PlaylistLocation:String = ""
+1 -1
View File
@@ -1,6 +1,6 @@
extends Control
@onready var create_playlist: Button = $PlaylistsContainer/VBoxContainer/HBoxContainer/CreatePlaylist
@onready var create_playlists_menu: Control = $"../../CreatePlaylistsMenu"
@onready var create_playlists_menu: Control = $"../CreatePlaylistsMenu"
@onready var play_all: Button = $PlaylistsContainer/VBoxContainer/HBoxContainer/PlayAll
+1 -2
View File
@@ -16,7 +16,6 @@ config/features=PackedStringArray("4.3", "Forward Plus")
run/low_processor_mode=true
boot_splash/bg_color=Color(0, 0, 0, 1)
boot_splash/image="res://BigLogo.png"
boot_splash/use_filter=false
config/icon="res://Logo2.png"
config/windows_native_icon="res://addons/godot-yt-dlp/src/favicon2.ico"
@@ -24,13 +23,13 @@ config/windows_native_icon="res://addons/godot-yt-dlp/src/favicon2.ico"
YtDlp="*res://addons/godot-yt-dlp/src/yt_dlp.gd"
MusicMetadataAutoload="*res://MusicMeta-f98d7384de3e2e658dcba3f5b06fb5b57ac2c73c/MusicMeta.gd"
DiscordRPCLoader="*res://addons/discord-rpc-gd/nodes/discord_autoload.gd"
[display]
window/size/initial_position_type=3
window/size/extend_to_title=true
window/energy_saving/keep_screen_on=false
window/stretch/mode="viewport"
window/stretch/aspect="expand"
[dotnet]
+37 -33
View File
@@ -1,5 +1,5 @@
extends LineEdit
@onready var search_results: SearchResults = $"../SearchResults"
@onready var search_results: PopupMenu = $"../SearchResults"
var values:Dictionary = {}
var ErrorMargin:float = 0.9
@@ -8,7 +8,8 @@ var currentTime:float
var TextChanged:bool
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass
search_results.popup_window = false
search_results.unfocusable = true
# Called every frame. 'delta' is the elapsed time since the previous frame.
@@ -16,43 +17,46 @@ func _process(delta: float) -> void:
currentTime -= delta
if TextChanged:
if currentTime < 0:
updateResults()
func updateResults():
release_focus()
TextChanged = false
search_results.clear()
values.clear()
currentTime = updatetime
var _i:int = 0
var _s:int = 0
for song:String in owner.textSongs:
var margin:float
var fragments:Array
#print(int((text.length() / 2.0) + 0.5))
for num in range(int((text.length() / 2.0) + 0.5)):
if text.to_lower().substr(int(num*2),2):
fragments.append(text.to_lower().substr(int(num*2),2))
elif text.to_lower().substr(int(num*2),1):
fragments.append(text.to_lower().substr(int(num*2),1))
var amountOfFrags:int
for fragment:String in fragments:
if song.to_lower().containsn(fragment):
amountOfFrags +=1
margin = float(amountOfFrags) / fragments.size()
if margin > ErrorMargin:
search_results.add_item(song)
values[_i] = _s
_i += 1
_s += 1
release_focus()
TextChanged = false
search_results.clear(true)
values.clear()
currentTime = updatetime
var _i:int = 0
var _s:int = 0
for song:String in owner.textSongs:
var margin:float
var fragments:Array
#print(int((text.length() / 2.0) + 0.5))
for num in range(int((text.length() / 2.0) + 0.5)):
if text.to_lower().substr(int(num*2),2):
fragments.append(text.to_lower().substr(int(num*2),2))
elif text.to_lower().substr(int(num*2),1):
fragments.append(text.to_lower().substr(int(num*2),1))
var amountOfFrags:int
for fragment:String in fragments:
if song.to_lower().containsn(fragment):
amountOfFrags +=1
margin = float(amountOfFrags) / fragments.size()
if margin > ErrorMargin:
search_results.add_item(song.replace(".mp3","") )
values[_i] = _s
_i += 1
_s += 1
func _on_search_results_index_pressed(index: int) -> void:
print("index " + str(index))
owner.SetSong(values[index])
func _input(event):
if (event is InputEventMouseButton) and event.pressed:
var evLocal = make_input_local(event)
if !Rect2(Vector2(0,0),Vector2(search_results.size.y+ size.y,size.x)).has_point(evLocal.position):
search_results.hide()
func _on_text_submitted(new_text: String) -> void:
TextChanged = true
if !search_results.visible:
-25
View File
@@ -1,25 +0,0 @@
extends Control
var SongName:String
var CurrentlyPlaying:bool
var idx:int
@onready var songname: Button = $HBoxContainer/Songname
signal PlayPressed
signal DeletePressed
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
songname.text = SongName
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func _on_songname_pressed() -> void:
PlayPressed.emit(idx)
func _on_delete_pressed() -> void:
DeletePressed.emit(idx)
-46
View File
@@ -1,46 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://ctqcbjrmxaqsk"]
[ext_resource type="Texture2D" uid="uid://cm5ps3a716wr0" path="res://XSmall.png" id="1_6wgd5"]
[ext_resource type="Script" path="res://search_item.gd" id="1_j4126"]
[node name="SearchItem" type="Control"]
custom_minimum_size = Vector2(0, 30)
layout_mode = 3
anchors_preset = 14
anchor_top = 0.5
anchor_right = 1.0
anchor_bottom = 0.5
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 4
script = ExtResource("1_j4126")
[node name="HBoxContainer" type="HBoxContainer" parent="."]
custom_minimum_size = Vector2(700, 0)
layout_mode = 1
anchors_preset = 4
anchor_top = 0.5
anchor_bottom = 0.5
offset_top = -19.0
offset_right = 50.0
offset_bottom = 19.0
grow_vertical = 2
[node name="delete" type="Button" parent="HBoxContainer"]
modulate = Color(0.553478, 0.101429, 4.81308e-08, 1)
layout_mode = 2
tooltip_text = "delete song from hard-drive"
focus_mode = 0
icon = ExtResource("1_6wgd5")
flat = true
[node name="Songname" type="Button" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
focus_mode = 0
flat = true
alignment = 0
[connection signal="pressed" from="HBoxContainer/delete" to="." method="_on_delete_pressed"]
[connection signal="pressed" from="HBoxContainer/Songname" to="." method="_on_songname_pressed"]
-48
View File
@@ -1,48 +0,0 @@
class_name SearchResults
extends Control
signal index_pressed
signal song_deleted
const SEARCH_ITEM = preload("res://search_item.tscn")
@onready var item_container: VBoxContainer = $Control/ItemContainer
var SongsAmount:int
@onready var parent:MainScene = owner
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func add_item(text:String):
var child = SEARCH_ITEM.instantiate()
child.SongName = text.replace(".mp3", "")
child.idx = parent.textSongs.find(text)
SongsAmount+=1
child.PlayPressed.connect(songSelected)
child.DeletePressed.connect(deletePressed)
item_container.add_child(child)
func clear():
SongsAmount = 0
for child in item_container.get_children():
child.queue_free()
func songSelected(idx:int):
index_pressed.emit(idx)
func _input(event):
if (event is InputEventMouseButton) and event.pressed:
var evLocal = make_input_local(event)
if !Rect2(Vector2(0,0),Vector2(size.x,size.y)).has_point(evLocal.position):
hide()
func deletePressed(idx:int):
song_deleted.emit(idx)
-42
View File
@@ -1,42 +0,0 @@
[gd_scene load_steps=2 format=3 uid="uid://bel6i6wdbexw4"]
[ext_resource type="Script" path="res://search_results.gd" id="1_mcn1o"]
[node name="SearchResults" type="Control"]
layout_mode = 3
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -311.5
offset_right = 311.5
offset_bottom = 300.0
grow_horizontal = 2
script = ExtResource("1_mcn1o")
[node name="ColorRect" type="ColorRect" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
color = Color(0.14902, 0.14902, 0.14902, 1)
[node name="Control" type="ScrollContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
follow_focus = true
horizontal_scroll_mode = 0
[node name="ItemContainer" type="VBoxContainer" parent="Control"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
+1 -1
View File
@@ -1,7 +1,7 @@
extends Button
@onready var search_bar: LineEdit = $"../SearchBar"
@onready var songs_menu: Button = $"../SongsMenu"
@onready var songs_menu: MenuButton = $"../SongsMenu"
@export var PressedIcon:Texture2D
@export var NotPressedIcon:Texture2D
+4 -17
View File
@@ -1,23 +1,10 @@
extends Button
@onready var playlists_panel: Control = $"../PlaylistPanelHolder/PlaylistsPanel"
var currentlyExtending:bool
var Target:float = 50
@onready var playlists_panel: Control = $"../PlaylistsPanel"
func _process(delta: float) -> void:
if currentlyExtending:
playlists_panel.position.x = clamp(lerp(playlists_panel.position.x,Target,0.25),0,100)
else:
playlists_panel.position.x -=1
playlists_panel.position.x = clamp(lerp(Target,playlists_panel.position.x,1.25),0,100)
playlists_panel.modulate.a = playlists_panel.position.x / Target
if playlists_panel.position.x > 1:
playlists_panel.show()
else:
playlists_panel.hide()
func _on_toggled(toggled_on: bool) -> void:
if toggled_on:
currentlyExtending = true
playlists_panel.position.x = 1
playlists_panel.show()
else:
currentlyExtending = false
playlists_panel.hide()
+2 -5
View File
@@ -74,7 +74,7 @@ func _on_h_slider_drag_ended(value_changed: bool) -> void:
Parent.SaveEverything()
func _on_exit_pressed() -> void:
Parent.find_child("SettingsButton").button_pressed = false
get_parent().hide()
Parent.SaveEverything()
#region Reverb
@@ -170,10 +170,7 @@ func _on_select_bg_dialog_file_selected(path: String) -> void:
Parent.CurrentCustomBackroundImageDirectory = path
backround_dir_label.text = path
#print(path)
if !path.ends_with(".gif"):
Parent.user_bg.texture = ImageTexture.create_from_image(Image.load_from_file(CurrentBGImagePath))
else:
Parent.user_bg.texture = GifManager.animated_texture_from_file(path)
Parent.user_bg.texture = ImageTexture.create_from_image(Image.load_from_file(CurrentBGImagePath))
Parent.SaveEverything()
func _on_reset_bg_pressed() -> void:
+11 -20
View File
@@ -1,25 +1,16 @@
extends Button
@onready var settings_popup: Control = $"../SettingsHolder/SettingsPopup"
var currentlyExtending:bool
var Target:float = 50
@onready var settings_popup: Popup = $"../SettingsPopup"
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if currentlyExtending:
settings_popup.position.y = clamp(lerp(settings_popup.position.y,Target,0.25),0,100)
else:
settings_popup.position.y -=1
settings_popup.position.y = clamp(lerp(Target,settings_popup.position.y,1.25),0,100)
settings_popup.modulate.a = settings_popup.position.y / Target
if settings_popup.position.y > 1:
settings_popup.show()
else:
settings_popup.hide()
pass
func _on_toggled(toggled_on: bool) -> void:
print("@@")
if toggled_on:
currentlyExtending = true
settings_popup.position.y = 1
else:
currentlyExtending = false
func _on_pressed() -> void:
settings_popup.show()
-20
View File
@@ -1,20 +0,0 @@
extends Button
@onready var search_results: SearchResults = $"../SearchResults"
@onready var parent:MainScene = owner
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func _pressed() -> void:
if search_results.SongsAmount != parent.textSongs.size():
search_results.clear()
for song in parent.textSongs:
var nam = song
search_results.add_item(nam)
search_results.show()
-120
View File
@@ -1,120 +0,0 @@
extends Control
@onready var Parent:MainScene = get_tree().root.get_child(3)
@onready var version: Label = $"../Version"
@onready var http_request := $HTTPRequest as HTTPRequest
@onready var download_request: HTTPRequest = $DownloadRequest
@onready var link_button: Button = $ColorRect/LinkButton
@onready var update_available_text: Label = $ColorRect/UpdateAvailableText
@onready var updating_notification: Control = $"../UpdatingNotification"
@onready var errorLabel: Label = $"../UpdatingNotification/Error"
@onready var updating_bg: ColorRect = $"../UpdatingBG"
@onready var paused_indicator: TextureRect = $"../PausedIndicator"
@export var errorColor:Color
var CheckForUpdates:bool = true
var updateLink:String
# The GitHub releases API only allows 60 unauthenticated requests per hour,
const UPDATE_THROTTLE = 600
func _ready() -> void:
hide()
if CheckForUpdates:
check_for_updates()
func check_for_updates() -> void:
print("! INFO: Checking for updates…")
var error := http_request.request(
"https://api.github.com/repos/notdraimdev/Simplaudio/releases/latest"
)
if error != OK:
push_error("! a client error occurred")
errorLabel.text = "a client error occurred"
func _on_http_request_completed(result: int, _response_code: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
if result != HTTPRequest.RESULT_SUCCESS:
# The request failed for any reason, abort
push_error("! Couldn't check for updates")
return
else:
print("! Update check successful")
var json = JSON.new()
var result2 = json.parse_string(str(body.get_string_from_utf8()))
print("! AHHH " + str(result2))
if result2.has("tag_name"):
if result2["tag_name"] != version.text:
update_available_text.text = result2["tag_name"] + " Is Out!"
show()
updateLink = result2["html_url"]
func _on_close_buen_pressed() -> void:
hide()
func _on_link_button_pressed() -> void:
link_button.disabled = true
link_button.text = "Updating..."
updating_notification.show()
updating_bg.show()
paused_indicator.hide()
var exepath:PackedStringArray = OS.get_executable_path().split("/")
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":
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(DownloadLink
)
if error != OK:
print("! DOWNLOAD ERROR: " + str(error))
errorLabel.text = "DOWNLOAD FAILED ERROR CODE: " + str(error)
errorLabel.label_settings.font_color = errorColor
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:
if result != HTTPRequest.RESULT_SUCCESS:
print("! Something went wrong server side: " + str(result))
errorLabel.text = "DOWNLOAD FAILED ERROR CODE: " + str(result)
errorLabel.label_settings.font_color = errorColor
return
else:
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:
var actualfile = file.replace("Linux/","").replace("Windows/","").replace("Android/","")
print("FILE: " + actualfile)
var FileAcess:FileAccess = FileAccess.open(GetLocalPath() + actualfile,FileAccess.WRITE_READ)
if FileAcess != null:
var downloadedfile = unzipper.read_file(file)
FileAcess.store_buffer(downloadedfile)
print("FOUND FILE: " + GetLocalPath()+file)
#FileAcess.store_string()
unzipper.close()
OS.shell_open(OS.get_executable_path())
get_tree().root.close_requested.emit()
get_tree().root.queue_free()
func GetLocalPath() -> String:
var exepath:PackedStringArray = OS.get_executable_path().split("/")
var path:String
for sting in (exepath.size()-1):
path += exepath[sting] + "/"
return path
+7 -7
View File
@@ -5,19 +5,19 @@ extends Button
@onready var yt_link: LineEdit = $"../YoutubeMenuHolder/Youtube menu/YTLink"
@onready var yt_download: Button = $"../YoutubeMenuHolder/Youtube menu/YTDownload"
@onready var loading_img: Sprite2D = $"../YoutubeMenuHolder/Youtube menu/LoadingIMG"
var currentlyExtending:bool
var Target:float = 50
var downloadList:bool = false
signal ContinueProcess
@onready var Parent:MainScene = get_tree().root.get_child(3)
@onready var Parent:MainScene = get_tree().root.get_child(2)
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
YtDlp.setup_completed.connect(YTSetupCompleted)
yt_download.pressed.connect(DownloadYTVidFromLink)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if currentlyExtending:
@@ -38,17 +38,18 @@ 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():
if yt_link.text.is_empty():
OS.alert("please gimme a link")
return
if "list=" in yt_link.text:
if "&list=" in yt_link.text:
Parent.playlist_or_song.show()
Parent.playlist_or_song.confirmed.connect(DownloadPlaylistConf)
Parent.playlist_or_song.canceled.connect(DownloadSingleSongConf)
@@ -62,8 +63,7 @@ func DownloadYTVidFromLink():
yt_link.clear()
download.set_destination(owner.PlaylistsLocation[owner.CurrentPlaylist])
print(owner.PlaylistsLocation[owner.CurrentPlaylist])
download.convert_to_audio(YtDlp.Audio.MP3)
download._download_playlist = downloadList
download.convert_to_audio(YtDlp.Audio.MP3)
download.start()
yt_download.disabled = true
download.completely_finished.connect(DownloadCompleted)