Fix gitlab changing their API url formats again

This commit is contained in:
the-sane 2023-09-10 12:56:12 -04:00
parent 0548755e2c
commit 0fc50e6312

View File

@ -123,7 +123,7 @@ tmp_dir="$(mktemp -d --suffix=".lughelper")"
trap 'rm -r "$tmp_dir"' EXIT trap 'rm -r "$tmp_dir"' EXIT
# Set a maximum number of versions to display from each download url # Set a maximum number of versions to display from each download url
max_download_items=20 max_download_items=25
# Pixels to add for each Zenity menu option # Pixels to add for each Zenity menu option
# used to dynamically determine the height of menus # used to dynamically determine the height of menus
@ -1380,21 +1380,25 @@ download_install() {
;; ;;
esac esac
# Set the search key we'll use to parse the api for the download url # Set the search keys we'll use to parse the api for the download url
# To add new sources, handle them here and in the # To add new sources, handle them here and in the
# download_select_install function below # download_select_install function below
if [ "$download_url_type" = "github" ]; then if [ "$download_url_type" = "github" ]; then
# Which json key are we looking for?
search_key="browser_download_url" search_key="browser_download_url"
# Add a query string to the url
query_string="?per_page=$max_download_items" query_string="?per_page=$max_download_items"
elif [ "$download_url_type" = "gitlab" ]; then elif [ "$download_url_type" = "gitlab" ]; then
# Which json key are we looking for?
search_key="direct_asset_url" search_key="direct_asset_url"
# Add a query string to the url
query_string="?per_page=$max_download_items" query_string="?per_page=$max_download_items"
else else
debug_print exit "Script error: Unknown api/url format in ${download_type}_sources array. Aborting." debug_print exit "Script error: Unknown api/url format in ${download_type}_sources array. Aborting."
fi fi
# Get the selected download url # Get the selected download url
download_url="$(curl -s "$contributor_url$query_string" | grep -Eo "\"$search_key\": ?\"[^\"]+$download_file\"" | cut -d '"' -f4 | sed 's|/-/blob/|/-/raw/|')" download_url="$(curl -s "$contributor_url$query_string" | grep -Eo "\"$search_key\": ?\"[^\"]+\"" | grep "$download_file" | cut -d '"' -f4 | sed 's|/-/blob/|/-/raw/|')"
# Sanity check # Sanity check
if [ -z "$download_url" ]; then if [ -z "$download_url" ]; then
@ -1635,19 +1639,30 @@ download_select_install() {
;; ;;
esac esac
# Set the search key we'll use to parse the api for the download url # Set the search keys we'll use to parse the api for the download url
# To add new sources, handle them here, in the if statement # To add new sources, handle them here, in the if statement
# just above, and the download_install function above # just above, and the download_install function above
if [ "$download_url_type" = "github" ]; then if [ "$download_url_type" = "github" ]; then
# Which json key are we looking for?
search_key="browser_download_url" search_key="browser_download_url"
query_string="?per_page=$max_download_items" # Optional: Only match urls containing a keyword
# For GE runners, add a few extra to max_download_items match_url_keyword=""
# to provide extra room to filter out the game-specific builds below # For GE runners, only match filenames containing Proton
if [ "$download_type" = "runner" ] && [ "$contributor_name" = "GloriousEggroll" ]; then if [ "$download_type" = "runner" ] && [ "$contributor_name" = "GloriousEggroll" ]; then
query_string="?per_page=$((max_download_items+5))" match_file_keyword="Proton"
else
match_file_keyword=""
fi fi
# Add a query string to the url
query_string="?per_page=$max_download_items"
elif [ "$download_url_type" = "gitlab" ]; then elif [ "$download_url_type" = "gitlab" ]; then
# Which json key are we looking for?
search_key="direct_asset_url" search_key="direct_asset_url"
# Only match urls containing a keyword
match_url_keyword="releases"
# Optional: Only match filenames containing a keyword
match_file_keyword=""
# Add a query string to the url
query_string="?per_page=$max_download_items" query_string="?per_page=$max_download_items"
else else
debug_print exit "Script error: Unknown api/url format in ${download_type}_sources array. Aborting." debug_print exit "Script error: Unknown api/url format in ${download_type}_sources array. Aborting."
@ -1657,8 +1672,8 @@ download_select_install() {
unset download_versions unset download_versions
while IFS='' read -r line; do while IFS='' read -r line; do
download_versions+=("$line") download_versions+=("$line")
done < <(curl -s "$contributor_url$query_string" | grep -Eo "\"$search_key\": ?\"[^\"]+\"" | cut -d '"' -f4 | xargs basename -a) done < <(curl -s "$contributor_url$query_string" | grep -Eo "\"$search_key\": ?\"[^\"]+\"" | grep "$match_url_keyword" | cut -d '"' -f4 | cut -d '?' -f1 | xargs basename -a | grep "$match_file_keyword")
# Note: match from search_key until ", or EOL (Handles embedded commas and escaped quotes) # Note: match from search_key until " or EOL (Handles embedded commas and escaped quotes). Cut out quotes and gitlab's extraneous query strings.
# Sanity check # Sanity check
if [ "${#download_versions[@]}" -eq 0 ]; then if [ "${#download_versions[@]}" -eq 0 ]; then
@ -1680,12 +1695,6 @@ download_select_install() {
# To add new file extensions, handle them here and in # To add new file extensions, handle them here and in
# the download_install function above # the download_install function above
for (( i=0,num_download_items=0; i<"${#download_versions[@]}" && "$num_download_items"<"$max_download_items"; i++ )); do for (( i=0,num_download_items=0; i<"${#download_versions[@]}" && "$num_download_items"<"$max_download_items"; i++ )); do
# For GE runners, we want to filter out game-specific builds
# This assumes that all standard GE builds contain the word proton in their name
if [ "$download_url_type" = "github" ] && [ "$download_type" = "runner" ] && [ "$contributor_name" = "GloriousEggroll" ] &&
printf '%s' "${download_versions[i]}" | grep -qive "proton"; then
continue
fi
# Get the file name minus the extension # Get the file name minus the extension
case "${download_versions[i]}" in case "${download_versions[i]}" in