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/interface/gui.py b/src/core/interface/gui.py index 5c6df8f..54d32bd 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): @@ -1041,9 +1041,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) diff --git a/src/core/network/libtorrent_int.py b/src/core/network/libtorrent_int.py index 1af013e..7985087 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): 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,14 +88,31 @@ def add_download(magnet_uri): del state.active_downloads[magnet_uri] try: - magnetdl = lt.parse_magnet_uri(magnet_uri) - magnetdl.save_path = state.download_path - consoleLog(magnetdl.save_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 = state.download_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)) @@ -172,4 +202,3 @@ def update_bound_interface(): settings = { "outgoing_interfaces": state.bound_interface } state.dl_session.apply_settings(settings) -