forked from CastroFidel/winehelper
changed the download and selection of wine/proton versions on the cloud
This commit is contained in:
260
winehelper
260
winehelper
@@ -811,39 +811,11 @@ init_wine_ver () {
|
||||
export WINEDIR="$WH_DIST_DIR/$WH_WINE_USE"
|
||||
|
||||
if [[ ! -d "$WINEDIR" ]] ; then
|
||||
local download_url wine_package_name wine_package check_sum_arg
|
||||
WINE_METADATA_FILE="$WH_TMP_DIR/wine_metadata.json"
|
||||
local download_url wine_package
|
||||
download_url="$CLOUD_URL/$WH_WINE_USE.tar.xz"
|
||||
wine_package="$WH_TMP_DIR/$WH_WINE_USE.tar.xz"
|
||||
|
||||
# Сначала пытаемся сформировать URL по старой схеме, как основной для автоустановки
|
||||
local old_schema_url="$CLOUD_URL/$WH_WINE_USE.tar.xz"
|
||||
|
||||
# `curl -f -s -I` делает HEAD-запрос. `-f` заставляет его вернуть код ошибки при 404.
|
||||
if curl -f -s -I "$old_schema_url" > /dev/null ; then
|
||||
download_url="$old_schema_url"
|
||||
elif [[ -f "$WINE_METADATA_FILE" ]]; then
|
||||
# Если по старому URL ничего нет, ищем в метаданных
|
||||
print_info "Версия '$WH_WINE_USE' не найдена на основном сервере, ищем в метаданных..."
|
||||
download_url=$(jq -r --arg name "$WH_WINE_USE" '.[] | .[] | select(.name == $name) | .url' "$WINE_METADATA_FILE" | head -n 1)
|
||||
else
|
||||
# Если и метаданных нет, то считаем, что должен был быть старый URL
|
||||
print_warning "Файл метаданных не найден. Предполагается, что версия '$WH_WINE_USE' находится на основном сервере."
|
||||
download_url="$old_schema_url"
|
||||
fi
|
||||
|
||||
# Если URL так и не был найден, выводим ошибку.
|
||||
if [[ -z "$download_url" ]]; then
|
||||
fatal "Не удалось найти URL для скачивания версии '$WH_WINE_USE'."
|
||||
fi
|
||||
|
||||
wine_package_name="$(basename "$download_url")"
|
||||
wine_package="$WH_TMP_DIR/$wine_package_name"
|
||||
|
||||
# Проверяем хэш-сумму только для файлов с нашего сервера
|
||||
if [[ "$download_url" == *"$CLOUD_URL"* ]]; then
|
||||
check_sum_arg="check256sum"
|
||||
fi
|
||||
|
||||
try_download "$download_url" "$wine_package" "$check_sum_arg"
|
||||
try_download "$download_url" "$wine_package" "check256sum"
|
||||
unpack "$wine_package" "$WH_DIST_DIR/"
|
||||
try_remove_file "$wine_package"
|
||||
|
||||
@@ -1503,178 +1475,73 @@ remove_prefix() {
|
||||
fi
|
||||
}
|
||||
|
||||
generate_wine_metadata () {
|
||||
WINE_METADATA_FILE="$WH_TMP_DIR/wine_metadata.json"
|
||||
|
||||
if [[ -f "$WINE_METADATA_FILE" ]]; then
|
||||
if find "$WINE_METADATA_FILE" -mmin -1440 | grep -q . ; then
|
||||
print_info "Файл метаданных $WINE_METADATA_FILE обновлялся менее 24 часов назад. Пропускаем генерацию."
|
||||
return 0
|
||||
fi
|
||||
print_info "Файл метаданных $WINE_METADATA_FILE устарел."
|
||||
print_info "Начинаем обновление..."
|
||||
else
|
||||
print_info "Генерации метаданных..."
|
||||
fi
|
||||
|
||||
TMP_WINE_META="$WH_TMP_DIR/wine_metadata"
|
||||
local FETCH_ERROR_FLAG="$TMP_WINE_META/fetch.error"
|
||||
rm -f "$FETCH_ERROR_FLAG"
|
||||
|
||||
mkdir -p "$TMP_WINE_META"
|
||||
|
||||
cleanup() {
|
||||
rm -rf "$TMP_WINE_META"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
fetch_github_releases() {
|
||||
local repo="$1"
|
||||
local wine_metadata_file="$2"
|
||||
|
||||
local url="https://api.github.com/repos/$repo/releases"
|
||||
|
||||
if ! curl -s --fail -H "Accept: application/vnd.github.v3+json" "$url" > "$wine_metadata_file"; then
|
||||
touch "$FETCH_ERROR_FLAG"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! jq -e 'type == "array"' "$wine_metadata_file" >/dev/null 2>&1; then
|
||||
try_remove_file "$wine_metadata_file"
|
||||
touch "$FETCH_ERROR_FLAG"
|
||||
return 1
|
||||
fi
|
||||
|
||||
print_info "Получение данных для $repo"
|
||||
}
|
||||
|
||||
create_wine_entries() {
|
||||
local input_file="$1"
|
||||
local file_extension="$2"
|
||||
local exclude_patterns="$3"
|
||||
|
||||
jq -r --arg ext "$file_extension" '
|
||||
.[] |
|
||||
.assets[] |
|
||||
select(.browser_download_url | test($ext)) |
|
||||
{
|
||||
name: (.name | gsub($ext; "")),
|
||||
url: .browser_download_url
|
||||
}
|
||||
' "$input_file" | \
|
||||
if [[ -n "$exclude_patterns" ]]; then
|
||||
jq -c --arg patterns "$exclude_patterns" '
|
||||
select(.name | test($patterns) | not)
|
||||
'
|
||||
else
|
||||
jq -c '.'
|
||||
fi
|
||||
}
|
||||
|
||||
# Формат: "ключ_json;репозиторий;расширение_файла;шаблон_исключения"
|
||||
local sources=(
|
||||
"proton_ge;GloriousEggroll/proton-ge-custom;\\.tar\\.gz$;github-action"
|
||||
"wine_kron4ek;Kron4ek/Wine-Builds;\\.tar\\.xz$;"
|
||||
"proton_lg;Castro-Fidel/wine_builds;\\.tar\\.xz$;plugins"
|
||||
"proton_cachyos;CachyOS/proton-cachyos;\\.tar\\.xz$;znver"
|
||||
"proton_sarek;pythonlover02/Proton-Sarek;\\.tar\\.gz$;"
|
||||
"proton_em;Etaash-mathamsetty/Proton;\\.tar\\.xz$;"
|
||||
)
|
||||
|
||||
for source_data in "${sources[@]}"; do
|
||||
(
|
||||
IFS=';' read -r key repo extension exclude_pattern <<< "$source_data"
|
||||
|
||||
local releases_file="$TMP_WINE_META/${key}_releases.json"
|
||||
local entries_file="$TMP_WINE_META/${key}.json"
|
||||
|
||||
fetch_github_releases "$repo" "$releases_file" || exit 1
|
||||
create_wine_entries "$releases_file" "$extension" "$exclude_pattern" > "$entries_file"
|
||||
) &
|
||||
done
|
||||
|
||||
wait
|
||||
|
||||
if [[ -f "$FETCH_ERROR_FLAG" ]]; then
|
||||
fatal "Ошибка при получении релизов. Возможно, превышен лимит запросов к API GitHub или проблема с сетью."
|
||||
fi
|
||||
|
||||
print_ok "Все данные получены."
|
||||
|
||||
print_info "Создание итогового JSON файла..."
|
||||
|
||||
jq -n \
|
||||
--slurpfile proton_ge "$TMP_WINE_META/proton_ge.json" \
|
||||
--slurpfile wine_kron4ek "$TMP_WINE_META/wine_kron4ek.json" \
|
||||
--slurpfile proton_lg "$TMP_WINE_META/proton_lg.json" \
|
||||
--slurpfile proton_cachyos "$TMP_WINE_META/proton_cachyos.json" \
|
||||
--slurpfile proton_sarek "$TMP_WINE_META/proton_sarek.json" \
|
||||
--slurpfile proton_em "$TMP_WINE_META/proton_em.json" \
|
||||
'{
|
||||
proton_ge: $proton_ge,
|
||||
wine_kron4ek: $wine_kron4ek,
|
||||
proton_lg: $proton_lg,
|
||||
proton_cachyos: $proton_cachyos,
|
||||
proton_sarek: $proton_sarek,
|
||||
proton_em: $proton_em
|
||||
}' > "$WINE_METADATA_FILE"
|
||||
|
||||
if jq empty "$WINE_METADATA_FILE" 2>/dev/null; then
|
||||
print_ok "JSON файл создан успешно: $WINE_METADATA_FILE"
|
||||
else
|
||||
print_error "Ошибка создания JSON файла"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
select_wine_version() {
|
||||
if ! command -v jq &> /dev/null; then
|
||||
print_warning "Команда 'jq' не найдена. Невозможно отобразить список версий WINE/Proton."
|
||||
print_warning "Будет использована версия по умолчанию: $WH_WINE_USE"
|
||||
return
|
||||
fi
|
||||
local sha256_file="$DATA_PATH/sha256sum.list"
|
||||
[[ ! -f "$sha256_file" ]] && fatal "Файл с версиями WINE/Proton не найден: $sha256_file"
|
||||
|
||||
generate_wine_metadata
|
||||
WINE_METADATA_FILE="$WH_TMP_DIR/wine_metadata.json"
|
||||
[[ ! -f "$WINE_METADATA_FILE" ]] && fatal "Файл метаданных WINE не найден."
|
||||
|
||||
local arch_filter_jq
|
||||
if [[ "$WINEARCH" == "win64" ]]; then
|
||||
print_info "Фильтруем версии для 64-битного префикса..."
|
||||
# Для 64-битных префиксов показываем сборки с 'amd64', 'x86_64', 'wow64'
|
||||
# или те, у которых нет явного указания на 32-битную архитектуру.
|
||||
arch_filter_jq='select((.name | test("amd64|x86_64|wow64")) or (.name | test("i[3-6]86|x86(?!_64)") | not))'
|
||||
else # win32
|
||||
print_info "Фильтруем версии для 32-битного префикса..."
|
||||
# Для 32-битных префиксов показываем только сборки с явным указанием 32-битной архитектуры.
|
||||
arch_filter_jq='select(.name | test("i[3-6]86|x86(?!_64)"))'
|
||||
fi
|
||||
|
||||
local options=()
|
||||
local total_versions_found=0
|
||||
|
||||
# --- System ---
|
||||
local system_wine_display_name="system"
|
||||
if command -v wine &>/dev/null; then
|
||||
local system_wine_version
|
||||
system_wine_version=$(wine --version 2>/dev/null)
|
||||
[[ -n "$system_wine_version" ]] && system_wine_display_name="$system_wine_version"
|
||||
fi
|
||||
options+=("--- System ---")
|
||||
options+=("system")
|
||||
options+=("$system_wine_display_name")
|
||||
|
||||
# --- Other versions from JSON ---
|
||||
local group_keys
|
||||
mapfile -t group_keys < <(jq -r 'keys_unsorted | .[]' "$WINE_METADATA_FILE")
|
||||
|
||||
for key in "${group_keys[@]}"; do
|
||||
local group_versions
|
||||
mapfile -t group_versions < <(jq -r --arg key "$key" '.[$key] | .[] | '"$arch_filter_jq"' | .name' "$WINE_METADATA_FILE" | sort -V -r | uniq)
|
||||
# --- Other versions from sha256sum.list ---
|
||||
local current_group=""
|
||||
local group_versions=()
|
||||
|
||||
flush_group() {
|
||||
if [[ ${#group_versions[@]} -gt 0 ]]; then
|
||||
# Prettify the group name (e.g., "proton_ge" -> "Proton Ge")
|
||||
local pretty_key
|
||||
pretty_key=$(echo "$key" | tr '_' ' ' | sed -e "s/\b\(.\)/\u\1/g")
|
||||
|
||||
options+=("--- $pretty_key ---")
|
||||
options+=("${group_versions[@]}")
|
||||
IFS=$'\n' sorted_versions=($(sort -Vr <<<"${group_versions[*]}"))
|
||||
unset IFS
|
||||
options+=("${sorted_versions[@]}")
|
||||
((total_versions_found+=${#group_versions[@]}))
|
||||
group_versions=()
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
while IFS= read -r line; do
|
||||
if [[ "$line" =~ ^#+[[:space:]]([^#[:space:]]+)[[:space:]]#* ]]; then
|
||||
flush_group
|
||||
current_group="${BASH_REMATCH[1]}"
|
||||
# Отображаем только группы, которые являются сборками WINE или PROTON
|
||||
case "$current_group" in
|
||||
WINE|WINE_LG|PROTON_LG|PROTON_STEAM)
|
||||
local pretty_key=$(echo "$current_group" | tr '_' ' ' | sed -e "s/\b\(.\)/\u\1/g")
|
||||
options+=("--- $pretty_key ---")
|
||||
;;
|
||||
*)
|
||||
current_group=""
|
||||
;;
|
||||
esac
|
||||
elif [[ -n "$current_group" ]] && [[ "$line" =~ [a-f0-9]{64} ]]; then
|
||||
local filename=$(echo "$line" | awk '{print $2}')
|
||||
local version_name=${filename%.tar.xz}
|
||||
|
||||
if [[ "$WINEARCH" == "win64" ]]; then
|
||||
if [[ "$version_name" =~ (amd64|x86_64|wow64) ]] || ! [[ "$version_name" =~ i[3-6]86 ]]; then
|
||||
group_versions+=("$version_name")
|
||||
fi
|
||||
else # win32
|
||||
if [[ "$version_name" =~ i[3-6]86 ]]; then
|
||||
group_versions+=("$version_name")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done < "$sha256_file"
|
||||
flush_group
|
||||
|
||||
if [[ $total_versions_found -eq 0 ]]; then
|
||||
print_warning "Не найдено подходящих версий WINE/Proton для архитектуры $WINEARCH."
|
||||
@@ -1682,13 +1549,11 @@ select_wine_version() {
|
||||
return
|
||||
fi
|
||||
|
||||
# --- Пользовательское меню с разделением на группы и пустыми строками ---
|
||||
local selectable_options=("Отмена")
|
||||
local display_groups=()
|
||||
local current_group_items=()
|
||||
local choice_idx=0
|
||||
|
||||
# Помощник для переноса текущей группы элементов в основной массив display_groups
|
||||
flush_current_group() {
|
||||
if ((${#current_group_items[@]} > 0)); then
|
||||
# Объединяйте элементы с помощью уникального разделителя для последующего разделения
|
||||
@@ -1699,11 +1564,10 @@ select_wine_version() {
|
||||
|
||||
current_group_items+=(" 0) Отмена создания префикса")
|
||||
|
||||
# Обработка массива основных параметров для создания групп
|
||||
for opt in "${options[@]}"; do
|
||||
if [[ "$opt" == "---"* ]]; then
|
||||
flush_current_group
|
||||
display_groups+=("$opt") # Добавьте заголовок как отдельный элемент
|
||||
display_groups+=("$opt")
|
||||
else
|
||||
((choice_idx++))
|
||||
current_group_items+=(" ${choice_idx}) $opt")
|
||||
@@ -1714,17 +1578,14 @@ select_wine_version() {
|
||||
|
||||
print_info "Выберите версию WINE/Proton для $WINEARCH префикса:"
|
||||
|
||||
# Показывать группы одну за другой
|
||||
local first_block=true
|
||||
for group_data in "${display_groups[@]}"; do
|
||||
|
||||
if [[ "$group_data" == "---"* ]]; then
|
||||
if [[ "$first_block" = false ]]; then
|
||||
echo
|
||||
fi
|
||||
echo "$group_data"
|
||||
else
|
||||
# Это блок элементов для печати в столбцах
|
||||
local items_to_print=()
|
||||
IFS='@@@' read -r -a items_to_print <<< "$group_data"
|
||||
|
||||
@@ -1752,15 +1613,21 @@ select_wine_version() {
|
||||
done
|
||||
|
||||
while true; do
|
||||
echo
|
||||
local max_choice=$(( ${#selectable_options[@]} - 1 ))
|
||||
read -p "Введите номер (0-$max_choice): " user_choice
|
||||
read -p "Введите номер для выбора wine/proton (0-$max_choice): " user_choice
|
||||
if [[ "$user_choice" =~ ^[0-9]+$ ]] && (( user_choice >= 0 && user_choice <= max_choice )); then
|
||||
if [[ "$user_choice" == "0" ]]; then
|
||||
print_info "Создание префикса отменено."
|
||||
exit 0
|
||||
fi
|
||||
local selected_opt="${selectable_options[$user_choice]}"
|
||||
export WH_WINE_USE="$selected_opt"
|
||||
local selected_opt
|
||||
selected_opt="${selectable_options[$user_choice]}"
|
||||
if [[ "$selected_opt" == "$system_wine_display_name" ]]; then
|
||||
export WH_WINE_USE="system"
|
||||
else
|
||||
export WH_WINE_USE="$selected_opt"
|
||||
fi
|
||||
break
|
||||
else
|
||||
print_error "Неверный выбор. Введите число от 0 до $max_choice."
|
||||
@@ -2175,7 +2042,6 @@ case "$arg1" in
|
||||
create-prefix) create_prefix "$@" ;;
|
||||
remove-prefix) remove_prefix "$@" ;;
|
||||
create-base-pfx) create_base_pfx "$@" ;;
|
||||
generate-db) generate_wine_metadata "$@" ;;
|
||||
init-prefix) prepair_wine ; wait_wineserver ;;
|
||||
*)
|
||||
if [[ -f "$arg1" ]] ; then
|
||||
|
Reference in New Issue
Block a user