diff --git a/controller.py b/controller.py index 054f0d6c..4eb48038 100644 --- a/controller.py +++ b/controller.py @@ -8,9 +8,9 @@ from utils import getKeyByValue, isUniqueStrings, strPctToInt import argparse # Common -def callbackUpdateSoftware(): +def callbackUpdateSoftware(fnc=None): setMainWindowGeometry() - model.updateSoftware() + model.updateSoftware(restart=True, fnc=fnc) def callbackRestartSoftware(): setMainWindowGeometry() diff --git a/model.py b/model.py index 0f844182..6b97a918 100644 --- a/model.py +++ b/model.py @@ -256,35 +256,51 @@ class Model: @staticmethod def updateSoftware(restart:bool=True, func=None): - filename = 'VRCT.zip' - program_name = 'VRCT.exe' - folder_name = '_internal' - tmp_directory_name = 'tmp' - batch_name = 'update.bat' - current_directory = config.PATH_LOCAL + def updateSoftwareTask(): + filename = 'VRCT.zip' + program_name = 'VRCT.exe' + folder_name = '_internal' + tmp_directory_name = 'tmp' + batch_name = 'update.bat' + current_directory = config.PATH_LOCAL - try: - res = requests_get(config.GITHUB_URL) - assets = res.json()['assets'] - url = [i["browser_download_url"] for i in assets if i["name"] == filename][0] - with tempfile.TemporaryDirectory() as tmp_path: - res = requests_get(url, stream=True) - file_size = int(res.headers.get('content-length', 0)) - total_chunk = 0 - with open(os_path.join(tmp_path, filename), 'wb') as file: - for chunk in res.iter_content(chunk_size=1024*5): - file.write(chunk) - if isinstance(func, Callable): + try: + res = requests_get(config.GITHUB_URL) + assets = res.json()['assets'] + url = [i["browser_download_url"] for i in assets if i["name"] == filename][0] + with tempfile.TemporaryDirectory() as tmp_path: + res = requests_get(url, stream=True) + file_size = int(res.headers.get('content-length', 0)) + total_chunk = 0 + with open(os_path.join(tmp_path, filename), 'wb') as file: + for chunk in res.iter_content(chunk_size=1024*5): + file.write(chunk) total_chunk += len(chunk) - func(total_chunk/file_size) + if isinstance(func, Callable): + func(total_chunk/file_size) + print(f"downloaded {total_chunk}/{file_size}") - with ZipFile(os_path.join(tmp_path, filename)) as zf: - zf.extractall(os_path.join(current_directory, tmp_directory_name)) - copyfile(os_path.join(current_directory, folder_name, "batch", batch_name), os_path.join(current_directory, batch_name)) - command = [os_path.join(current_directory, batch_name), program_name, folder_name, tmp_directory_name, str(restart)] - Popen(command, cwd=current_directory) - except Exception: - webbrowser.open(config.BOOTH_URL, new=2, autoraise=True) + with ZipFile(os_path.join(tmp_path, filename)) as zf: + total_files = len(zf.infolist()) + extracted_files = 0 + for file_info in zf.infolist(): + extracted_files += 1 + zf.extract(file_info, os_path.join(current_directory, tmp_directory_name)) + if isinstance(func, Callable): + func(extracted_files / total_files) + print(f"extracted {extracted_files}/{total_files}") + + copyfile(os_path.join(current_directory, folder_name, "batch", batch_name), os_path.join(current_directory, batch_name)) + command = [os_path.join(current_directory, batch_name), program_name, folder_name, tmp_directory_name, str(restart)] + Popen(command, cwd=current_directory) + except Exception as e: + import traceback + with open('error.log', 'a') as f: + traceback.print_exc(file=f) + webbrowser.open(config.BOOTH_URL, new=2, autoraise=True) + th_update_software = threadFnc(updateSoftwareTask) + th_update_software.daemon = True + th_update_software.start() @staticmethod def reStartSoftware():