From d3d7a9d2ac5e99232b39943c453a007bd51aab5e Mon Sep 17 00:00:00 2001 From: KeksNino Date: Tue, 10 Mar 2026 21:35:03 +0100 Subject: [PATCH 1/2] fix: check free disk space before downloading to prevent silent failure after starting dl also add "(experimental)" to image path in settings --- src/core/interface/dialogs/settings.py | 2 +- src/core/network/libtorrent_int.py | 44 ++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/core/interface/dialogs/settings.py b/src/core/interface/dialogs/settings.py index d6de321..58ae464 100644 --- a/src/core/interface/dialogs/settings.py +++ b/src/core/interface/dialogs/settings.py @@ -139,7 +139,7 @@ def settings_dialog(self): image_path_layout = QHBoxLayout() image_path = QLineEdit() - image_path_layout.addWidget(QLabel("Image Path (requires restart):")) + image_path_layout.addWidget(QLabel("Image Path (requires restart, experimental):")) image_path_layout.addWidget(image_path) image_path_container.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) image_path_container.setLayout(image_path_layout) diff --git a/src/core/network/libtorrent_int.py b/src/core/network/libtorrent_int.py index ba794ef..82b3e05 100644 --- a/src/core/network/libtorrent_int.py +++ b/src/core/network/libtorrent_int.py @@ -1,5 +1,7 @@ import time import os +import platform +import ctypes from core.utils.general.wrappers import run_thread from core.network.interface import get_interface_ip import threading @@ -11,6 +13,15 @@ from core.utils.logging.logs import consoleLog global loop_running loop_running = False +def get_free_space_mb(dirname): + if platform.system() == 'Windows': + free_bytes = ctypes.c_ulonglong(0) + ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(dirname), None, None, ctypes.pointer(free_bytes)) + return free_bytes.value + else: + st = os.statvfs(dirname) + return st.f_bavail * st.f_frsize + def init_session(): if state.dl_session is not None: return @@ -51,11 +62,13 @@ def add_download(magnet_uri, dl_path=state.download_path): init_session() + free_space = get_free_space_mb(state.download_path) + if magnet_uri in state.active_downloads: try: handle = state.active_downloads[magnet_uri] status = handle.status() - + if status.has_metadata: filepath = os.path.join(status.save_path, status.name) @@ -75,13 +88,31 @@ def add_download(magnet_uri, dl_path=state.download_path): del state.active_downloads[magnet_uri] try: - magnetdl = lt.parse_magnet_uri(magnet_uri) - magnetdl.save_path = dl_path - download = state.dl_session.add_torrent(magnetdl) + params = lt.parse_magnet_uri(magnet_uri) + params.save_path = "." + + handle = state.dl_session.add_torrent(params) + + while not handle.has_metadata(): + time.sleep(1) + + total_size = handle.get_torrent_info().total_size() + + if free_space > total_size: + magnetdl = lt.parse_magnet_uri(magnet_uri) + magnetdl.save_path = dl_path + download = state.dl_session.add_torrent(magnetdl) + else: + download = None + state.dl_session.remove_torrent(handle) + consoleLog("Not enough free space to download this item.") + return False + except Exception as e: - consoleLog(f"Failed to add torrent: {e}") + consoleLog(f"Failed to add torrent or fetch info: {e}") return False - state.active_downloads[magnet_uri] = download + if download: + state.active_downloads[magnet_uri] = download consoleLog(f"Added {magnet_uri} to downloads") run_thread(threading.Thread(target=dl_status_loop)) @@ -171,4 +202,3 @@ def update_bound_interface(): settings = { "outgoing_interfaces": state.bound_interface } state.dl_session.apply_settings(settings) - From c3efa39b091d864be60ff6035af5714976bf4724 Mon Sep 17 00:00:00 2001 From: KeksNino Date: Tue, 10 Mar 2026 21:58:21 +0100 Subject: [PATCH 2/2] rename cancel download to remove from list in downloadlist context menu --- src/core/interface/gui.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/interface/gui.py b/src/core/interface/gui.py index 06b3c77..9be2879 100644 --- a/src/core/interface/gui.py +++ b/src/core/interface/gui.py @@ -680,7 +680,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): self.context_menu = QtWidgets.QMenu(self) self.context_menu.addAction("Open Containing Folder", self.openFolderAction) self.context_menu.addAction("Copy Magnet URI", self.copyMagnetURIAction) - self.context_menu.addAction("Cancel Download", self.cancelDownloadAction) + self.context_menu.addAction("Remove from list", self.cancelDownloadAction) self.context_menu.addAction("Delete File", self.deleteFileAction) def _create_tracker_table(self): @@ -1038,9 +1038,9 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): consoleLog(f"Deleted files for: {magnetdl.status().name}", True) else: import shutil - del state.active_downloads[magnet_link] remove_download_log(magnet_link) shutil.rmtree(download_path) + del state.active_downloads[magnet_link] consoleLog(f"Deleted files for: {magnetdl.status().name}", True) except Exception as e: consoleLog(f"Error deleting files: {e}", True)