Skip to content

Instantly share code, notes, and snippets.

@JoeBlakeB
Created August 2, 2020 11:46
Show Gist options
  • Select an option

  • Save JoeBlakeB/2b51b8deefcf836a8ebe818a23b16fb0 to your computer and use it in GitHub Desktop.

Select an option

Save JoeBlakeB/2b51b8deefcf836a8ebe818a23b16fb0 to your computer and use it in GitHub Desktop.
Minecraft Assets Extractor
#!/usr/bin/env python3
#
# Minecraft Assets Extractor
# by JoeBlakeB
# github.com/JoeBlakeB
#
# Example command:
# Extract.py C:\Users\<user>\AppData\Roaming\.minecraft\assets "C:\Users\<user>\Documents\Minecraft Assets" 1.16
#
import json
import os
import sys
import shutil
if "help" in sys.argv or "-help" in sys.argv or "--help" in sys.argv:
print("Minecraft Assets Extractor")
print(" by JoeBlakeB (github.com/JoeBlakeB)")
print("Interactive Mode:")
print(" " + sys.argv[0])
print("CLI Mode:")
print(" Current Assets Dir - " + sys.argv[0] + " [Version]")
print(" Specify Assets Dir - " + sys.argv[0] + " [AssetsDir] [Version]")
print(" Specify All Dirs - " + sys.argv[0] + " [AssetsDir] [ExtractDir] [Version]")
exit()
if len(sys.argv) >= 2:
if len(sys.argv) == 2:
assetsDir = "."
else:
assetsDir = sys.argv[1]
else:
assetsDir = input("Where is the assets dir? (Default: .) ")
if assetsDir == "":
assetsDir = "."
if len(sys.argv) >= 2:
if len(sys.argv) < 4:
extractDir = "./Extracted/"
else:
extractDir = sys.argv[2]
else:
extractDir = input("Where do you want to extract to? (Default: ./Extracted/) ")
if extractDir == "":
extractDir = "./Extracted/"
try:
versions = os.listdir(os.path.join(assetsDir + "/indexes"))
except FileNotFoundError as e:
print(e)
exit()
if len(sys.argv) >= 2:
version = sys.argv[-1]
else:
version = input("What version do you want to extract? ")
if version[:-5] != ".json":
version += ".json"
if version not in versions:
print("Could not find version", version)
exit()
indexFile = open(os.path.join(assetsDir, "indexes", version))
index = indexFile.read()
indexFile.close()
objects = json.loads(index)["objects"]
for file in list(objects.keys()):
fileHash = objects[file]["hash"]
fileHash = os.path.join(assetsDir, "objects/" + fileHash[:2] + "/" + fileHash)
os.makedirs(os.path.join(extractDir, *file.split("/")[:-1]), exist_ok=True)
shutil.copyfile(fileHash, os.path.join(extractDir, file))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment