diff --git a/functions/compression.sh b/functions/compression.sh index f4b5309f..aba004f8 100644 --- a/functions/compression.sh +++ b/functions/compression.sh @@ -7,7 +7,7 @@ compress_game() { local filename_no_path=$(basename "$file") local filename_no_extension="${filename_no_path%.*}" local filename_extension="${filename_no_path##*.}" - local source_file=$(dirname "$(realpath "$file")")"/"$(basename "$file") + local source_file=$(dirname "$(realpath "$file")")"/""$(basename "$file")" local dest_file=$(dirname "$(realpath "$file")")"/""$filename_no_extension" if [[ "$1" == "chd" ]]; then @@ -136,6 +136,8 @@ find_compatible_games() { # "all" - Compresses a list of user-chosen files into their compatible formats # "chd" or "zip" or "rvz" - Compresses a list of user-chosen files into the given format + log d "Started function with parameters: $1" + if [[ -f "$godot_compression_compatible_games" ]]; then rm -f "$godot_compression_compatible_games" # Godot data transfer temp files fi @@ -153,46 +155,60 @@ find_compatible_games() { fi if [[ $compression_format == "all" ]]; then - local compressable_systems_list=$(cat $compression_targets | sed '/^$/d' | sed '/^\[/d') + local compressable_systems_list=$(jq -r '.compression_targets | to_entries[] | .value[]' $features) + log d "compressable_systems_list: $compressable_systems_list" else - local compressable_systems_list=$(sed -n '/\['"$compression_format"'\]/, /\[/{ /\['"$compression_format"'\]/! { /\[/! p } }' $compression_targets | sed '/^$/d') + local compressable_systems_list=$(jq -r '.compression_targets["'"$compression_format"'"][]' $features) + log d "compressable_systems_list: $compressable_systems_list" fi - while IFS= read -r system # Find and validate all games that are able to be compressed with this compression type + log d "Finding compatible games for compression $1" + log d "compression_targets: $compression_targets" + + while IFS= read -r system do + log d "Checking system: $system" compression_candidates=$(find "$roms_folder/$system" -type f -not -iname "*.txt") if [[ ! -z $compression_candidates ]]; then while IFS= read -r game do + log d "Checking game: $game" local compatible_compression_format=$(find_compatible_compression_format "$game") if [[ $compression_format == "chd" ]]; then if [[ $compatible_compression_format == "chd" && ! -f "$(echo ${game%.*}.chd)" ]]; then + log d "Game $game is compatible with CHD compression" all_compressable_games=("${all_compressable_games[@]}" "$game") - compressable_games_list=("${compressable_games_list[@]}" "false" "${game#$roms_folder}" "$game") + compressable_games_list=("${compressable_games_list[@]}" "${game#$roms_folder}" "$game") echo "${game}"^"$compatible_compression_format" >> "$godot_compression_compatible_games" fi elif [[ $compression_format == "zip" ]]; then if [[ $compatible_compression_format == "zip" && ! -f "$(echo ${game%.*}.zip)" ]]; then + log d "Game $game is compatible with ZIP compression" all_compressable_games=("${all_compressable_games[@]}" "$game") - compressable_games_list=("${compressable_games_list[@]}" "false" "${game#$roms_folder}" "$game") + compressable_games_list=("${compressable_games_list[@]}" "${game#$roms_folder}" "$game") echo "${game}"^"$compatible_compression_format" >> "$godot_compression_compatible_games" fi elif [[ $compression_format == "rvz" ]]; then if [[ $compatible_compression_format == "rvz" && ! -f "$(echo ${game%.*}.rvz)" ]]; then + log d "Game $game is compatible with RVZ compression" all_compressable_games=("${all_compressable_games[@]}" "$game") - compressable_games_list=("${compressable_games_list[@]}" "false" "${game#$roms_folder}" "$game") + compressable_games_list=("${compressable_games_list[@]}" "${game#$roms_folder}" "$game") echo "${game}"^"$compatible_compression_format" >> "$godot_compression_compatible_games" fi elif [[ $compression_format == "all" ]]; then if [[ ! $compatible_compression_format == "none" ]]; then + log d "Game $game is compatible with $compatible_compression_format compression" all_compressable_games=("${all_compressable_games[@]}" "$game") - compressable_games_list=("${compressable_games_list[@]}" "false" "${game#$roms_folder}" "$game") + compressable_games_list=("${compressable_games_list[@]}" "${game#$roms_folder}" "$game") echo "${game}"^"$compatible_compression_format" >> "$godot_compression_compatible_games" fi fi done < <(printf '%s\n' "$compression_candidates") fi done < <(printf '%s\n' "$compressable_systems_list") + + log d "compressable_games:\n${all_compressable_games[@]}" + echo "${all_compressable_games[@]}" } cli_compress_single_game() { @@ -231,9 +247,9 @@ cli_compress_all_games() { local compressable_game="" local all_compressable_games=() if [[ $compression_format == "all" ]]; then - local compressable_systems_list=$(cat $compression_targets | sed '/^$/d' | sed '/^\[/d') + local compressable_systems_list=$(jq -r '.compression_targets | to_entries[] | .value[]' $features) else - local compressable_systems_list=$(sed -n '/\['"$compression_format"'\]/, /\[/{ /\['"$compression_format"'\]/! { /\[/! p } }' $compression_targets | sed '/^$/d') + local compressable_systems_list=$(jq -r '.compression_targets["'"$compression_format"'"][]' $features) fi read -p "Do you want to have the original files removed after compression is complete? Please answer y/n and press Enter: " post_compression_cleanup diff --git a/functions/other_functions.sh b/functions/other_functions.sh index 568c448d..372fa807 100644 --- a/functions/other_functions.sh +++ b/functions/other_functions.sh @@ -782,7 +782,7 @@ ponzu_remove() { else log e "Ponzu: \"$1\" is not a vaild choice for removal, quitting" fi - configurator_retrodeck_tools_dialog + configurator_tools_dialog } release_selector() { diff --git a/tools/configurator.sh b/tools/configurator.sh index e83c0c88..33806c77 100755 --- a/tools/configurator.sh +++ b/tools/configurator.sh @@ -134,7 +134,7 @@ configurator_welcome_dialog() { "Tools" ) log i "Configurator: opening \"$choice\" menu" - configurator_retrodeck_tools_dialog + configurator_tools_dialog ;; "About RetroDECK" ) @@ -406,7 +406,7 @@ configurator_open_emulator_dialog() { fi } -configurator_retrodeck_tools_dialog() { +configurator_tools_dialog() { local choices=( "Backup Userdata" "Compress and backup RetroDECK userdata folders." @@ -457,6 +457,12 @@ configurator_retrodeck_tools_dialog() { configurator_bios_checker ;; + "Games Compressor" ) + log i "Configurator: opening \"$choice\" menu" + configurator_generic_dialog "RetroDECK Configurator - Compression Tool" "Depending on your library and compression choices, the process can sometimes take a long time.\nPlease be patient once it is started!" + configurator_compression_tool_dialog + ;; + "Install: RetroDECK Controller Layouts" ) log i "Configurator: opening \"$choice\" menu" configurator_generic_dialog "RetroDECK Configurator - Install: RetroDECK Controller Profile" "We are now offering a new official RetroDECK controller profile!\nIt is an optional component that helps you get the most out of RetroDECK with a new in-game radial menu for unified hotkeys across emulators.\n\nThe files need to be installed outside of the normal ~/retrodeck folder, so we wanted your permission before proceeding.\n\nThe files will be installed at the following shared Steam locations:\n\n$HOME/.steam/steam/tenfoot/resource/images/library/controller/binding_icons/\n$HOME/.steam/steam/controller_base/templates" @@ -464,7 +470,7 @@ configurator_retrodeck_tools_dialog() { install_retrodeck_controller_profile configurator_generic_dialog "RetroDECK Configurator - Install: RetroDECK Controller Profile" "The RetroDECK controller profile install is complete.\nSee the Wiki for more details on how to use it to its fullest potential!" fi - configurator_retrodeck_tools_dialog + configurator_tools_dialog ;; "Install: PS3 Firmware" ) @@ -483,7 +489,7 @@ configurator_retrodeck_tools_dialog() { else configurator_generic_dialog "RetroDECK Configurator - Install: PS3 Firmware" "You do not appear to currently have Internet access, which is required by this tool. Please try again when network access has been restored." - configurator_retrodeck_tools_dialog + configurator_tools_dialog fi ;; @@ -501,7 +507,7 @@ configurator_retrodeck_tools_dialog() { --auto-close else configurator_generic_dialog "RetroDECK Configurator - Install: PS Vita Firmware" "You do not appear to currently have Internet access, which is required by this tool. Please try again when network access has been restored." - configurator_retrodeck_tools_dialog + configurator_tools_dialog fi ;; @@ -696,7 +702,7 @@ configurator_compression_tool_dialog() { "" ) # No selection made or Back button clicked log i "Configurator: going back" - configurator_retrodeck_tools_dialog + configurator_tools_dialog ;; esac @@ -732,10 +738,36 @@ configurator_compress_single_game_dialog() { configurator_compress_multiple_games_dialog() { # This dialog will display any games it finds to be compressable, from the systems listed under each compression type in features.json - find_compatible_games "$1" + log d "Starting to compress \"$1\"" + + # Create a temporary file for the final output and a named pipe for the progress messages. + temp_output=$(mktemp) + pipe=$(mktemp -u) + mkfifo "$pipe" + + # Run find_compatible_games in the background. + # Its output is tee'd to both the temp file (for capturing later) and the named pipe (for Zenity). + ( find_compatible_games "$1" | tee "$temp_output" > "$pipe" ) & + + # While the background process runs, show the progress dialog. + rd_zenity --progress --pulsate --auto-close \ + --window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \ + --title="RetroDECK Configurator Utility - Searching for Compressable Games" \ + --text="Searching for compressable games, please wait..." < "$pipe" + + # Wait for the background process to complete. + wait + + # Now capture the final output. + all_compressable_games=($(cat "$temp_output")) + + # Clean up temporary files. + rm "$temp_output" "$pipe" + + log d "Found the following games to compress:\n${all_compressable_games[@]}" if [[ ! $(echo "${#all_compressable_games[@]}") == "0" ]]; then - if [[ ! "$target_selection" == "everything" ]]; then # If the user chose to not auto-compress everything + if [[ ! "$target_selection" == "everything" ]]; then choice=$(rd_zenity \ --list --width=1200 --height=720 --title "RetroDECK Configurator - RetroDECK: Compression Tool" \ --checklist --hide-column=3 --ok-label="Compress Selected" --extra-button="Compress All" \ @@ -747,16 +779,16 @@ configurator_compress_multiple_games_dialog() { "${compressable_games_list[@]}") local rc=$? - if [[ $rc == "0" && ! -z $choice ]]; then # User clicked "Compress Selected" with at least one game selected + if [[ $rc == "0" && ! -z $choice ]]; then IFS="," read -ra games_to_compress <<< "$choice" local total_games_to_compress=${#games_to_compress[@]} local games_left_to_compress=$total_games_to_compress - elif [[ ! -z $choice ]]; then # User clicked "Compress All" + elif [[ ! -z $choice ]]; then games_to_compress=("${all_compressable_games[@]}") local total_games_to_compress=${#all_compressable_games[@]} local games_left_to_compress=$total_games_to_compress fi - else # The user chose to auto-compress everything + else games_to_compress=("${all_compressable_games[@]}") local total_games_to_compress=${#all_compressable_games[@]} local games_left_to_compress=$total_games_to_compress @@ -814,7 +846,7 @@ configurator_update_notify_dialog() { then set_setting_value $rd_conf "update_check" "false" retrodeck "options" else # User clicked "Cancel" - configurator_retrodeck_tools_dialog + configurator_tools_dialog fi else rd_zenity --question \ @@ -826,7 +858,7 @@ configurator_update_notify_dialog() { then set_setting_value $rd_conf "update_check" "true" retrodeck "options" else # User clicked "Cancel" - configurator_retrodeck_tools_dialog + configurator_tools_dialog fi fi } @@ -847,7 +879,7 @@ configurator_portmaster_toggle_dialog(){ --title "RetroDECK Configurator - PortMaster Visibility" \ --text="PortMaster is now hidden in ES-DE.\nPlease refresh your game list or restart RetroDECK to see the changes.\n\nIn order to launch PortMaster, you can access it from:\nConfigurator -> Open Component -> PortMaster." else # User clicked "Cancel" - configurator_retrodeck_tools_dialog + configurator_tools_dialog fi else rd_zenity --question \ @@ -863,10 +895,10 @@ configurator_portmaster_toggle_dialog(){ --title "RetroDECK Configurator - PortMaster Visibility" \ --text="PortMaster is now visible in ES-DE.\nPlease refresh your game list or restart RetroDECK to see the changes." else # User clicked "Cancel" - configurator_retrodeck_tools_dialog + configurator_tools_dialog fi fi - configurator_retrodeck_tools_dialog + configurator_tools_dialog } # This function checks and verifies BIOS files for RetroDECK.