diff --git a/winehelper b/winehelper index a0b192c..9962fa3 100755 --- a/winehelper +++ b/winehelper @@ -811,10 +811,48 @@ init_wine_ver () { export WINEDIR="$WH_DIST_DIR/$WH_WINE_USE" if [[ ! -d "$WINEDIR" ]] ; then - local wine_package="$WH_TMP_DIR/$WH_WINE_USE.tar.xz" - try_download "$CLOUD_URL/$WH_WINE_USE.tar.xz" "$wine_package" check256sum + local download_url wine_package_name wine_package check_sum_arg + WINE_METADATA_FILE="$WH_TMP_DIR/wine_metadata.json" + + # Сначала пытаемся сформировать 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" unpack "$wine_package" "$WH_DIST_DIR/" try_remove_file "$wine_package" + + # Handle Proton's 'files' subdirectory structure by moving contents up + if [[ -d "$WINEDIR/files" ]]; then + print_info "Обнаружена структура каталогов Proton, исправляем пути..." + mv "$WINEDIR"/files/* "$WINEDIR/" + rmdir "$WINEDIR/files" + fi fi [[ ! -f "$WINEDIR/version" ]] && echo "$WH_WINE_USE" > "$WINEDIR/version" @@ -1589,6 +1627,38 @@ generate_wine_metadata () { fi } +select_wine_version() { + if ! command -v jq &> /dev/null; then + print_warning "Команда 'jq' не найдена. Невозможно отобразить список версий WINE/Proton." + print_warning "Будет использована версия по умолчанию: $WH_WINE_USE" + return + fi + + generate_wine_metadata + WINE_METADATA_FILE="$WH_TMP_DIR/wine_metadata.json" + [[ ! -f "$WINE_METADATA_FILE" ]] && fatal "Файл метаданных WINE не найден." + + # Создание единого, отсортированного списка версий + local versions=() + mapfile -t versions < <(jq -r '.[] | .[] | .name' "$WINE_METADATA_FILE" | sort -V -r | uniq) + + local options=("system" "${versions[@]}") + + print_info "Выберите версию WINE/Proton:" + PS3="Ваш выбор: " + select opt in "Отмена" "${options[@]}"; do + if [[ "$REPLY" == "1" ]] || [[ "$opt" == "Отмена" ]]; then + print_info "Создание префикса отменено." + exit 0 + elif [[ -n "$opt" ]]; then + export WH_WINE_USE="$opt" + break + else + print_error "Неверный выбор. Попробуйте еще раз." + fi + done +} + create_prefix() { print_info "Существующие префиксы:" local prefixes=() @@ -1636,6 +1706,8 @@ create_prefix() { *) fatal "Неверный выбор. Операция отменена." ;; esac + select_wine_version + print_info "Выберите тип создаваемого префикса:" echo " 0) Отмена создания префикса" echo " 1) С рекомендуемыми библиотеками (по умолчанию)"