add threads setting in settings menu + add aria2c restart function in gui.py

This commit is contained in:
Vxrtrauter
2025-09-13 01:50:37 +02:00
parent 1c28d8e232
commit 66d43faad1
3 changed files with 122 additions and 27 deletions
+12 -1
View File
@@ -15,6 +15,15 @@ def run_aria2p():
return aria2 return aria2
t = 4 # default value
def set_threads(threads):
global t
t = threads
def aria2server(): def aria2server():
downloads_dir = os.path.join(os.path.expanduser("~"), "Downloads") downloads_dir = os.path.join(os.path.expanduser("~"), "Downloads")
@@ -24,7 +33,9 @@ def aria2server():
"--disable-ipv6", # added this since it caused problems with vpns "--disable-ipv6", # added this since it caused problems with vpns
"--rpc-listen-all", "--rpc-listen-all",
"--rpc-listen-port=6800", "--rpc-listen-port=6800",
f"--dir={downloads_dir}" f"--dir={downloads_dir}",
"-x", str(t),
"-s", str(t),
] ]
+95 -19
View File
@@ -1,14 +1,30 @@
from PySide6 import QtWidgets from PySide6 import QtWidgets
from PySide6.QtCore import Qt from PySide6.QtCore import Qt
from PySide6.QtWidgets import QLineEdit, QPushButton, QWidget, QVBoxLayout, QListWidget, QToolBar, QDialog, QVBoxLayout, QLabel, QHBoxLayout,QComboBox from PySide6.QtWidgets import (
QLineEdit,
QPushButton,
QWidget,
QVBoxLayout,
QListWidget,
QToolBar,
QDialog,
QLabel,
QHBoxLayout,
QComboBox,
QSpinBox,
)
from PySide6.QtGui import QIcon, QAction from PySide6.QtGui import QIcon, QAction
import darkdetect import darkdetect
import threading import threading
import time
from core.scraping.uztracker_scraper import scrape_uztracker from core.scraping.uztracker_scraper import scrape_uztracker
from core.scraping.rutracker_scraper import scrape_rutracker from core.scraping.rutracker_scraper import scrape_rutracker
from core.scraping.utils import get_magnet_link from core.scraping.utils import get_magnet_link
from core.downloading.download import start_client from core.downloading.download import start_client
from core.downloading.download import add_magnet from core.downloading.download import add_magnet
from core.downloading.aria2p_server import set_threads
def state_debug(setting): def state_debug(setting):
global debug global debug
@@ -17,10 +33,18 @@ def state_debug(setting):
else: else:
debug = False debug = False
def pass_aria(aria):
global aria2process
aria2process = aria
global tracker global tracker
tracker = "rutracker" # default tracker tracker = "rutracker" # default tracker
class MainWindow(QtWidgets.QMainWindow, QWidget): class MainWindow(QtWidgets.QMainWindow, QWidget):
def __init__(self): def __init__(self):
global settings_action global settings_action
@@ -38,10 +62,6 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
self.searchbar.setPlaceholderText("Search for software...") self.searchbar.setPlaceholderText("Search for software...")
self.searchbar.setClearButtonEnabled(True) self.searchbar.setClearButtonEnabled(True)
self.searchbar.setMinimumHeight(30) self.searchbar.setMinimumHeight(30)
thread_search = threading.Thread(target=self.return_pressed)
self.searchbar.returnPressed.connect(lambda: self.run_search(threading.Thread(target=self.return_pressed))) # Triggers scraping function thread on enter self.searchbar.returnPressed.connect(lambda: self.run_search(threading.Thread(target=self.return_pressed))) # Triggers scraping function thread on enter
@@ -90,37 +110,93 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
tracker = self.tracker_list.currentText() tracker = self.tracker_list.currentText()
def settings_dialog(self): def settings_dialog(self):
if debug: if debug:
print("Settings dialog opened") print("Settings dialog opened")
dialog = QDialog(self) dialog = QDialog(self)
dialog.setWindowTitle("Settings") dialog.setWindowTitle("Settings")
dialog.setFixedSize(400, 300) dialog.setFixedSize(400, 200)
dialog.setLayout(QVBoxLayout()) dialog.setLayout(QVBoxLayout())
label = QLabel("This is a settings dialog.") dialog.layout().addWidget(QLabel("Settings"))
QtWidgets.QPushButton("Close", clicked=dialog.close)
# close button
dialog.layout().addWidget(label)
dialog.layout().addWidget(QtWidgets.QPushButton("Close", clicked=dialog.close))
layout = QHBoxLayout() def close_settings():
dialog.reject()
##################
# THREAD SETTING #
##################
thread_box = QSpinBox()
thread_box.setMinimum(1)
thread_box.setMaximum(16)
thread_box.setValue(4)
# container for tight space
thread_container = QWidget()
thread_layout = QVBoxLayout()
thread_layout.addWidget(QLabel("Threads:"))
thread_layout.addWidget(thread_box)
thread_container.setLayout(thread_layout)
thread_container.setMaximumHeight(80)
# Dimensions
thread_box.setFixedWidth(90)
thread_box.setFixedHeight(30)
dialog.layout().addWidget(thread_container)
# dialog.layout().addWidget(QtWidgets.QPushButton("Close", clicked=dialog.close))
layout = QHBoxLayout() # layout for buttons
save_btn = QPushButton("Save") save_btn = QPushButton("Save")
cancel_btn = QPushButton("Cancel") cancel_btn = QPushButton("Cancel")
save_btn.clicked.connect(self.save_settings) save_btn.clicked.connect(lambda: self.save_settings(thread_box.value(), close_settings))
cancel_btn.clicked.connect(dialog.reject)
layout.addWidget(save_btn)
layout.addWidget(cancel_btn)
cancel_btn.clicked.connect(dialog.reject)
print(thread_box.value())
layout.addWidget(cancel_btn)
layout.addWidget(save_btn)
self.setLayout(QVBoxLayout())
dialog.layout().addLayout(layout) dialog.layout().addLayout(layout)
dialog.exec() dialog.exec()
def save_settings(self): def restart_aria2c(self):
pass import main # had to do this because of circle import :(
import signal
import atexit
global aria2process
main.kill_aria2server(aria2process)
aria2process.wait()
aria2process = main.run_aria2server()
signal.signal(signal.SIGINT, main.keyboardinterrupthandler)
atexit.unregister(main.kill_aria2server)
atexit.register(main.kill_aria2server, aria2process)
def save_settings(self, thread_count, close):
set_threads(thread_count)
self.restart_aria2c()
close()
def download_selected(self): def download_selected(self):
+15 -7
View File
@@ -1,5 +1,6 @@
from core.ui.gui import MainWindow from core.ui.gui import MainWindow
from core.ui.gui import state_debug from core.ui.gui import state_debug
from core.ui.gui import pass_aria
from core.downloading.aria2p_server import aria2server from core.downloading.aria2p_server import aria2server
from PySide6 import QtWidgets from PySide6 import QtWidgets
import qdarktheme import qdarktheme
@@ -10,7 +11,6 @@ import atexit
import sys import sys
debug = True debug = True
aria2process = None
def run_gui(): def run_gui():
state_debug(debug) state_debug(debug)
@@ -23,26 +23,34 @@ def run_gui():
widget.show() widget.show()
sys.exit(app.exec()) sys.exit(app.exec())
def kill_aria2server(): def run_aria2server():
global aria2process global aria2process
aria2process = aria2server()
return aria2process
def kill_aria2server(aria2process):
if aria2process: if aria2process:
aria2process.kill() aria2process.kill()
if debug: if debug:
print("\nKilled Aria2") print("\nKilled Aria2")
def keyboardinterrupthandler(signum, frame): def keyboardinterrupthandler(signum, frame):
kill_aria2server() global aria2process
kill_aria2server(aria2process)
sys.exit(0) sys.exit(0)
if __name__ == "__main__": if __name__ == "__main__":
kill_aria2server()
if debug: if debug:
print("Starting Aria2 Server") print("Starting Aria2 Server")
aria2process = aria2server() aria2process = run_aria2server()
signal.signal(signal.SIGINT, keyboardinterrupthandler) signal.signal(signal.SIGINT, keyboardinterrupthandler)
atexit.register(kill_aria2server) atexit.register(kill_aria2server, aria2process)
if debug: if debug:
print("Launching GUI") print("Launching GUI")
pass_aria(aria2process)
run_gui() run_gui()