Files
minecraftmodpackinstaller/main.py

102 lines
4.4 KiB
Python

import os
import shutil
import requests
import zipfile
from io import BytesIO
from pathlib import Path
# Minecraft installation folder.
minecraft_dir = os.path.join(os.getenv('APPDATA'), ".minecraft")
# Forge variables.
default_forge_version = "1.12.2-forge-14.23.5.2859"
forge_version = input(f"Enter Forge version (default: {default_forge_version}), leave empty to choose default: ") or default_forge_version
forge_dir = os.path.join(minecraft_dir, f"versions/{forge_version}")
forge_url = f"https://git.jisoonet.com/publicprojects/{forge_version}/-/archive/main/{forge_version}-main.zip"
# Forge libraries variables.
forge_libraries_version = forge_version.replace("forge-", "")
forge_libraries_dir = os.path.join(minecraft_dir, f"libraries/net/minecraftforge/forge/{forge_libraries_version}")
forge_libraries_url = f"https://git.jisoonet.com/publicprojects/{forge_libraries_version}/-/archive/main/{forge_libraries_version}-main.zip"
# Backup folder for mods.
mods_backup_dir = os.path.join(minecraft_dir, "mods-backup")
# Modpack variables.
default_modpack_name = "apocaz-modpack"
modpack_name = input(f"Enter Modpack name (default: {default_modpack_name}), leave empty to choose default: ") or default_modpack_name
modpack_dir = os.path.join(minecraft_dir, "mods")
modpack_url = f"https://git.jisoonet.com/publicprojects/{modpack_name}/-/archive/main/{modpack_name}-main.zip"
# Function to check for the prescence of Minecraft installation folder.
def check_minecraft_installation(minecraft_dir):
print("Checking for existing Minecraft installation...")
if not Path(minecraft_dir).exists():
print("Error: Minecraft not found. Please install Minecraft first.")
else:
print("Minecraft is already installed.")
# Installs forge files and places them in the correct version folder.
def install_forge(forge_dir, forge_url):
print("Checking for existing Forge installation...")
if not Path(forge_dir).exists():
print("Forge not found, beginning installation...")
os.makedirs(forge_dir)
try:
print("Downloading Forge...")
response = requests.get(forge_url)
if response.status_code == 200:
with zipfile.ZipFile(BytesIO(response.content)) as z:
print("Extracting Forge...")
common_prefix = os.path.commonprefix(z.namelist())
for file_info in z.infolist():
target_path = os.path.join(forge_dir, file_info.filename[len(common_prefix):])
if file_info.filename.endswith('/'):
os.makedirs(target_path, exist_ok=True)
else:
with z.open(file_info) as source, open(target_path, 'wb') as target:
shutil.copyfileobj(source, target)
print("Forge installed successfully.")
else:
print("Error downloading Forge. Please check the URL or your internet connection.")
except Exception as e:
print(f"An error occurred during Forge installation: {e}")
else:
print("Forge is already installed.")
# Installs forge files and places them in the correct version folder.
# Backups the mods from the mods folder to the backup folder.
def backup_mods(modpack_dir, mods_backup_dir):
print("Backing up existing mods...")
if Path(modpack_dir).exists():
os.makedirs(mods_backup_dir, exist_ok=True)
for item in os.listdir(modpack_dir):
source_path = os.path.join(modpack_dir, item)
destination_path = os.path.join(mods_backup_dir, item)
if not os.path.exists(destination_path):
shutil.move(source_path, destination_path)
else:
os.remove(source_path)
print(f"Duplicate found, not moving '{item}'.")
print(f"Mods backed up to '{mods_backup_dir}'.")
else:
print("No mods directory found. No backup required.")
# Entry point of the script.
def main():
try:
check_minecraft_installation(minecraft_dir)
install_forge(forge_dir, forge_url)
backup_mods(modpack_dir, mods_backup_dir)
except KeyboardInterrupt:
print("\033[91m\nSession ended by user.\033[0m")
except Exception as e:
print(f"\033[91m\nAn unexpected error occurred: {e}\033[0m")
finally:
input("\033[94mPress Enter to exit...\033[0m")
if __name__ == "__main__":
main()