diff --git a/src/engines/blender/blender_downloader.py b/src/engines/blender/blender_downloader.py index 7f2b391..b73029f 100644 --- a/src/engines/blender/blender_downloader.py +++ b/src/engines/blender/blender_downloader.py @@ -8,8 +8,7 @@ from src.engines.blender.blender_engine import Blender from src.engines.core.base_downloader import EngineDownloader from src.utilities.misc_helper import current_system_os, current_system_cpu -# url = "https://download.blender.org/release/" -url = "https://ftp.nluug.nl/pub/graphics/blender/release/" # much faster mirror for testing +url = "https://download.blender.org/release/" logger = logging.getLogger() supported_formats = ['.zip', '.tar.xz', '.dmg'] diff --git a/src/engines/engine_manager.py b/src/engines/engine_manager.py index 25682e2..2bc1570 100644 --- a/src/engines/engine_manager.py +++ b/src/engines/engine_manager.py @@ -243,6 +243,27 @@ class EngineManager: threads.append(thread) thread.start() + @classmethod + def update_engine(cls, engine_class): + logger.debug(f"Checking for updates to {engine_class.name()}") + latest_version = engine_class.downloader().find_most_recent_version() + + if not latest_version: + logger.warning(f"Could not find most recent version of {engine_class.name()} to download") + return + + version_num = latest_version.get('version') + if cls.is_version_downloaded(engine_class.name(), version_num): + logger.debug(f"Latest version of {engine_class.name()} ({version_num}) already downloaded") + return + + # download the engine + logger.info(f"Downloading latest version of {engine_class.name()} ({version_num})...") + download_job = cls.download_engine(engine=engine_class.name(), version=version_num, background=True) + + return {"latest": latest_version, "thread": download_job, "name": engine_class.name()} + + @classmethod def create_worker(cls, renderer, input_path, output_path, engine_version=None, args=None, parent=None, name=None): diff --git a/src/ui/settings_window.py b/src/ui/settings_window.py index 6b1cded..7305c68 100644 --- a/src/ui/settings_window.py +++ b/src/ui/settings_window.py @@ -10,12 +10,13 @@ from PyQt6.QtCore import Qt, QSettings from PyQt6.QtGui import QIcon from PyQt6.QtWidgets import QApplication, QMainWindow, QListWidget, QListWidgetItem, QStackedWidget, QVBoxLayout, \ QWidget, QLabel, QCheckBox, QLineEdit, \ - QComboBox, QPushButton, QHBoxLayout, QGroupBox, QTableWidget, QAbstractItemView, QTableWidgetItem, QHeaderView + QComboBox, QPushButton, QHBoxLayout, QGroupBox, QTableWidget, QAbstractItemView, QTableWidgetItem, QHeaderView, \ + QMessageBox from api.server_proxy import RenderServerProxy from engines.engine_manager import EngineManager from utilities.config import Config -from utilities.misc_helper import launch_url +from utilities.misc_helper import launch_url, system_safe_path from version import APP_AUTHOR, APP_NAME settings = QSettings(APP_AUTHOR, APP_NAME) @@ -268,6 +269,35 @@ class SettingsWindow(QMainWindow): launch_url(engine_info['path']) def check_for_new_engines(self): + + if not EngineManager.engines_path: # fix issue where sometimes path was not set + EngineManager.engines_path = system_safe_path( + os.path.join(os.path.join(os.path.expanduser(Config.upload_folder), + 'engines'))) + + results = [] + for engine in EngineManager.downloadable_engines(): + if settings.value(f'engine_download-{engine.name()}', False): + update_result = EngineManager.update_engine(engine) + if update_result: + results.append(update_result) + + if results: + for result in results: + msg_box = QMessageBox() + msg_box.setWindowTitle(f"{result['name']} {result['version']} Available") + msg_box.setText(f"A new version of {result['name']} is available ({result['version']}). It will begin downloading now.") + msg_box.setIcon(QMessageBox.Icon.Information) + msg_box.setStandardButtons(QMessageBox.StandardButton.Ok) + msg_box.exec() + else: + msg_box = QMessageBox() + msg_box.setWindowTitle("No Updates Available") + msg_box.setText("All your render engines are up-to-date.") + msg_box.setIcon(QMessageBox.Icon.Information) + msg_box.setStandardButtons(QMessageBox.StandardButton.Ok) + msg_box.exec() + settings.setValue("engines_last_update_time", datetime.now().isoformat()) self.update_last_checked_label()