Skip to content

Instantly share code, notes, and snippets.

@goaaats
Last active August 22, 2020 15:33
Show Gist options
  • Save goaaats/9317ee23d406fa66f29bb6bddf53b535 to your computer and use it in GitHub Desktop.
Save goaaats/9317ee23d406fa66f29bb6bddf53b535 to your computer and use it in GitHub Desktop.
Linux updater for yuzu Early Access
import http.client
import argparse
import os
import base64
import json
import re
import tarfile
import subprocess
def str2bool(v):
if isinstance(v, bool):
return v
if v.lower() in ('yes', 'true', 't', 'y', '1'):
return True
elif v.lower() in ('no', 'false', 'f', 'n', '0'):
return False
else:
raise argparse.ArgumentTypeError('Boolean value expected.')
parser = argparse.ArgumentParser(description='Downloads and builds yuzu Early Access on linux.')
parser.add_argument('--token', help='The base64 authentication token from https://profile.yuzu-emu.org/. If not provided, the environment variable YUZU_TOKEN will be used.', default=os.getenv('YUZU_TOKEN'))
parser.add_argument('--dry', type=str2bool, help="Don't build yuzu, just download it.", nargs='?', const=True, default=False)
args = parser.parse_args()
if not args.token:
print("ERROR: No token provided. Please use -h to see possible values.")
raise SystemExit
print(args.token)
rawToken = base64.b64decode(args.token + "==").decode().split(":")
userName = rawToken[0]
auth = rawToken[1]
print("Username: " + userName)
print("Token:" + auth)
conn = http.client.HTTPSConnection("api.yuzu-emu.org")
### GET JWT TOKEN
payload = ""
headers = {
'user-agent': "liftinstall (j-selby)",
'x-username': userName,
'x-token': auth
}
conn.request("POST", "/jwt/installer/", payload, headers)
res = conn.getresponse()
data = res.read()
jwt = data.decode("utf-8")
### GET RELEASES LIST
payload = ""
headers = {
'user-agent': "liftinstall (j-selby)"
}
conn.request("GET", "/downloads/earlyaccess", payload, headers)
res = conn.getresponse()
data = res.read()
release = json.loads(data.decode("utf-8"))
print(release)
versionFile = open("ea-rev", "r+")
localVer = versionFile.read()
if (localVer == str(release["version"])):
print("yuzu Early Access is up-to-date.")
raise SystemExit
print("New yuzu version found: " + str(release["version"]))
versionFile.close()
filePattern = re.compile("^yuzu-windows-msvc-source-[0-9]*-[0-9a-f]*.tar.xz$")
for releaseEntry in release["files"]:
if filePattern.match(releaseEntry["name"]):
print("Downloading " + releaseEntry["url"])
payload = ""
headers = {
'user-agent': "liftinstall (j-selby)",
'authorization': "Bearer " + jwt
}
conn.request("GET", releaseEntry["url"], payload, headers)
res = conn.getresponse()
data = res.read()
releaseFile = open(releaseEntry["name"], "wb+")
releaseFile.write(data)
releaseFile.close()
print("Extracting...")
tar = tarfile.open(releaseEntry["name"], "r:xz")
tar.extractall("source")
tar.close()
os.remove(releaseEntry["name"])
if not args.dry:
p = subprocess.Popen(["cmake --build ."], cwd="source")
p.wait()
versionFile = open("ea-rev", "w")
versionFile.write(str(release["version"]))
versionFile.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment