#8: Added functionality to cache more than one song
All checks were successful
Build / build (push) Successful in 1m25s

This commit is contained in:
2025-10-26 20:48:35 +01:00
parent 4e6e37775d
commit 734a463db9
13 changed files with 327 additions and 139 deletions

View File

@@ -9,7 +9,7 @@ on:
branches: [main, develop] branches: [main, develop]
env: env:
GODOT_VERSION: 4.4 GODOT_VERSION: 4.5
PROJECT_PATH: . PROJECT_PATH: .
#GAME_VERSION: 0.0.8 #GAME_VERSION: 0.0.8
#GAME_VERSION: ${{gitea.ref_name}} #GAME_VERSION: ${{gitea.ref_name}}

View File

@@ -10,7 +10,7 @@ on:
- '*.*' - '*.*'
env: env:
GODOT_VERSION: 4.4 GODOT_VERSION: 4.5
PROJECT_PATH: . PROJECT_PATH: .
PROJECT_NAME: MusicPlayer PROJECT_NAME: MusicPlayer
GAME_VERSION: ${{gitea.ref_name}} GAME_VERSION: ${{gitea.ref_name}}

View File

@@ -59,10 +59,7 @@ var sync_window: Control = %SyncWindow
var settings_button: Button = $SettingsButton var settings_button: Button = $SettingsButton
@onready @onready
var settings_popup: PopupPanel = $SettingsPopupPanel var settings_window: Control = $SettingsWindow
@onready
var settings_window: BoxContainer = $SettingsPopupPanel/SettingsWindow
@onready @onready
var statistics_button: Button = $StatisticsButton var statistics_button: Button = $StatisticsButton
@@ -133,8 +130,8 @@ var music_player_container: PanelContainer = $MusicPlayer
@onready @onready
var debug_label: Label = $DebugLabel var debug_label: Label = $DebugLabel
var player := preload("res://Player.tscn") var player: PackedScene = preload("res://Player.tscn")
var song_list_object := preload("res://song_list_object.tscn") var song_list_object: PackedScene = preload("res://song_list_object.tscn")
var songs: Array= [] var songs: Array= []
var games: Array = [] var games: Array = []
@@ -142,17 +139,18 @@ var current_player: Node
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready() -> void: func _ready() -> void:
var is_debug: bool = OS.has_feature("debug") var debug: bool = OS.has_feature("debug")
var is_mac: bool = OS.has_feature("macos") var is_mac: bool = OS.has_feature("macos")
if is_debug: if debug:
print("is_debug") print("is_debug")
debug_label.visible = true debug_label.visible = true
Settings.is_debug = true
Settings.default_path = "http://localhost:8080" Settings.default_path = "http://localhost:8080"
Settings.selected_server = 3 Settings.selected_server = 3
Settings.winning_score = 5 Settings.winning_score = 5
if is_mac: if is_mac:
print("is_mac") print("is_mac")
next_button.pressed.connect(fetch_song.bind(false)) next_button.pressed.connect(play_next_song)
show_answer_button.pressed.connect(show_answer_pressed) show_answer_button.pressed.connect(show_answer_pressed)
search_button.pressed.connect(show_search) search_button.pressed.connect(show_search)
sync_button.pressed.connect(sync_games) sync_button.pressed.connect(sync_games)
@@ -165,7 +163,7 @@ func _ready() -> void:
character_select.connect("character_selected", _on_character_selected) character_select.connect("character_selected", _on_character_selected)
new_player_name_field.connect("enter_key_pressed", add_player) new_player_name_field.connect("enter_key_pressed", add_player)
music_player_container.connect("play_next_song", fetch_song.bind(false)) music_player_container.connect("play_next_song", play_next_song)
music_player_container.connect("update_song_list", update_song_list) music_player_container.connect("update_song_list", update_song_list)
settings_window.connect("server_changed", server_updated) settings_window.connect("server_changed", server_updated)
sync_window.connect("sync_started", _on_sync_started) sync_window.connect("sync_started", _on_sync_started)
@@ -179,7 +177,7 @@ func _ready() -> void:
get_suggestion_list() get_suggestion_list()
fetch_song_list_at_start() fetch_song_list_at_start()
fetch_song(true) fetch_song()
func _input(event: InputEvent) -> void: func _input(event: InputEvent) -> void:
if event is InputEventKey and event.pressed: if event is InputEventKey and event.pressed:
@@ -222,50 +220,50 @@ func repeat_song() -> void:
func show_answer_pressed() -> void: func show_answer_pressed() -> void:
print("show_answer_pressed") print("show_answer_pressed")
print("show_answer_pressed song_object: ", Settings.song_object_array[Settings.latest_played_song]._to_string()) Playlist.song_is_answered()
Settings.song_object_array[Settings.latest_played_song].is_answered = true
update_song_list() update_song_list()
func fetch_song_list_at_start() -> void: func fetch_song_list_at_start() -> void:
print("fetch_song_list_at_start") print("fetch_song_list_at_start")
var fetch_song_list_at_start_done: Callable = func fetch_songs_at_start_done(data) -> void: var fetch_song_list_at_start_done: Callable = func fetch_songs_at_start_done(data) -> void:
Settings.song_object_array = [] Playlist.clear_song_list()
if data == null: if data == null:
Settings.latest_played_song = Settings.song_object_array.size() Playlist.update_last_played_song()
update_song_list() update_song_list()
return return
if typeof(data) == TYPE_ARRAY: if typeof(data) == TYPE_ARRAY:
for d in data: for d: Dictionary in data:
var new_song_object: SongObject = SongObject.new() var new_song_object: SongObject = SongObject.new()
new_song_object.song_number = d.SongNo new_song_object.song_number = d.SongNo
new_song_object.game_title = d.Game new_song_object.game_title = d.Game
new_song_object.song_title = d.Song new_song_object.song_title = d.Song
new_song_object.is_answered = true new_song_object.is_answered = true
new_song_object.has_played = true new_song_object.has_played = true
Settings.song_object_array.append(new_song_object) Playlist.add_to_playlist(new_song_object)
else: else:
print("Unexpected data") print("Unexpected data")
Settings.latest_played_song = Settings.song_object_array.size() Playlist.update_last_played_song()
update_song_list() update_song_list()
Settings.make_request2("/music/list", fetch_song_list_at_start_done, true) Settings.make_request2("/music/list", fetch_song_list_at_start_done, true)
func play_next_song() -> void:
print("play_next_song ", Playlist.latest_played_song)
if Playlist.first_song_played:
Playlist.set_latest_played_song()
Playlist.first_song_played = true
music_player_container.play_song_object(Playlist.latest_played_song)
if !(Playlist.get_preloaded_songs() > 0):
next_button.disabled = true
if !Playlist.is_song_downloading:
fetch_song()
#not first "/music/addPlayed" #not first "/music/addPlayed"
#"/music/rand" #"/music/rand"
#"/music/addQue" #"/music/addQue"
#"/music/info" #"/music/info"
func fetch_song(first_time: bool) -> void: func fetch_song() -> void:
print("fetch_song") print("fetch_song")
if !first_time: Playlist.is_song_downloading = true
if Settings.song_object_array[Settings.latest_played_song].has_played && !Settings.song_object_array[Settings.latest_played_song].is_answered:
Settings.song_object_array[Settings.latest_played_song].is_answered = true
Settings.latest_played_song = Settings.song_object_array.size() - 1
music_player_container.play_song_object(Settings.latest_played_song)
if Settings.add_to_stats :
print("add to stats")
Settings.make_request3("/music/addPlayed")
next_button.disabled = true
var url: String = "" var url: String = ""
if Settings.use_low_played_mode: if Settings.use_low_played_mode:
url = "/music/rand/low" url = "/music/rand/low"
@@ -287,8 +285,14 @@ func fetch_song(first_time: bool) -> void:
new_song_object.song_title = data_received.Song new_song_object.song_title = data_received.Song
print("new_song_object: ", new_song_object.to_string()) print("new_song_object: ", new_song_object.to_string())
Settings.song_object_array.append(new_song_object) Playlist.add_to_playlist(new_song_object)
next_button.disabled = false next_button.disabled = false
if Playlist.should_preload_more_songs():
fetch_song()
else:
Playlist.is_song_downloading = false
if Settings.is_debug:
update_song_list()
Settings.make_request2("/music/info", fetch_song_info_done, true) Settings.make_request2("/music/info", fetch_song_info_done, true)
Settings.make_request2("/music/addQue", added_to_que_done, false) Settings.make_request2("/music/addQue", added_to_que_done, false)
@@ -297,13 +301,11 @@ func fetch_song(first_time: bool) -> void:
func update_song_list() -> void: func update_song_list() -> void:
print("update_song_list") print("update_song_list")
if Settings.currently_playing_song >= 0: if Playlist.currently_playing_song >= 0:
game_label.text = Settings.song_object_array[Settings.currently_playing_song].get_game_title() game_label.text = Playlist.get_current_game_title()
song_label.text = Settings.song_object_array[Settings.currently_playing_song].get_song_title() song_label.text = Playlist.get_current_song_title()
Settings.delete_children(music_list) Settings.delete_children(music_list)
for s: SongObject in Settings.song_object_array: for s: SongObject in Playlist.get_playlist():
if !s.has_played:
return
var new_song_list_object: SongListObject = song_list_object.instantiate() var new_song_list_object: SongListObject = song_list_object.instantiate()
new_song_list_object.song_object = s new_song_list_object.song_object = s
new_song_list_object.gui_input.connect(song_object_clicked.bind(s.song_number)) new_song_list_object.gui_input.connect(song_object_clicked.bind(s.song_number))
@@ -311,15 +313,14 @@ func update_song_list() -> void:
func song_object_clicked(event: InputEvent, song_no: int) -> void: func song_object_clicked(event: InputEvent, song_no: int) -> void:
if (event is InputEventMouseButton && event.pressed && event.button_index == MOUSE_BUTTON_LEFT): if (event is InputEventMouseButton && event.pressed && event.button_index == MOUSE_BUTTON_LEFT):
print("Clicked Song Object: ", Settings.song_object_array[song_no].to_string()) print("Clicked Song Object: ", Playlist.song_object_array[song_no].to_string())
if Settings.song_object_array[song_no].song == null: if Playlist.get_song(song_no) == null:
print("has no song, need to download") print("has no song, need to download")
var song_downloaded: Callable = func song_downloaded(body: PackedByteArray) -> void: var song_downloaded: Callable = func song_downloaded(body: PackedByteArray) -> void:
var sound: AudioStream = AudioStreamMP3.new() var sound: AudioStream = AudioStreamMP3.new()
sound.data = body sound.data = body
Settings.song_object_array[song_no].song = sound Playlist.add_song_to_song_object(song_no, sound)
music_player_container.play_song_object(song_no) music_player_container.play_song_object(song_no)
Settings.make_request2("/music?song=" + str(song_no), song_downloaded, true) Settings.make_request2("/music?song=" + str(song_no), song_downloaded, true)
else: else:
print("song already downloaded") print("song already downloaded")
@@ -328,11 +329,9 @@ func song_object_clicked(event: InputEvent, song_no: int) -> void:
func reset_playlist() -> void: func reset_playlist() -> void:
print("reset_playlist") print("reset_playlist")
var playlist_reset_done: Callable = func playlist_reset_done() -> void: var playlist_reset_done: Callable = func playlist_reset_done() -> void:
Settings.currently_playing_song = -1 Playlist.reset_playlist()
Settings.latest_played_song = 0
Settings.song_object_array.clear()
fetch_song_list_at_start() fetch_song_list_at_start()
fetch_song(true) fetch_song()
Settings.make_request2("/music/reset", playlist_reset_done, false) Settings.make_request2("/music/reset", playlist_reset_done, false)
@@ -352,7 +351,7 @@ func show_about() -> void:
func show_settings() -> void: func show_settings() -> void:
print("show_settings") print("show_settings")
settings_popup.visible = true settings_window.visible = true
func get_statistics() -> void: func get_statistics() -> void:
print("get_statistics") print("get_statistics")
@@ -377,7 +376,6 @@ func _on_sync_finished() -> void:
sound_test_button.disabled = false sound_test_button.disabled = false
reset_playlist_button.disabled = false reset_playlist_button.disabled = false
show_answer_button.disabled = false show_answer_button.disabled = false
next_button.disabled = false
func get_suggestion_list() -> void: func get_suggestion_list() -> void:
print("get_suggestion_list") print("get_suggestion_list")
@@ -435,8 +433,8 @@ func load_players() -> void:
func _on_point_given(player_given_point: int) -> void: func _on_point_given(player_given_point: int) -> void:
print("_on_point_given") print("_on_point_given")
if Settings.currently_playing_song >= 0: if Playlist.currently_playing_song >= 0:
Settings.song_object_array[Settings.currently_playing_song].add_point(player_given_point) Playlist.add_point(player_given_point)
update_song_list() update_song_list()
func _on_make_point_given_sound() -> void: func _on_make_point_given_sound() -> void:
@@ -445,8 +443,8 @@ func _on_make_point_given_sound() -> void:
func _on_point_taken(player_taken_point: int) -> void: func _on_point_taken(player_taken_point: int) -> void:
print("_on_point_taken") print("_on_point_taken")
music_player_container.play_sound_effect(preload("res://sounds/itemequip.wav")) music_player_container.play_sound_effect(preload("res://sounds/itemequip.wav"))
if Settings.currently_playing_song >= 0: if Playlist.currently_playing_song >= 0:
Settings.song_object_array[Settings.currently_playing_song].remove_point(player_taken_point) Playlist.remove_point(player_taken_point)
update_song_list() update_song_list()
func _on_player_won(winning_player_id: int) -> void: func _on_player_won(winning_player_id: int) -> void:
@@ -463,9 +461,7 @@ func _on_player_removed(player_to_remove: int) -> void:
print("_on_player_removed ", player_to_remove) print("_on_player_removed ", player_to_remove)
Settings.player_array.remove_at(player_to_remove) Settings.player_array.remove_at(player_to_remove)
load_players() load_players()
Playlist.remove_player_from_list(player_to_remove)
for song_list_object: SongObject in Settings.song_object_array:
Settings.song_object_array[song_list_object.song_number].players_given_point.remove_at(Settings.song_object_array[song_list_object.song_number].players_given_point.find(player_to_remove))
update_song_list() update_song_list()
func _on_player_change_character_clicked(new_player: Node) -> void: func _on_player_change_character_clicked(new_player: Node) -> void:

View File

@@ -78,7 +78,7 @@ offset_bottom = 56.0
[node name="Title" type="Label" parent="."] [node name="Title" type="Label" parent="."]
texture_filter = 1 texture_filter = 1
layout_mode = 2 layout_mode = 0
offset_left = 64.0 offset_left = 64.0
offset_top = 12.0 offset_top = 12.0
offset_right = 369.0 offset_right = 369.0
@@ -89,7 +89,7 @@ label_settings = SubResource("LabelSettings_ychxr")
[node name="Open" type="Button" parent="."] [node name="Open" type="Button" parent="."]
visible = false visible = false
layout_mode = 2 layout_mode = 0
offset_left = 1296.0 offset_left = 1296.0
offset_top = 66.0 offset_top = 66.0
offset_right = 1346.0 offset_right = 1346.0
@@ -315,6 +315,7 @@ offset_top = 944.0
offset_right = 368.0 offset_right = 368.0
offset_bottom = 975.0 offset_bottom = 975.0
focus_mode = 0 focus_mode = 0
disabled = true
action_mode = 0 action_mode = 0
shortcut = SubResource("Shortcut_d6fml") shortcut = SubResource("Shortcut_d6fml")
text = "Randomize new track" text = "Randomize new track"
@@ -376,12 +377,21 @@ offset_bottom = 96.0
unique_name_in_owner = true unique_name_in_owner = true
visible = false visible = false
layout_mode = 1 layout_mode = 1
offset_left = 364.0 offset_left = 401.0
offset_top = 153.0 offset_top = 153.0
offset_right = 364.0 offset_right = 401.0
offset_bottom = 153.0
[node name="SettingsWindow" parent="." instance=ExtResource("11_k62u5")]
visible = false
layout_mode = 1
offset_left = 720.0
offset_top = 153.0
offset_right = 720.0
offset_bottom = 153.0 offset_bottom = 153.0
[node name="StatisticsPopupPanel" type="PopupPanel" parent="."] [node name="StatisticsPopupPanel" type="PopupPanel" parent="."]
oversampling_override = 1.0
initial_position = 2 initial_position = 2
size = Vector2i(450, 100) size = Vector2i(450, 100)
@@ -405,6 +415,7 @@ horizontal_alignment = 1
vertical_alignment = 1 vertical_alignment = 1
[node name="AboutPopupPanel" type="PopupPanel" parent="."] [node name="AboutPopupPanel" type="PopupPanel" parent="."]
oversampling_override = 1.0
initial_position = 2 initial_position = 2
size = Vector2i(848, 710) size = Vector2i(848, 710)
@@ -465,16 +476,6 @@ Change some buttons to icons
Add shortcuts" Add shortcuts"
autowrap_mode = 2 autowrap_mode = 2
[node name="SettingsPopupPanel" type="PopupPanel" parent="."]
initial_position = 2
size = Vector2i(268, 233)
[node name="SettingsWindow" parent="SettingsPopupPanel" instance=ExtResource("11_k62u5")]
offset_left = 4.0
offset_top = 4.0
offset_right = 271.0
offset_bottom = 354.0
[node name="WinnerPopupPanel" type="PopupPanel" parent="."] [node name="WinnerPopupPanel" type="PopupPanel" parent="."]
initial_position = 2 initial_position = 2
size = Vector2i(600, 350) size = Vector2i(600, 350)

View File

@@ -168,7 +168,7 @@ func play_song_object(song_object_no: int) -> void:
if audio_player.is_playing(): if audio_player.is_playing():
audio_player.stop() audio_player.stop()
await get_tree().create_timer(0.5).timeout await get_tree().create_timer(0.5).timeout
audio_player.stream = Settings.song_object_array[song_object_no].song audio_player.stream = Playlist.get_song(song_object_no)
sound_player.stop() sound_player.stop()
audio_player.play() audio_player.play()
song_finished = false song_finished = false
@@ -176,13 +176,13 @@ func play_song_object(song_object_no: int) -> void:
stream = audio_player.stream stream = audio_player.stream
progress_slider.max_value = round(stream.get_length()) progress_slider.max_value = round(stream.get_length())
progress_slider.tick_count = round(stream.get_length() / 60) progress_slider.tick_count = round(stream.get_length() / 60)
Settings.currently_playing_song = song_object_no Playlist.set_currently_playing_song(song_object_no)
Settings.unset_is_playing() Playlist.unset_is_playing()
if !Settings.hide_next_track: if !Settings.hide_next_track:
print("Show answer now!!") print("Show answer now!!")
Settings.song_object_array[song_object_no].is_answered = true Playlist.song_is_answered(song_object_no)
Settings.song_object_array[song_object_no].has_played = true Playlist.song_has_played(song_object_no)
Settings.song_object_array[song_object_no].is_playing = true Playlist.song_is_playing(song_object_no)
update_song_list.emit() update_song_list.emit()
func get_sound_test_song() -> void: func get_sound_test_song() -> void:

View File

@@ -7,6 +7,8 @@ var selected_server: int = 0
var is_local: bool = false var is_local: bool = false
var is_debug: bool = false
var stop_after_current: bool = true var stop_after_current: bool = true
var auto_repeat_song: bool = false var auto_repeat_song: bool = false
var hide_next_track: bool = true var hide_next_track: bool = true
@@ -14,14 +16,9 @@ var add_to_stats: bool = true
var use_low_played_mode: bool = false var use_low_played_mode: bool = false
var winning_score: int = 20 var winning_score: int = 20
var fullscreen: bool = false var fullscreen: bool = false
var quick_sync: bool = true
var number_of_tracks_to_preload: int = 1
var play_local: bool = false var play_local: bool = false
var player_array: Array[PlayerObject] var player_array: Array[PlayerObject]
var song_object_array: Array[SongObject] = []
var latest_played_song: int = 0
var currently_playing_song: int = -1
var edit_players: bool = false var edit_players: bool = false
var currently_syncing: bool = false var currently_syncing: bool = false
@@ -29,15 +26,16 @@ var version: String = "1.6.0"
var whats_new: String = "Changelog: var whats_new: String = "Changelog:
1.6.0: 1.6.0:
#1: Fixed bug with inspiration list not reloding after sync #1: Fixed bug with inspiration list not reloading after sync
#2: New dialog for sync #2: New dialog for sync
#6: Now show progress during sync #6: Now show progress during sync
#7: Blocking all requests to the server during sync #7: Blocking all requests to the server during sync
#8: Added functionality to cache more than one song
1.5.0: Made big changes to players and the song list and how the local song list works 1.5.0: Made big changes to players and the song list and how the local song list works
0.9.0-Beta: Fixed settings and updated the player view 0.9.0-Beta: Fixed settings and updated the player view
0.8.0-Beta: Fixed reset buttons and some other small things 0.8.0-Beta: Fixed reset buttons and some other small things
0.7.8-Beta: Added shortcuts. Added dialog for winner. Started cleaning code. 0.7.8-Beta: Added shortcuts. Added dialog for winner. Started cleaning code.
0.7.5-Beta: Added settings menu, most things don't do anythig yet 0.7.5-Beta: Added settings menu, most things don't do anything yet
0.7-Beta: Can now hop between songs" 0.7-Beta: Can now hop between songs"
var whats_left: String = "Things left to do: var whats_left: String = "Things left to do:
@@ -105,6 +103,21 @@ func make_request3(address: String) -> void:
var request_error: int = http_request.request(default_path + address) var request_error: int = http_request.request(default_path + address)
if request_error != OK: if request_error != OK:
push_error("An error occurred in the HTTP request.") push_error("An error occurred in the HTTP request.")
func make_put_request(address: String) -> void:
var error_handling: Callable = func(_result: int, response_code: int, _headers: PackedStringArray, _body: PackedByteArray) -> void:
print("request done to address: ", default_path + address)
if response_code != 200:
print("Error: " + str(response_code))
var http_request: HTTPRequest = HTTPRequest.new()
add_child(http_request)
http_request.request_completed.connect(error_handling)
# Perform a GET request. The URL below returns JSON as of writing.
var headers: PackedStringArray = ["Content-Type: application/json"]
var request_error: int = http_request.request(default_path + address, headers, HTTPClient.METHOD_PUT)
if request_error != OK:
push_error("An error occurred in the HTTP request.")
func delete_children(node: Node) -> void: func delete_children(node: Node) -> void:
for n: Node in node.get_children(): for n: Node in node.get_children():
@@ -122,7 +135,3 @@ func delete_player_children(node: Node) -> void:
else: else:
node.remove_child(n) node.remove_child(n)
n.queue_free() n.queue_free()
func unset_is_playing() -> void:
for song_object: SongObject in song_object_array:
song_object.is_playing = false

View File

@@ -1,42 +1,54 @@
extends VBoxContainer extends Control
@onready @onready
var stop_after_current_button := $StopAfterCurrentCheckButton var settings_panel: Panel = %SettingsPanel
@onready @onready
var hide_next_track_button := $HideNextTrackCheckButton var stop_after_current_button: CheckButton = %StopAfterCurrentCheckButton
@onready @onready
var add_to_database_button := $AddToDatabaseCheckButton var hide_next_track_button: CheckButton = %HideNextTrackCheckButton
@onready @onready
var low_played_button := $LowPlayedCheckButton var add_to_database_button: CheckButton = %AddToDatabaseCheckButton
@onready @onready
var score_label := $HBoxContainer/ScoreLabel var low_played_button: CheckButton = %LowPlayedCheckButton
@onready @onready
var lower_winning_score_button := $HBoxContainer/LowerButton var score_label: Label = %ScoreLabel
@onready @onready
var increase_winning_score_button := $HBoxContainer/IncreaseButton var lower_winning_score_button: Button = %LowerButton
@onready @onready
var select_server_button := $SelectServerButton var increase_winning_score_button: Button = %IncreaseButton
@onready @onready
var fullscreen_button := $FullscreenButton var cache_label: Label = %CacheLabel
@onready @onready
var quick_sync_button := $QuickSyncButton var lower_cache_button: Button = %LowerCacheButton
@onready @onready
var local_button := $LocalButton var increase_cache_button: Button = %IncreaseCacheButton
@onready
var select_server_button: OptionButton = %SelectServerButton
@onready
var fullscreen_button: CheckButton = %FullscreenButton
#@onready
#var quick_sync_button := $QuickSyncButton
@onready
var local_button: CheckButton = %LocalButton
signal server_changed signal server_changed
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func _ready(): func _ready() -> void:
fullscreen_button.button_pressed = Settings.fullscreen fullscreen_button.button_pressed = Settings.fullscreen
select_server_button.selected = Settings.selected_server select_server_button.selected = Settings.selected_server
@@ -46,9 +58,9 @@ func _ready():
low_played_button.pressed.connect(low_played) low_played_button.pressed.connect(low_played)
lower_winning_score_button.pressed.connect(lower_winning_score) lower_winning_score_button.pressed.connect(lower_winning_score)
increase_winning_score_button.pressed.connect(increase_winning_score) increase_winning_score_button.pressed.connect(increase_winning_score)
#select_server_button.pressed.connect(select_server) lower_cache_button.pressed.connect(lower_cache)
increase_cache_button.pressed.connect(increase_cache)
fullscreen_button.pressed.connect(fullscreen) fullscreen_button.pressed.connect(fullscreen)
quick_sync_button.pressed.connect(quick_sync)
local_button.pressed.connect(local_play) local_button.pressed.connect(local_play)
stop_after_current_button.button_pressed = Settings.stop_after_current stop_after_current_button.button_pressed = Settings.stop_after_current
@@ -56,44 +68,58 @@ func _ready():
add_to_database_button.button_pressed = Settings.add_to_stats add_to_database_button.button_pressed = Settings.add_to_stats
low_played_button.button_pressed = Settings.use_low_played_mode low_played_button.button_pressed = Settings.use_low_played_mode
score_label.text = str(Settings.winning_score) score_label.text = str(Settings.winning_score)
cache_label.text = str(Playlist.number_of_tracks_to_preload)
fullscreen_button.button_pressed = Settings.fullscreen fullscreen_button.button_pressed = Settings.fullscreen
quick_sync_button.button_pressed = Settings.quick_sync
select_server_button.select(Settings.selected_server) select_server_button.select(Settings.selected_server)
select_server_button.item_selected.connect(select_server) select_server_button.item_selected.connect(select_server)
func _input(event: InputEvent) -> void:
if self.visible == true:
if event is InputEventMouseButton && event.is_pressed():
var evLocal: InputEvent = make_input_local(event)
if !Rect2(Vector2(0, 0), settings_panel.size).has_point(evLocal.position):
self.visible = false
func fullscreen() -> void: func fullscreen() -> void:
Settings.fullscreen = !Settings.fullscreen Settings.fullscreen = !Settings.fullscreen
if Settings.fullscreen == true: if Settings.fullscreen == true:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
if Settings.fullscreen == false: if Settings.fullscreen == false:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
func quick_sync() -> void:
Settings.quick_sync = !Settings.quick_sync
func local_play(): func local_play() -> void:
Settings.play_local = !Settings.play_local Settings.play_local = !Settings.play_local
func stop_after_current(): func stop_after_current() -> void:
Settings.stop_after_current = !Settings.stop_after_current Settings.stop_after_current = !Settings.stop_after_current
func hide_next_track(): func hide_next_track() -> void:
Settings.hide_next_track = !Settings.hide_next_track Settings.hide_next_track = !Settings.hide_next_track
func add_to_database(): func add_to_database() -> void:
Settings.add_to_stats = !Settings.add_to_stats Settings.add_to_stats = !Settings.add_to_stats
func low_played(): func low_played() -> void:
Settings.use_low_played_mode = !Settings.use_low_played_mode Settings.use_low_played_mode = !Settings.use_low_played_mode
func lower_winning_score(): func lower_winning_score() -> void:
Settings.winning_score -= 1 Settings.winning_score -= 1
score_label.text = str(Settings.winning_score) score_label.text = str(Settings.winning_score)
func increase_winning_score(): func increase_winning_score() -> void:
Settings.winning_score += 1 Settings.winning_score += 1
score_label.text = str(Settings.winning_score) score_label.text = str(Settings.winning_score)
func lower_cache() -> void:
Playlist.number_of_tracks_to_preload -= 1
if Playlist.number_of_tracks_to_preload < 1:
Playlist.number_of_tracks_to_preload = 1
cache_label.text = str(Playlist.number_of_tracks_to_preload)
func increase_cache() -> void:
Playlist.number_of_tracks_to_preload += 1
cache_label.text = str(Playlist.number_of_tracks_to_preload)
func select_server(new_server: int) -> void: func select_server(new_server: int) -> void:
Settings.default_path = select_server_button.get_item_text(new_server) Settings.default_path = select_server_button.get_item_text(new_server)
Settings.selected_server = new_server Settings.selected_server = new_server

View File

@@ -5,76 +5,126 @@
[sub_resource type="LabelSettings" id="LabelSettings_3xrlm"] [sub_resource type="LabelSettings" id="LabelSettings_3xrlm"]
font_size = 25 font_size = 25
[node name="VBoxContainer" type="VBoxContainer"] [node name="SettingsControl" type="Control"]
clip_contents = true layout_mode = 3
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("1_bt55j") script = ExtResource("1_bt55j")
[node name="Label" type="Label" parent="."] [node name="SettingsPanel" type="Panel" parent="."]
unique_name_in_owner = true
layout_mode = 0
offset_right = 500.0
offset_bottom = 640.0
[node name="ScrollContainer" type="ScrollContainer" parent="SettingsPanel"]
layout_mode = 0
offset_right = 500.0
offset_bottom = 640.0
[node name="VBoxContainer" type="VBoxContainer" parent="SettingsPanel/ScrollContainer"]
clip_contents = true
layout_mode = 2
size_flags_horizontal = 3
[node name="Label" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
layout_mode = 2 layout_mode = 2
size_flags_vertical = 0 size_flags_vertical = 0
text = "Settings" text = "Settings"
label_settings = SubResource("LabelSettings_3xrlm") label_settings = SubResource("LabelSettings_3xrlm")
horizontal_alignment = 1 horizontal_alignment = 1
[node name="StopAfterCurrentCheckButton" type="CheckButton" parent="."] [node name="StopAfterCurrentCheckButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
button_pressed = true button_pressed = true
action_mode = 0 action_mode = 0
text = "Stop after current" text = "Stop after current"
[node name="HideNextTrackCheckButton" type="CheckButton" parent="."] [node name="HideNextTrackCheckButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
button_pressed = true button_pressed = true
action_mode = 0 action_mode = 0
text = "Hide next track" text = "Hide next track"
[node name="AddToDatabaseCheckButton" type="CheckButton" parent="."] [node name="AddToDatabaseCheckButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
action_mode = 0 action_mode = 0
text = "Turn on played to database" text = "Turn on played to database"
[node name="LowPlayedCheckButton" type="CheckButton" parent="."] [node name="LowPlayedCheckButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
action_mode = 0 action_mode = 0
text = "Use low played mode" text = "Use low played mode"
[node name="HBoxContainer" type="HBoxContainer" parent="."] [node name="HBoxContainer" type="HBoxContainer" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
layout_mode = 2 layout_mode = 2
[node name="Label2" type="Label" parent="HBoxContainer"] [node name="Label2" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2 layout_mode = 2
text = "Winning Score: " text = "Winning Score: "
[node name="ScoreLabel" type="Label" parent="HBoxContainer"] [node name="ScoreLabel" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "20" text = "20"
[node name="LowerButton" type="Button" parent="HBoxContainer"] [node name="LowerButton" type="Button" parent="SettingsPanel/ScrollContainer/VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(30, 2.08165e-12) custom_minimum_size = Vector2(30, 2.08165e-12)
layout_mode = 2 layout_mode = 2
focus_mode = 0 focus_mode = 0
action_mode = 0 action_mode = 0
text = "-1" text = "-1"
[node name="IncreaseButton" type="Button" parent="HBoxContainer"] [node name="IncreaseButton" type="Button" parent="SettingsPanel/ScrollContainer/VBoxContainer/HBoxContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(30, 2.08165e-12) custom_minimum_size = Vector2(30, 2.08165e-12)
layout_mode = 2 layout_mode = 2
focus_mode = 0 focus_mode = 0
action_mode = 0 action_mode = 0
text = "+1" text = "+1"
[node name="SelectServerButton" type="OptionButton" parent="."] [node name="CacheHBoxContainer" type="HBoxContainer" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
layout_mode = 2
[node name="CacheTitleLabel" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer/CacheHBoxContainer"]
layout_mode = 2
text = "Predownload songs: "
[node name="CacheLabel" type="Label" parent="SettingsPanel/ScrollContainer/VBoxContainer/CacheHBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "1"
[node name="LowerCacheButton" type="Button" parent="SettingsPanel/ScrollContainer/VBoxContainer/CacheHBoxContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(30, 2.08165e-12)
layout_mode = 2
focus_mode = 0
action_mode = 0
text = "-1"
[node name="IncreaseCacheButton" type="Button" parent="SettingsPanel/ScrollContainer/VBoxContainer/CacheHBoxContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(30, 2.08165e-12)
layout_mode = 2
focus_mode = 0
action_mode = 0
text = "+1"
[node name="SelectServerButton" type="OptionButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
selected = 0 selected = 0
item_count = 5 item_count = 5
@@ -89,19 +139,23 @@ popup/item_3/id = 4
popup/item_4/text = "http://localhost:8080" popup/item_4/text = "http://localhost:8080"
popup/item_4/id = 5 popup/item_4/id = 5
[node name="FullscreenButton" type="CheckButton" parent="."] [node name="FullscreenButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
text = "Fullscreen" text = "Fullscreen"
[node name="QuickSyncButton" type="CheckButton" parent="."] [node name="QuickSyncButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
visible = false
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
button_pressed = true button_pressed = true
action_mode = 0 action_mode = 0
text = "Quick sync" text = "Quick sync"
[node name="LocalButton" type="CheckButton" parent="."] [node name="LocalButton" type="CheckButton" parent="SettingsPanel/ScrollContainer/VBoxContainer"]
unique_name_in_owner = true
visible = false
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 0 size_flags_horizontal = 0
disabled = true disabled = true

View File

@@ -31,7 +31,10 @@ func get_song_title() -> String:
return "??????" return "??????"
func get_song_info() -> String: func get_song_info() -> String:
if is_answered: if Settings.is_debug:
var format_string: String = "%d. %s - %s | played: %s | answered: %s"
return format_string % [(song_number + 1), game_title, song_title, has_played, is_answered]
elif is_answered:
var format_string: String = "%d. %s - %s" var format_string: String = "%d. %s - %s"
return format_string % [(song_number + 1), game_title, song_title] return format_string % [(song_number + 1), game_title, song_title]
else: else:

99
playlist.gd Normal file
View File

@@ -0,0 +1,99 @@
extends Node
var song_object_array: Array[SongObject] = []
var latest_played_song: int = 0
var currently_playing_song: int = -1
var first_song_downloaded: bool = false
var first_song_played: bool = false
var number_of_tracks_to_preload: int = 1
var is_song_downloading: bool = false
func get_next_song() -> SongObject:
return song_object_array[latest_played_song]
func set_latest_played_song() -> void:
latest_played_song += 1
if latest_played_song > song_object_array.size() - 1:
latest_played_song = song_object_array.size() - 1
func update_last_played_song() -> void:
latest_played_song = song_object_array.size()
func get_preloaded_songs() -> int:
var number_of_tracks_preloaded: int = 0
for song: SongObject in song_object_array:
if !song.has_played:
number_of_tracks_preloaded += 1
return number_of_tracks_preloaded
func should_preload_more_songs() -> bool:
return number_of_tracks_to_preload > get_preloaded_songs()
func set_last_played_answered() -> void:
if song_object_array[latest_played_song].has_played && !song_object_array[latest_played_song].is_answered:
song_object_array[latest_played_song].is_answered = true
func song_is_answered(song_no: int = currently_playing_song) -> void:
print("show_answer_pressed song_object: ", song_object_array[song_no]._to_string())
song_object_array[song_no].is_answered = true
if Settings.add_to_stats:
print("add to stats: ", song_no)
Settings.make_put_request("/music/played?song="+str(song_no))
func add_to_playlist(new_song_object: SongObject) -> void:
song_object_array.append(new_song_object)
func get_playlist() -> Array[SongObject]:
if Settings.is_debug:
return song_object_array
else:
var temp_list: Array[SongObject] = []
for s: SongObject in song_object_array:
if s.has_played:
temp_list.append(s)
return temp_list
func reset_playlist() -> void:
currently_playing_song = -1
latest_played_song = 0
clear_song_list()
func clear_song_list() -> void:
song_object_array.clear()
func unset_is_playing() -> void:
for song_object: SongObject in song_object_array:
song_object.is_playing = false
func set_currently_playing_song(value: int) -> void:
currently_playing_song = value
func get_current_game_title() -> String:
return song_object_array[currently_playing_song].get_game_title()
func get_current_song_title() -> String:
return song_object_array[currently_playing_song].get_song_title()
func add_point(player_id: int) -> void:
song_object_array[currently_playing_song].add_point(player_id)
func remove_point(player_id: int) -> void:
song_object_array[currently_playing_song].remove_point(player_id)
func remove_player_from_list(player_to_remove: int) -> void:
for song_list_object: SongObject in song_object_array:
song_object_array[song_list_object.song_number].players_given_point.remove_at(song_object_array[song_list_object.song_number].players_given_point.find(player_to_remove))
func get_song(song_no: int) -> AudioStream:
return song_object_array[song_no].song
func add_song_to_song_object(song_no: int, sound: AudioStream) -> void:
song_object_array[song_no].song = sound
func song_has_played(song_no: int = latest_played_song) -> void:
song_object_array[song_no].has_played = true
func song_is_playing(song_no: int = latest_played_song) -> void:
song_object_array[song_no].is_playing = true

1
playlist.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://bgei7qocdnolw

View File

@@ -12,12 +12,13 @@ config_version=5
config/name="MusicPlayer" config/name="MusicPlayer"
run/main_scene="res://MainWindow.tscn" run/main_scene="res://MainWindow.tscn"
config/features=PackedStringArray("4.4", "Forward Plus") config/features=PackedStringArray("4.5", "Forward Plus")
config/icon="res://icon.svg" config/icon="res://icon.svg"
[autoload] [autoload]
Settings="*res://Settings.gd" Settings="*res://Settings.gd"
Playlist="*res://playlist.gd"
[debug] [debug]

View File

@@ -74,22 +74,20 @@ func _ready() -> void:
func _input(event: InputEvent) -> void: func _input(event: InputEvent) -> void:
if self.visible == true: if self.visible == true:
if event is InputEventMouseButton && event.is_pressed(): if event is InputEventMouseButton && event.is_pressed():
print("Mouse Click/Unclick at: ", event.position) var evLocal: InputEvent = make_input_local(event)
var evLocal = make_input_local(event)
if !Rect2(Vector2(0, 0), sync_panel.size).has_point(evLocal.position): if !Rect2(Vector2(0, 0), sync_panel.size).has_point(evLocal.position):
self.visible = false self.visible = false
print("CLOSING")
func start_sync() -> void: func start_sync() -> void:
print("start_sync") print("start_sync")
self.visible = true self.visible = true
var sync_started: Callable = func sync_started() -> void: var sync_request_sent: Callable = func sync_request_sent() -> void:
sync_timer.start(0.75) sync_timer.start(0.75)
Settings.currently_syncing = true Settings.currently_syncing = true
sync_started.emit() sync_started.emit()
show_sync_progress() show_sync_progress()
if !cool_down_ongoing && !Settings.currently_syncing: if !cool_down_ongoing && !Settings.currently_syncing:
Settings.make_request2("/sync", sync_started, false) Settings.make_request2("/sync", sync_request_sent, false)
func _on_cool_down_timeout() -> void: func _on_cool_down_timeout() -> void:
print("_on_cool_down_timeout") print("_on_cool_down_timeout")