Skip to content

Instantly share code, notes, and snippets.

@tildejustin
Last active October 23, 2025 16:01
Show Gist options
  • Select an option

  • Save tildejustin/357e37767de5e608fdbaabe2ddf5ca98 to your computer and use it in GitHub Desktop.

Select an option

Save tildejustin/357e37767de5e608fdbaabe2ddf5ca98 to your computer and use it in GitHub Desktop.
import csv
import json
import os
import re
import requests
from packaging.version import Version
version_manifest_url = "https://launchermeta.mojang.com/mc/game/version_manifest.json"
libraries = {}
library_names = set()
def main():
version_manifest_filename = version_manifest_url.split("/")[-1]
if not os.path.exists(version_manifest_filename):
with open(version_manifest_filename, "wb") as f:
f.write(requests.get(version_manifest_url).content)
with open("version_manifest.json", "r") as f:
version_manifest: dict = json.load(f)
if not os.path.exists("versions"):
os.makedirs("versions")
for version in version_manifest["versions"]:
game_version: str = version.get("id")
id_filename = f"versions/{game_version}.json"
if not os.path.exists(id_filename) and re.match(r"^\d.\d{1,2}(.(\d){1,2})?$", game_version):
with open(id_filename, "wb") as f:
f.write(requests.get(version.get("url")).content)
for file in os.listdir("versions"):
with open(os.path.join("versions", file), "r") as f:
info: dict = json.load(f)
libs = info.get("libraries")
version_libs = {}
for lib in libs:
package = lib.get("name")
rules = lib.get("rules")
package_name = package.split(":")[1]
if len(package.split(":")) > 3:
package_name += "-" + package.split(":")[3]
if rules is not None and not len(package.split(":")) > 3:
for rule in rules:
if rule.get("os") is not None:
package_name += "-"
os_name = rule.get("os").get("name")
if rule.get("action") == "disallow":
package_name += "!"
package_name += os_name
library_names.add(package_name)
version_string = package.split(":")[2]
version_libs[package_name] = version_string
libraries[info.get("id")] = version_libs
library_names_list = list(library_names)
library_names_list.sort()
with open("libraries.csv", "w", newline="") as output:
csv_writer = csv.writer(output)
csv_writer.writerow(["version"] + library_names_list)
sorted_versions = list(libraries.keys())
sorted_versions.sort(key=Version)
for version in sorted_versions:
libs = libraries[version]
csv_writer.writerow([version] + [libs.get(lib) for lib in library_names_list])
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment