From 8d1b3ba68f84a0b7e2dc7528b669f35914c7b0c9 Mon Sep 17 00:00:00 2001 From: Vxrtrauter <101264710+Vxrtrauter@users.noreply.github.com> Date: Sun, 8 Mar 2026 12:00:00 +0100 Subject: [PATCH] feat: implement seeding functionality and enhance download management with seeded magnets tracking --- src/core/network/libtorrent_int.py | 18 ++++++++++++++++++ src/core/network/libtorrent_misc.py | 2 +- src/core/utils/data/state.py | 1 + src/core/utils/logging/loghandler.py | 3 ++- src/core/utils/network/download.py | 7 ++++++- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/core/network/libtorrent_int.py b/src/core/network/libtorrent_int.py index 801a890..4ed623a 100644 --- a/src/core/network/libtorrent_int.py +++ b/src/core/network/libtorrent_int.py @@ -84,6 +84,24 @@ def add_download(magnet_uri, dl_path=state.download_path): return True +def add_seed(magnet_uri, file_path): + if state.active_downloads is None: + state.active_downloads = {} + + init_session() + + if magnet_uri in state.active_downloads: + consoleLog("Already seeding this torrent") + return False + + magnetdl = lt.parse_magnet_uri(magnet_uri) + magnetdl.save_path = os.path.dirname(file_path) + + handle = state.dl_session.add_torrent(magnetdl) + state.active_downloads[magnet_uri] = handle + state.seeded_magnets.add(magnet_uri) + return True + def dl_status_loop(): global loop_running diff --git a/src/core/network/libtorrent_misc.py b/src/core/network/libtorrent_misc.py index 8a3ccca..54a06b4 100644 --- a/src/core/network/libtorrent_misc.py +++ b/src/core/network/libtorrent_misc.py @@ -51,7 +51,7 @@ def update_log(shutdown_event): status = magnetdl.status() - if status.state == lt.torrent_status.seeding and magnet_uri not in updated: + if status.state == lt.torrent_status.seeding and magnet_uri not in updated and magnet_uri not in state.seeded_magnets: consoleLog(f"Marking {status.name} as completed") info_hash = str(status.info_hash) update_download_completed_by_hash(info_hash, True) diff --git a/src/core/utils/data/state.py b/src/core/utils/data/state.py index ee5fa8c..1e33a70 100644 --- a/src/core/utils/data/state.py +++ b/src/core/utils/data/state.py @@ -30,6 +30,7 @@ class AppState(QObject): self.settings_path: str = "" self.dl_session: Any = None self.active_downloads: Dict = {} + self.seeded_magnets: set = set() self.window_transparency: bool = False self.interfaces: List = [] self.active_interfaces: List = [] diff --git a/src/core/utils/logging/loghandler.py b/src/core/utils/logging/loghandler.py index 9569a20..b48c81d 100644 --- a/src/core/utils/logging/loghandler.py +++ b/src/core/utils/logging/loghandler.py @@ -1,5 +1,5 @@ from core.utils.logging.logs import consoleLog, remove_download_log -from core.utils.network.download import run_download_direct +from core.utils.network.download import run_download_direct, seed_magnet import os @@ -22,6 +22,7 @@ def check_downloads(downloads): for download in downloads: if os.path.exists(download.path): consoleLog(f"Existing Download: {download.title}") + seed_magnet(download.magnet_uri, download.path) else: consoleLog(f"Inexistent Download: {download.title}") remove_download_log(download.magnet_uri) diff --git a/src/core/utils/network/download.py b/src/core/utils/network/download.py index 79479d4..35f94d0 100644 --- a/src/core/utils/network/download.py +++ b/src/core/utils/network/download.py @@ -4,6 +4,7 @@ from core.utils.data.tracker import get_magnet_link from core.network.libtorrent_wrapper import add_download from core.utils.general.wrappers import run_thread from core.utils.logging.logs import add_download_log +from core.network.libtorrent_int import add_seed import threading @@ -25,4 +26,8 @@ def run_download(item, posts, post_titles): def run_download_direct(magnet_uri): consoleLog(f"Direct download: {magnet_uri[:60]}") add_download(magnet_uri) - add_download_log("Direct Download", "", magnet_uri, False) \ No newline at end of file + add_download_log("Direct Download", "", magnet_uri, False) + +def seed_magnet(magnet_uri, file_path): + consoleLog(f"Seeding: {magnet_uri[:60]}") + add_seed(magnet_uri, file_path) \ No newline at end of file