Spaces:
No application file
No application file
| import gradio as gr | |
| import subprocess | |
| import os | |
| import shutil | |
| import zipfile | |
| def build_minecraft_mod(zip_file): | |
| """ | |
| Автоматически собирает мод для Minecraft из zip-файла, используя Gradle. | |
| Args: | |
| zip_file: Объект Gradio File, представляющий загруженный zip-файл. | |
| Returns: | |
| (str, str): Кортеж, содержащий путь к собранному jar-файлу мода (или None, если сборка не удалась) | |
| и сообщения stdout и stderr процесса сборки. Если zip-файл невалидный, | |
| возвращается (None, "Invalid zip file or missing build.gradle"). | |
| """ | |
| try: | |
| # 1. Распаковка zip-файла во временную директорию | |
| temp_dir = "temp_mod_dir" | |
| if os.path.exists(temp_dir): | |
| shutil.rmtree(temp_dir) # Удаляем, если директория уже существует | |
| os.makedirs(temp_dir) | |
| with zipfile.ZipFile(zip_file.name, 'r') as zip_ref: | |
| zip_ref.extractall(temp_dir) | |
| # 2. Поиск build.gradle | |
| gradle_file_path = os.path.join(temp_dir, "build.gradle") | |
| gradlew_file_path = os.path.join(temp_dir, "gradlew") # Check for gradlew | |
| gradlew_bat_file_path = os.path.join(temp_dir, "gradlew.bat") #check for gradlew.bat (windows) | |
| if not os.path.exists(gradle_file_path): | |
| # Check for a subdirectory containing build.gradle | |
| found_gradle = False | |
| for root, _, files in os.walk(temp_dir): | |
| if "build.gradle" in files: | |
| gradle_file_path = os.path.join(root, "build.gradle") | |
| temp_dir = root # update temp_dir to be the directory with build.gradle! Very important. | |
| gradlew_file_path = os.path.join(temp_dir, "gradlew") | |
| gradlew_bat_file_path = os.path.join(temp_dir, "gradlew.bat") | |
| found_gradle = True | |
| break | |
| if not found_gradle: | |
| shutil.rmtree("temp_mod_dir") # Clean up | |
| return None, "Invalid zip file or missing build.gradle" | |
| # 3. Сборка мода с помощью Gradle | |
| if os.path.exists(gradlew_file_path): | |
| command = [gradlew_file_path, "build"] # Use gradlew | |
| elif os.path.exists(gradlew_bat_file_path): | |
| command = [gradlew_bat_file_path, "build"] # Use gradlew.bat (windows) | |
| else: | |
| command = ["gradle", "build"] # Use the system's gradle command | |
| process = subprocess.Popen(command, cwd=temp_dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
| stdout, stderr = process.communicate() | |
| stdout_str = stdout.decode("utf-8") | |
| stderr_str = stderr.decode("utf-8") | |
| # 4. Поиск собранного JAR файла | |
| build_libs_dir = os.path.join(temp_dir, "build", "libs") | |
| jar_file_path = None | |
| if os.path.exists(build_libs_dir): | |
| for filename in os.listdir(build_libs_dir): | |
| if filename.endswith(".jar") and not filename.endswith("-sources.jar") and not filename.endswith("-dev.jar"): #look for compiled jar not sources or dev | |
| jar_file_path = os.path.join(build_libs_dir, filename) | |
| break | |
| # 5. Clean up: remove temp dir | |
| shutil.rmtree("temp_mod_dir") | |
| return jar_file_path, stdout_str + "\n" + stderr_str | |
| except Exception as e: | |
| if os.path.exists("temp_mod_dir"): # Make sure to cleanup if any error occurred. | |
| shutil.rmtree("temp_mod_dir") | |
| return None, f"An error occurred: {e}" | |
| # Gradio Interface | |
| iface = gr.Interface( | |
| fn=build_minecraft_mod, | |
| inputs=gr.File(label="Upload Mod ZIP File"), | |
| outputs=[ | |
| gr.File(label="Built Mod JAR File"), | |
| gr.Textbox(label="Build Output", lines=10) | |
| ], | |
| title="Minecraft Mod Auto-Builder", | |
| description="Upload a zip file containing your Minecraft mod source code (with a build.gradle file), and this tool will automatically build it using Gradle.", | |
| ) | |
| iface.launch() |