From 53b2bb912e8d8442e727ebce639e409c4a0b40d6 Mon Sep 17 00:00:00 2001 From: Vxrtrauter Date: Thu, 9 Oct 2025 16:42:18 +0200 Subject: [PATCH] INCOMPLETE, DONT PUSH: refactor: reorganize state management and update import paths across modules and start changing json parsing --- core/data/scrapers/rutracker.py | 2 +- core/data/scrapers/uztracker.py | 2 +- core/interface/gui.py | 53 ++++++++++++++----------------- core/network/aria2_integration.py | 2 +- core/utils/__init__.py | 0 core/utils/{ => data}/state.py | 0 core/utils/{ => data}/tracker.py | 5 +-- core/utils/network/download.py | 17 ++++++++++ core/utils/network/jsonhandler.py | 10 ++++++ core/utils/settings.py | 2 +- core/utils/wrappers.py | 2 ++ main.py | 13 ++++---- 12 files changed, 65 insertions(+), 43 deletions(-) create mode 100644 core/utils/__init__.py rename core/utils/{ => data}/state.py (100%) rename core/utils/{ => data}/tracker.py (95%) create mode 100644 core/utils/network/download.py create mode 100644 core/utils/network/jsonhandler.py create mode 100644 core/utils/wrappers.py diff --git a/core/data/scrapers/rutracker.py b/core/data/scrapers/rutracker.py index 163a946..b40937e 100644 --- a/core/data/scrapers/rutracker.py +++ b/core/data/scrapers/rutracker.py @@ -1,5 +1,5 @@ import requests -from core.utils.state import state +from core.utils.data.state import state def scrape_rutracker(search_text): diff --git a/core/data/scrapers/uztracker.py b/core/data/scrapers/uztracker.py index 3a16f0a..00cf00f 100644 --- a/core/data/scrapers/uztracker.py +++ b/core/data/scrapers/uztracker.py @@ -2,7 +2,7 @@ import requests import asyncio import aiohttp from bs4 import BeautifulSoup -from core.utils.state import state +from core.utils.data.state import state global url_uztracker diff --git a/core/interface/gui.py b/core/interface/gui.py index 6a9bfdf..08b2d05 100644 --- a/core/interface/gui.py +++ b/core/interface/gui.py @@ -22,21 +22,12 @@ import threading import asyncio from core.data.scrapers.uztracker import scrape_uztracker from core.data.scrapers.rutracker import scrape_rutracker -from core.utils.tracker import get_item_index +from core.utils.wrappers import run_thread from core.utils.settings import save_settings -from core.utils.state import state +from core.utils.data.state import state from core.network.aria2_integration import dlprogress - - -def state_debug(setting): - if setting is True: - state.debug = True - else: - state.debug = False - - def create_tab(title, searchbar, software_list, tabs): tab = QWidget() layout = QVBoxLayout() @@ -48,7 +39,6 @@ def create_tab(title, searchbar, software_list, tabs): class MainWindow(QtWidgets.QMainWindow, QWidget): def __init__(self): - global settings_action super().__init__() searchresults = [] @@ -63,7 +53,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): self.searchbar.setPlaceholderText("Search for software...") self.searchbar.setClearButtonEnabled(True) self.searchbar.setMinimumHeight(30) - self.searchbar.returnPressed.connect(lambda: self.run_thread(threading.Thread(target=self.return_pressed))) # Triggers data function thread on enter + self.searchbar.returnPressed.connect(lambda: run_thread(threading.Thread(target=self.return_pressed))) # Triggers data function thread on enter self.dlbutton = QtWidgets.QPushButton("Download") self.softwareList = QListWidget() @@ -81,7 +71,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): self.softwareList.addItems(searchresults) # download button triggers - self.dlbutton.clicked.connect(lambda: self.run_thread(threading.Thread(target=self.download_selected))) + self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=self.download_selected))) container.setLayout(containerLayout) self.setCentralWidget(container) @@ -209,16 +199,17 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): dialog.exec() - def download_selected(self): - item = self.softwareList.currentItem() - if item is not None: - if state.debug: - print(f"network {self.softwareList.currentItem().text()}") - self.run_thread(threading.Thread(target=get_item_index, args=(self.softwareList.currentItem().text(), self.postnames, self.postlinks, state.debug))) - else: - if state.debug: - print("No item selected for download.") - # add gui notification for no item selected + # def download_selected(self): + # item = self.softwareList.currentItem() + # if item is not None: + # if state.debug: + # print(f"network {self.softwareList.currentItem().text()}") + # self.run_thread(threading.Thread(target=get_item_index, args=(self.softwareList.currentItem().text(), self.postnames, self.postlinks, state.debug))) + # else: + # if state.debug: + # print("No item selected for download.") + # # add gui notification for no item selected + # this needs a cleanup def return_pressed(self): @@ -234,10 +225,13 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): if state.tracker == "rutracker": response = asyncio.run(scrape_rutracker(search_text)) if response: - self.postnames, self.postlinks = response - self.softwareList.clear() - if self.postnames: - self.softwareList.addItems(self.postnames) + if state.tracker == "uztracker": + self.postnames, self.postlinks = response + self.softwareList.clear() + if self.postnames: + self.softwareList.addItems(self.postnames) + if state.tracker == "rutracker": + pass if not response: print(f"No Results found for \"{search_text}\"") self.softwareList.clear() @@ -248,5 +242,4 @@ class MainWindow(QtWidgets.QMainWindow, QWidget): progress = dlprogress() self.progressbar.setValue(progress) - def run_thread(self, thread): - thread.start() + diff --git a/core/network/aria2_integration.py b/core/network/aria2_integration.py index 5fbdb10..0ad4377 100644 --- a/core/network/aria2_integration.py +++ b/core/network/aria2_integration.py @@ -1,7 +1,7 @@ import aria2p import os import subprocess -from core.utils.state import state +from core.utils.data.state import state def run_aria2p(): global aria2 diff --git a/core/utils/__init__.py b/core/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/utils/state.py b/core/utils/data/state.py similarity index 100% rename from core/utils/state.py rename to core/utils/data/state.py diff --git a/core/utils/tracker.py b/core/utils/data/tracker.py similarity index 95% rename from core/utils/tracker.py rename to core/utils/data/tracker.py index d0951c0..73c4d61 100644 --- a/core/utils/tracker.py +++ b/core/utils/data/tracker.py @@ -2,7 +2,7 @@ import requests from bs4 import BeautifulSoup from core.network.aria2_wrapper import start_client from core.network.aria2_wrapper import add_magnet -from core.utils.state import state +from core.utils.data.state import state @@ -39,4 +39,5 @@ def get_magnet_link(post_url, debug): except requests.RequestException as e: if debug: print(f"Failed to fetch {post_url}: {e}") - return None \ No newline at end of file + return None + diff --git a/core/utils/network/download.py b/core/utils/network/download.py new file mode 100644 index 0000000..85faf50 --- /dev/null +++ b/core/utils/network/download.py @@ -0,0 +1,17 @@ +from core.utils.data.state import state +from core.utils.data.tracker import get_item_index +from core.utils.wrappers import run_thread +import threading + + +def download_selected(item, ): + if item is not None: + if state.debug: + print(f"network {item.text()}") + run_thread(threading.Thread(target=get_item_index, args=(item.text(), self.postnames, self.postlinks, state.debug))) + else: + if state.debug: + print("No item selected for download.") + + + diff --git a/core/utils/network/jsonhandler.py b/core/utils/network/jsonhandler.py new file mode 100644 index 0000000..44cc966 --- /dev/null +++ b/core/utils/network/jsonhandler.py @@ -0,0 +1,10 @@ +def split_data(data): + json = json.loads(data) + + count = json["count"] + posts = json["data"] + query = json["query"] + success = json["success"] + + return count, posts, query, success + diff --git a/core/utils/settings.py b/core/utils/settings.py index c8cccb0..c11c39b 100644 --- a/core/utils/settings.py +++ b/core/utils/settings.py @@ -1,4 +1,4 @@ -from core.utils.state import state +from core.utils.data.state import state def restart_aria2c(): diff --git a/core/utils/wrappers.py b/core/utils/wrappers.py new file mode 100644 index 0000000..c2dd46b --- /dev/null +++ b/core/utils/wrappers.py @@ -0,0 +1,2 @@ +def run_thread(thread): + thread.start() \ No newline at end of file diff --git a/main.py b/main.py index c1ac81d..daa4ab0 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,5 @@ from core.interface.gui import MainWindow -from core.interface.gui import state_debug -from core.utils.state import state +from core.utils.data.state import state from core.network.aria2_integration import aria2server from PySide6 import QtWidgets import qdarktheme @@ -9,10 +8,10 @@ import signal import atexit import sys -debug = True +# Debug Output +state.debug = True def run_gui(): - state_debug(debug) app = QtWidgets.QApplication([]) if darkdetect.isDark: app.setStyleSheet(qdarktheme.load_stylesheet("dark")) @@ -31,7 +30,7 @@ def run_aria2server(): def kill_aria2server(): if state.aria2process: state.aria2process.kill() - if debug: + if state.debug: print("\nKilled Aria2") @@ -41,12 +40,12 @@ def keyboardinterrupthandler(signum, frame): if __name__ == "__main__": - if debug: + if state.debug: print("Starting Aria2 Server") state.aria2process = run_aria2server() signal.signal(signal.SIGINT, keyboardinterrupthandler) atexit.register(kill_aria2server) - if debug: + if state.debug: print("Launching GUI") run_gui()