From 7132e0f00e28ec296506471ad26c096ef69d0000 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Wed, 12 Feb 2025 00:24:27 +0500 Subject: [PATCH 1/6] USE_STEAMAPPID_AS_NAME MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил возможность использовать SteamAppId вместо названия Тем самым стим будет подтягивать раскладки геймпадов для игр --- data_from_portwine/scripts/add_in_steam.sh | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index d0137db..671ddf0 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -104,13 +104,13 @@ getSteamId() { if [[ -z "${SteamIds:-}" ]] && [[ -f "${cache_file}" ]]; then SteamIds=$(<"${cache_file}") fi - if [[ -n "${SteamIds:-}" ]] && jq -e --arg key "$NOSTAPPNAME" 'has($key)' <<< "${SteamIds}" > /dev/null; then + if [[ -n "${SteamIds:-}" ]] && jq -e --arg key "${NOSTAPPNAME}" 'has($key)' <<< "${SteamIds}" > /dev/null; then SteamAppId=$(jq -r --arg key "${NOSTAPPNAME}" '.[$key]' <<< "${SteamIds}") else if [[ -n "${1:-}" ]] && [[ "${USE_STEABGRIDDB:-1}" == "1" ]]; then getSteamGridDBId "${NOSTAPPNAME}" > /dev/null fi - if [[ $SteamGridDBTypeSteam == true ]]; then + if [[ ${SteamGridDBTypeSteam} == true ]]; then SRES=$(curl -Ls --connect-timeout 5 -m 10 -e "https://www.steamgriddb.com/game/${SteamGridDBId}" "https://www.steamgriddb.com/api/public/game/${SteamGridDBId}") if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" @@ -350,8 +350,8 @@ downloadImageSteamGridDB() { } addGrids() { - getSteamGridDBId "${name_desktop}" > /dev/null - if [[ "${USE_STEABGRIDDB:-1}" == "0" ]]; then + [[ -z "${SteamGridDBId}" ]] && getSteamGridDBId "${name_desktop}" > /dev/null + if [[ -z "${SteamAppId}" ]] && [[ "${USE_STEABGRIDDB:-1}" == "0" ]]; then getSteamId > /dev/null fi if [[ -n "${SteamGridDBId}" ]] || [[ -n "${SteamAppId}" ]]; then @@ -467,6 +467,8 @@ addNonSteamGame() { [[ -z "${NOSTSHPATH}" ]] && NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" NOSTAPPNAME="${name_desktop}" NOSTAPPID=$(getAppId "${NOSTSHPATH}") + echo "NOSTAPPNAME: ${NOSTAPPNAME}" + echo "NOSTAPPID: ${NOSTAPPID}" if [[ -z "${NOSTAPPID}" ]]; then NOSTEXEPATH="${NOSTSHPATH}" if [[ -z "${NOSTSTDIR}" ]]; then @@ -474,8 +476,8 @@ addNonSteamGame() { fi NOSTICONPATH="${PORT_WINE_PATH}/data/img/${name_desktop_png}.png" NOSTAIDVDF="$(generateShortcutVDFAppId "${NOSTAPPNAME}${NOSTEXEPATH}")" # signed integer AppID, stored in the VDF as hexidecimal - ex: -598031679 - NOSTAIDVDFHEX="$(generateShortcutVDFHexAppId "$NOSTAIDVDF")" # 4byte little-endian hexidecimal of above 32bit signed integer, which we write out to the binary VDF - ex: c1c25adc - NOSTAPPID="$(extractSteamId32 "$NOSTAIDVDF")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts + NOSTAIDVDFHEX="$(generateShortcutVDFHexAppId "${NOSTAIDVDF}")" # 4byte little-endian hexidecimal of above 32bit signed integer, which we write out to the binary VDF - ex: c1c25adc + NOSTAPPID="$(extractSteamId32 "${NOSTAIDVDF}")" # unsigned 32bit ingeger version of "$NOSTAIDVDF", which is used as the AppID for Steam artwork ("grids"), as well as for our shortcuts create_new_dir "${STEAM_SCRIPTS}" cat <<-EOF > "${NOSTSHPATH}" @@ -491,9 +493,15 @@ addNonSteamGame() { cp "${SCPATH}" "${SCPATH//.vdf}_${PROGNAME}_backup.vdf" 2>/dev/null fi + if [[ "${USE_STEAMAPPID_AS_NAME:-0}" == "1" ]]; then + getSteamId "${NOSTAPPNAME}" + [[ -n "${SteamAppId}" ]] && NOSTAPPNAME="${SteamAppId}" + fi + addEntry if [[ "${DOWNLOAD_STEAM_GRID}" == "1" ]] ; then + NOSTAPPNAME="${name_desktop}" pw_start_progress_bar_block "${translations[Please wait. downloading covers for]} ${NOSTAPPNAME}" addGrids pw_stop_progress_bar From b354de779c945c46fe3259d67f4b5500b94f59f2 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Wed, 12 Feb 2025 00:27:15 +0500 Subject: [PATCH 2/6] USE_STEAMGRIDDB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Убрал опечатку в USE_STEA'B'GRIDDB --- data_from_portwine/scripts/add_in_steam.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 671ddf0..69f6bb8 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -107,7 +107,7 @@ getSteamId() { if [[ -n "${SteamIds:-}" ]] && jq -e --arg key "${NOSTAPPNAME}" 'has($key)' <<< "${SteamIds}" > /dev/null; then SteamAppId=$(jq -r --arg key "${NOSTAPPNAME}" '.[$key]' <<< "${SteamIds}") else - if [[ -n "${1:-}" ]] && [[ "${USE_STEABGRIDDB:-1}" == "1" ]]; then + if [[ -n "${1:-}" ]] && [[ "${USE_STEAMGRIDDB:-1}" == "1" ]]; then getSteamGridDBId "${NOSTAPPNAME}" > /dev/null fi if [[ ${SteamGridDBTypeSteam} == true ]]; then @@ -115,7 +115,7 @@ getSteamId() { if jq -e ".success == true" <<< "${SRES}" > /dev/null 2>&1; then SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" fi - elif [[ "${USE_STEABGRIDDB:-1}" == "0" ]]; then + elif [[ "${USE_STEAMGRIDDB:-1}" == "0" ]]; then SteamAppId="$(curl -s --connect-timeout 5 -m 10 "https://api.steampowered.com/ISteamApps/GetAppList/v2/" | jq --arg name "${NOSTAPPNAME}" '.applist.apps[] | select(.name == $name) | .appid')" fi SteamIds=$(jq --arg key "${NOSTAPPNAME}" --arg value "${SteamAppId:-}" '. + {($key): $value}' <<< "${SteamIds:-$(jq -n '{}')}") @@ -129,7 +129,7 @@ getSteamId() { getSteamGridDBId() { unset SteamGridDBId NOSTAPPNAME="$1" - if [[ "${USE_STEABGRIDDB:-1}" == "1" ]] && [[ -n "${SGDBAPIKEY}" ]] && [[ -n "${BASESTEAMGRIDDBAPI}" ]] && curl -fs --connect-timeout 5 -m 10 -o /dev/null "${BASESTEAMGRIDDBAPI}"; then + if [[ "${USE_STEAMGRIDDB:-1}" == "1" ]] && [[ -n "${SGDBAPIKEY}" ]] && [[ -n "${BASESTEAMGRIDDBAPI}" ]] && curl -fs --connect-timeout 5 -m 10 -o /dev/null "${BASESTEAMGRIDDBAPI}"; then SGDBRES=$(curl -Ls --connect-timeout 5 -m 10 -H "Authorization: Bearer ${SGDBAPIKEY}" "${BASESTEAMGRIDDBAPI}/search/autocomplete/${NOSTAPPNAME// /_}") if jq -e ".success == true and (.data | length > 0)" <<< "${SGDBRES}" > /dev/null 2>&1; then if jq -e '.data[0].types | contains(["steam"])' <<< "${SGDBRES}" > /dev/null; then @@ -141,7 +141,7 @@ getSteamGridDBId() { echo "${SteamGridDBId}" fi else - USE_STEABGRIDDB="0" + USE_STEAMGRIDDB="0" fi } @@ -351,7 +351,7 @@ downloadImageSteamGridDB() { addGrids() { [[ -z "${SteamGridDBId}" ]] && getSteamGridDBId "${name_desktop}" > /dev/null - if [[ -z "${SteamAppId}" ]] && [[ "${USE_STEABGRIDDB:-1}" == "0" ]]; then + if [[ -z "${SteamAppId}" ]] && [[ "${USE_STEAMGRIDDB:-1}" == "0" ]]; then getSteamId > /dev/null fi if [[ -n "${SteamGridDBId}" ]] || [[ -n "${SteamAppId}" ]]; then From f9b8fd069ce36ce32fb3880807d417d13c9838e5 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Wed, 12 Feb 2025 01:43:11 +0500 Subject: [PATCH 3/6] listInstalledSteamGames MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлена проверка "StateFlags" Игры отбираются только при наличии "SharedDepots" --- data_from_portwine/scripts/add_in_steam.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 69f6bb8..7e3cd21 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -204,10 +204,12 @@ listInstalledSteamGames() { jq -n '[]' else for manifest_file in "${manifests[@]}"; do - name="$(grep -Po '"name"\s+"\K[^"]+' "$manifest_file")"; - if [[ ! "${name}" =~ ^(Proton |Steam Linux Runtime|Steamworks Common) ]]; then + name="$(grep -Po '"name"\s+"\K[^"]+' "${manifest_file}")"; + stateflags="$(grep -Po '"StateFlags"\s+"\K\d+' "${manifest_file}")" +# if [[ ! "${name}" =~ ^(Proton |Steam Linux Runtime|Steamworks Common) ]]; then + if ((stateflags & 4)) && grep -q '"SharedDepots"' "${manifest_file}"; then jq -n \ - --arg id "$(grep -Po '"appid"\s+"\K\d+' "$manifest_file")" \ + --arg id "$(grep -Po '"appid"\s+"\K\d+' "${manifest_file}")" \ --arg name "${name}" \ '{id: $id, name: $name}' fi From 1d2ac06f24800cd5e75a4bbaebb96aca462a71a4 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Wed, 12 Feb 2025 21:27:51 +0500 Subject: [PATCH 4/6] cache steamapplist on getSteamId MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил кеширование списка приложений получаемых с сервера steam Так же поиск по этому списку теперь регистронезависимый --- data_from_portwine/scripts/add_in_steam.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 7e3cd21..ded2ae1 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -100,6 +100,7 @@ getAppId() { getSteamId() { unset SteamAppId local cache_file="${PORT_WINE_TMP_PATH:-/tmp}/steamid_cache.json" + local applist_cache_file="${PORT_WINE_TMP_PATH:-/tmp}/steamapplist_cache.json" [[ -n "${1:-}" ]] && NOSTAPPNAME="$1" if [[ -z "${SteamIds:-}" ]] && [[ -f "${cache_file}" ]]; then SteamIds=$(<"${cache_file}") @@ -116,7 +117,13 @@ getSteamId() { SteamAppId="$(jq -r '.data.platforms.steam.id' <<< "${SRES}")" fi elif [[ "${USE_STEAMGRIDDB:-1}" == "0" ]]; then - SteamAppId="$(curl -s --connect-timeout 5 -m 10 "https://api.steampowered.com/ISteamApps/GetAppList/v2/" | jq --arg name "${NOSTAPPNAME}" '.applist.apps[] | select(.name == $name) | .appid')" + if [[ ! -f "${applist_cache_file}" ]] || [[ $(find "${applist_cache_file}" -mmin +1440) ]]; then + applist_data=$(curl -s --connect-timeout 5 "https://api.steampowered.com/ISteamApps/GetAppList/v2/") + [[ -n "${applist_data}" ]] && echo "${applist_data}" > "${applist_cache_file}" + else + applist_data=$(<"${applist_cache_file}") + fi + [[ -n "${applist_data}" ]] && SteamAppId=$(jq --arg name "${NOSTAPPNAME,,}" '.applist.apps[] | select(.name == $name) | .appid' <<< "${applist_data,,}") fi SteamIds=$(jq --arg key "${NOSTAPPNAME}" --arg value "${SteamAppId:-}" '. + {($key): $value}' <<< "${SteamIds:-$(jq -n '{}')}") echo "${SteamIds}" > "${cache_file}" From d21849c121b5c037e484ec3a63549638ebfe627b Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Wed, 12 Feb 2025 22:08:19 +0500 Subject: [PATCH 5/6] support appid as name on listSteamGames MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавил поддержку игр у которых вместо названия используется SteamAppId Для них appid берется из названии игры, а name из имени скрипта --- data_from_portwine/scripts/add_in_steam.sh | 47 +++++++++++++--------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index ded2ae1..5967b09 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -225,36 +225,47 @@ listInstalledSteamGames() { } listNonSteamGames() { - getSteamShortcutHex | while read -r SCVDFE; do - jq -n \ - --arg id "$(parseSteamShortcutEntryAppID "${SCVDFE}")" \ - --arg name "$(parseSteamShortcutEntryAppName "${SCVDFE}")" \ - --arg exe "$(parseSteamShortcutEntryExe "${SCVDFE}")" \ - --arg dir "$(parseSteamShortcutEntryStartDir "${SCVDFE}")" \ - --arg icon "$(parseSteamShortcutEntryIcon "${SCVDFE}")" \ - --arg args "$(parseSteamShortcutEntryLaunchOptions "${SCVDFE}")" \ - '{id: $id, name: $name, exe: $exe, dir: $dir, icon: $icon, args: $args}' - done | jq -s '.' + getSteamShortcutHex | while read -r SCVDFE; do + jq -n \ + --arg id "$(parseSteamShortcutEntryAppID "${SCVDFE}")" \ + --arg name "$(parseSteamShortcutEntryAppName "${SCVDFE}")" \ + --arg exe "$(parseSteamShortcutEntryExe "${SCVDFE}")" \ + --arg dir "$(parseSteamShortcutEntryStartDir "${SCVDFE}")" \ + --arg icon "$(parseSteamShortcutEntryIcon "${SCVDFE}")" \ + --arg args "$(parseSteamShortcutEntryLaunchOptions "${SCVDFE}")" \ + '{id: $id, name: $name, exe: $exe, dir: $dir, icon: $icon, args: $args}' + done | jq -s '.' } listSteamGames() { ( - jq -r 'map({AppId: .id, SteamAppId: .id, SteamGameId: .id, Name: .name}) | .[] | tostring' <<< "$(listInstalledSteamGames)" + jq -r 'map({AppId: .id, SteamAppId: .id, SteamGameId: .id, Name: .name}) | .[] | tostring' <<< "$(listInstalledSteamGames)" jq -r '.[] | tostring' <<< "$(listNonSteamGames)" | while read -r game; do id=$(jq -r '.id' <<< "${game}") name=$(jq -r '.name' <<< "${game}") - jq -r \ - --arg SteamAppId "$(getSteamId "${name}")" \ - --arg SteamGameId "$(getSteamGameId $id)" \ - '{AppId: .id, SteamAppId: ($SteamAppId | if . == "" then "0" else . end), SteamGameId: $SteamGameId, Name: .name} | tostring' <<< "${game}" + exe=$(jq -r '.exe' <<< "${game}") + if [[ "${name}" =~ ^[0-9]+$ ]] && [[ "${exe}" =~ .sh$ ]]; then + appid="${name}" + name=$(basename "${exe}" .sh) + else + appid="$(getSteamId "${name}")" + [[ -z "${appid}" ]] && appid="0" + fi + gid="$(getSteamGameId $id)" + jq -n \ + --arg id "${id}" \ + --arg appid "${appid}" \ + --arg gid "${gid}" \ + --arg name "${name}" \ + '{AppId: $id, SteamAppId: $appid, SteamGameId: $gid, Name: $name}' done ) | jq -s '.' } convertSteamShortcutAppID() { - SHORTCUTAPPIDHEX="$1" - SHORTCUTAPPIDLITTLEENDIAN="$( echo "${SHORTCUTAPPIDHEX}" | tac -rs .. | tr -d '\n' )" - echo "$((16#${SHORTCUTAPPIDLITTLEENDIAN}))" + SHORTCUTAPPIDHEX="$1" + SHORTCUTAPPIDLITTLEENDIAN="$( echo "${SHORTCUTAPPIDHEX}" | tac -rs .. | tr -d '\n' )" + echo "$((16#${SHORTCUTAPPIDLITTLEENDIAN}))" } convertSteamShortcutHex() { From 46aaca1ee1cb9c758fa6ca485623de15e3c3e214 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Wed, 12 Feb 2025 22:28:17 +0500 Subject: [PATCH 6/6] removed debug information --- data_from_portwine/scripts/add_in_steam.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/data_from_portwine/scripts/add_in_steam.sh b/data_from_portwine/scripts/add_in_steam.sh index 5967b09..34793b9 100755 --- a/data_from_portwine/scripts/add_in_steam.sh +++ b/data_from_portwine/scripts/add_in_steam.sh @@ -487,8 +487,6 @@ addNonSteamGame() { [[ -z "${NOSTSHPATH}" ]] && NOSTSHPATH="${STEAM_SCRIPTS}/${name_desktop}.sh" NOSTAPPNAME="${name_desktop}" NOSTAPPID=$(getAppId "${NOSTSHPATH}") - echo "NOSTAPPNAME: ${NOSTAPPNAME}" - echo "NOSTAPPID: ${NOSTAPPID}" if [[ -z "${NOSTAPPID}" ]]; then NOSTEXEPATH="${NOSTSHPATH}" if [[ -z "${NOSTSTDIR}" ]]; then @@ -514,7 +512,7 @@ addNonSteamGame() { fi if [[ "${USE_STEAMAPPID_AS_NAME:-0}" == "1" ]]; then - getSteamId "${NOSTAPPNAME}" + SteamAppId=$(getSteamId "${NOSTAPPNAME}") [[ -n "${SteamAppId}" ]] && NOSTAPPNAME="${SteamAppId}" fi