Compare commits

...

5 Commits

Author SHA1 Message Date
Vxrtrauter a386269f29 add console logging in gui, remove progress bar from gui, add new logging function, refactor all print statements to use new log function 2026-01-14 11:27:22 +01:00
Vxrtrauter 9afced8a0b Add auto-resume functionality and update settings dialog 2026-01-14 00:18:39 +01:00
Vxrtrauter db77bed3cf add autoresume variable functionality 2026-01-13 23:58:23 +01:00
Vxrtrauter cc3b201450 added basic download resuming 2026-01-13 23:51:25 +01:00
Vxrtrauter 5a9d9067b9 fix exception spam 2026-01-13 21:35:03 +01:00
18 changed files with 191 additions and 135 deletions
+1
View File
@@ -1,5 +1,6 @@
from bs4 import BeautifulSoup
import requests
from core.utils.general.logs import consoleLog
def scrape_monkrus_telegram(query):
post = 100
+3 -4
View File
@@ -1,17 +1,16 @@
import requests
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
def scrape_rutracker(search_text):
search = requests.get(f"{state.api_url}/search/{search_text}")
if state.debug:
print("Sent request to server")
consoleLog("Sent request to server")
if search:
try:
return search.text
except Exception:
if state.debug:
print("No results found / No response from server")
consoleLog("No results found / No response from server")
return None
else:
+11 -16
View File
@@ -2,6 +2,7 @@ import requests
import asyncio
from bs4 import BeautifulSoup
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
global url_uztracker
@@ -16,13 +17,11 @@ async def init_uztracker():
up = True
else:
up = False
if state.debug:
print(f"Uztracker seems down, status code: {response.status_code}")
consoleLog(f"Uztracker seems down, status code: {response.status_code}")
except requests.exceptions.RequestException as e:
if state.debug:
print(f"\nRequest Exception on {url_uztracker}:")
print(e)
print("\nIs the Site down?")
consoleLog(f"\nRequest Exception on {url_uztracker}:")
consoleLog(str(e))
consoleLog("\nIs the Site down?")
up = False
asyncio.run(init_uztracker())
@@ -30,8 +29,7 @@ asyncio.run(init_uztracker())
def scrape_uztracker(search):
if up:
search_url = url_uztracker + search
if state.debug:
print(search_url)
consoleLog(search_url)
result = False
global results
global resulttitles
@@ -59,12 +57,11 @@ def scrape_uztracker(search):
return None
except requests.RequestException as e:
if result and state.debug:
print(f"Failed to fetch {search_url}: {e}")
if result:
consoleLog(f"Failed to fetch {search_url}: {e}")
return None
else:
if state.debug:
print("Error: Uztracker down")
consoleLog("Error: Uztracker down")
return None, None
def get_post_title(post_url):
@@ -75,11 +72,9 @@ def get_post_title(post_url):
if maintitle:
return maintitle.text
else:
if state.debug:
print("Program not found")
consoleLog("Program not found")
else:
if state.debug:
print("Error: Uztracker down")
consoleLog("Error: Uztracker down")
return None
+27 -12
View File
@@ -1,5 +1,6 @@
from core.utils.config.settings import save_settings
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
from PySide6 import QtWidgets
from PySide6.QtWidgets import (
QLineEdit,
@@ -16,8 +17,7 @@ from PySide6.QtWidgets import (
def settings_dialog(self):
if state.debug:
print("Settings dialog opened")
consoleLog("Settings dialog opened")
dialog = QDialog(self)
dialog.setWindowTitle("Settings")
dialog.setFixedSize(800, 400)
@@ -28,18 +28,33 @@ def settings_dialog(self):
def close_settings():
dialog.reject()
checkbox_container = QWidget()
checkbox_layout = QHBoxLayout()
update_checkbox_container = QWidget()
update_checkbox_layout = QHBoxLayout()
# ignore updates checkbox
checkbox = QCheckBox()
checkbox_container.setLayout(checkbox_layout)
checkbox_layout.addWidget(QLabel("Ignore Updates: "))
checkbox_layout.addStretch()
checkbox.setChecked(state.ignore_updates)
checkbox.toggled.connect(lambda checked: setattr(state, 'ignore_updates', checked))
checkbox_layout.addWidget(checkbox)
dialog.layout().addWidget(checkbox_container)
update_checkbox = QCheckBox()
update_checkbox_container.setLayout(update_checkbox_layout)
update_checkbox_layout.addWidget(QLabel("Ignore Updates: "))
update_checkbox_layout.addStretch()
update_checkbox.setChecked(state.ignore_updates)
update_checkbox.toggled.connect(lambda checked: setattr(state, 'ignore_updates', checked))
update_checkbox_layout.addWidget(update_checkbox)
dialog.layout().addWidget(update_checkbox_container)
# auto-resume downloads checkbox
autoresume_container = QWidget()
autoresume_layout = QHBoxLayout()
autoresume_checkbox = QCheckBox()
autoresume_container.setLayout(autoresume_layout)
autoresume_layout.addWidget(QLabel("Auto-Resume Downloads: "))
autoresume_layout.addStretch()
autoresume_checkbox.setChecked(state.autoresume)
autoresume_checkbox.toggled.connect(lambda checked: setattr(state, 'autoresume', checked))
autoresume_layout.addWidget(autoresume_checkbox)
dialog.layout().addWidget(autoresume_container)
##################
# THREAD SETTING #
+28 -3
View File
@@ -16,6 +16,7 @@ from PySide6.QtWidgets import (
QHeaderView,
QMessageBox,
QTableWidget,
QTextEdit
)
from PySide6.QtGui import QIcon, QAction, QCloseEvent, QImage, QPixmap
@@ -28,6 +29,7 @@ import subprocess
import time
import sys
import json
from core.utils.general.logs import consoleLog
from core.utils.general.wrappers import run_thread
from core.utils.data.state import state
from core.utils.network.download import download_selected
@@ -43,7 +45,7 @@ def download_update(latest_version):
new_filename = f"SoftwareManager-dev-{latest_version.replace('-dev', '')}-windows.exe"
url = f"https://github.com/KeksPirates/SoftwareManager/releases/latest/download/SoftwareManager-dev-{latest_version.replace('-dev', '')}-windows.exe"
print("Downloading update...")
consoleLog("Downloading update...")
response = r.get(url, allow_redirects=True)
with open(new_filename, "wb") as f:
f.write(response.content)
@@ -63,8 +65,12 @@ def download_update(latest_version):
class MainWindow(QtWidgets.QMainWindow, QWidget):
log_signal = Signal(str) # Thread-safe signal for logging
def __init__(self):
super().__init__()
MainWindow._instance = self
self.log_signal.connect(self._on_log_signal)
build_info_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "build_info.json")
if os.path.exists(build_info_path):
@@ -115,6 +121,8 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
self.downloadList = QTableView()
self.emptyLibrary = QLabel("No items in library.")
self.emptyDownload = QLabel("No items in downloads.")
self.consoleLog = QTextEdit()
self.progressbar = QProgressBar()
# Table Widget for Item List
@@ -240,8 +248,10 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
toolbar.setMovable(False)
self.progressbar.setValue(0)
containerLayout.addWidget(self.progressbar)
# self.progressbar.setValue(0)
self.consoleLog.setReadOnly(True)
self.consoleLog.setFixedHeight(150)
containerLayout.addWidget(self.consoleLog)
self.progress_timer = QTimer()
self.progress_timer.timeout.connect(lambda: run_thread(threading.Thread(target=self.update_progress)))
@@ -251,6 +261,17 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
self.download_timer.timeout.connect(lambda: run_thread(threading.Thread(target=self.download_list_update)))
self.download_timer.start(500)
@staticmethod
def add_log(text):
if MainWindow._instance:
MainWindow._instance.log_signal.emit(text)
def _on_log_signal(self, text):
self.consoleLog.append(text)
self.consoleLog.verticalScrollBar().setValue(
self.consoleLog.verticalScrollBar().maximum()
)
def update_image_overlay(self, new_image_path):
self.image = QImage(new_image_path)
self.pixmap = QPixmap.fromImage(self.image)
@@ -288,3 +309,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
super().resizeEvent(event)
table_width = self.qtablewidget.viewport().width()
self.qtablewidget.setColumnWidth(1, int(table_width * 0.3))
+9 -15
View File
@@ -1,4 +1,5 @@
from PySide6.QtWidgets import QTableWidgetItem
from core.utils.general.logs import consoleLog
from core.data.scrapers.uztracker import scrape_uztracker
from core.data.scrapers.rutracker import scrape_rutracker
from core.data.scrapers.monkrus import scrape_monkrus_telegram
@@ -8,11 +9,9 @@ from core.utils.data.state import state
def return_pressed(self):
search_text = self.searchbar.text()
if search_text == "":
if state.debug:
print("Error: Can't search for nothing")
consoleLog("Error: Can't search for nothing")
return
if state.debug:
print("User searched for:", search_text)
consoleLog(f"User searched for: {search_text}")
if state.tracker == "uztracker":
response = scrape_uztracker(search_text)
@@ -28,13 +27,11 @@ def return_pressed(self):
self.qtablewidget.setItem(i, 0, QTableWidgetItem(title))
self.show_empty_results(False)
else:
if state.debug:
print(f"No Results for {search_text}")
consoleLog(f"No Results for {search_text}")
self.qtablewidget.clear()
self.show_empty_results(True)
else:
if state.debug:
print(f"No response from uztracker")
consoleLog(f"No response from uztracker")
self.qtablewidget.clear()
self.show_empty_results(True)
@@ -43,8 +40,7 @@ def return_pressed(self):
if response:
_, state.posts, _, _, cached = split_data(response)
if state.posts == []:
if state.debug:
print(f"No Results for {search_text}")
consoleLog(f"No Results for {search_text}")
self.qtablewidget.clear()
self.show_empty_results(True)
else:
@@ -58,10 +54,9 @@ def return_pressed(self):
for i, title in enumerate(state.post_titles):
self.qtablewidget.setItem(i, 0, QTableWidgetItem(title))
if state.debug == True:
print(f"Response Cached: {cached}")
consoleLog(f"Response Cached: {cached}")
else:
if state.debug:
print(f"No response from rutracker")
consoleLog(f"No response from rutracker")
self.qtablewidget.clear()
self.show_empty_results(True)
@@ -69,8 +64,7 @@ def return_pressed(self):
state.posts = scrape_monkrus_telegram(search_text)
if state.posts == []:
if state.debug:
print(f"No Results for {search_text}")
consoleLog(f"No Results for {search_text}")
self.qtablewidget.clear()
self.show_empty_results(True)
else:
+3 -7
View File
@@ -83,14 +83,10 @@ def update_log(shutdown_event):
if d.is_metadata:
continue
if d.progress == 100 and d.gid not in updated:
if state.debug:
print(f"Marking {d.name} as completed")
consoleLog(f"Marking {d.name} as completed")
update_download_completed_by_hash(d.info_hash, True)
updated.add(d.gid)
state.downloads = [d for d in state.aria2.get_downloads() if d.is_active and not d.is_metadata]
except Exception as e:
if state.debug:
print(f"Error in update_log: {e}")
import traceback
traceback.print_exc()
except Exception:
pass
time.sleep(5)
+3 -4
View File
@@ -1,16 +1,15 @@
from .aria2_integration import run_aria2p
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
def start_client():
global aria2
aria2 = run_aria2p()
if state.debug:
print("Started Aria2p")
consoleLog("Started Aria2p")
def add_magnet(uri):
aria2.add_magnet(uri)
if state.debug:
print("Magnet URI added to Aria2")
consoleLog("Magnet URI added to Aria2")
+3 -1
View File
@@ -7,7 +7,7 @@ def create_config():
config = configparser.ConfigParser()
config["General"] = {"debug": True, "api_url": f"{state.api_url}", "aria2_threads": f"{state.aria2_threads}", "download_path": f"{state.download_path}", f"speed_limit": f"{state.speed_limit}",
"ignore_updates": f"{state.ignore_updates}", "image_path": f"{state.image_path}"}
"ignore_updates": f"{state.ignore_updates}", "image_path": f"{state.image_path}", "autoresume": f"{state.autoresume}"}
if platform.system() == "Windows":
config_dir = os.environ.get("APPDATA", os.path.expanduser("~\\AppData\\Roaming"))
@@ -51,3 +51,5 @@ def read_config():
state.ignore_updates = config.getboolean("General", "ignore_updates")
if state.image_path is not None:
state.image_path = config.get("General", "image_path")
if state.autoresume is not None:
state.autoresume = config.getboolean("General", "autoresume")
+4 -1
View File
@@ -13,7 +13,7 @@ def restart_aria2c():
atexit.unregister(kill_aria2server)
atexit.register(kill_aria2server)
def save_settings(thread_count=None, close=lambda: None, apiurl=None, download_path=None, speed_limit=None, image_path=None):
def save_settings(thread_count=None, close=lambda: None, apiurl=None, download_path=None, speed_limit=None, image_path=None, autoresume=None):
if thread_count is not None:
state.aria2_threads = thread_count
if apiurl is not None:
@@ -24,6 +24,9 @@ def save_settings(thread_count=None, close=lambda: None, apiurl=None, download_p
state.speed_limit = speed_limit
if image_path is not None:
state.image_path = image_path
if autoresume is not None:
state.autoresume = autoresume
create_config()
restart_aria2c()
+1
View File
@@ -16,6 +16,7 @@ class AppState(QObject):
self._image_path: str = ""
self.ignore_updates: bool = False
self.debug: bool = False
self.autoresume: bool = True
self.tracker: str = "rutracker"
self.api_url: str = "https://api.michijackson.xyz"
self.download_path: str = str(Path.home() / "Downloads")
+8 -14
View File
@@ -1,6 +1,7 @@
import requests
from bs4 import BeautifulSoup
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
from core.utils.network.jsonhandler import format_data
@@ -10,20 +11,17 @@ def get_item_url(item, posts, post_titles): # softwarelist currentitem, post lis
if 0 <= post_index < len(post_titles):
if state.tracker == "uztracker":
item = "https://uztracker.net/" + state.post_urls[post_index].lstrip("./")
if state.debug:
print("Found post URL: ", item)
consoleLog(f"Found post URL: {item}")
return item
if state.tracker == "rutracker":
item_dict = posts[post_index]
_, post_links, _ = format_data([item_dict])
if state.debug:
print("Found post URL: ", post_links[0])
consoleLog(f"Found post URL: {post_links[0]}")
return post_links[0]
if state.tracker == "m0nkrus":
item_dict = posts[post_index]
_, post_links, _ = format_data([item_dict])
if state.debug:
print("Found post URL: ", post_links[0])
consoleLog(f"Found post URL: {post_links[0]}")
return post_links[0]
return None
@@ -33,20 +31,16 @@ def get_item_url(item, posts, post_titles): # softwarelist currentitem, post lis
def get_magnet_link(post_url):
try:
response = requests.get(post_url) # eventually impl. cloudscraper
if state.debug:
print("Sent Request to retrieve Magnet Link...")
consoleLog("Sent Request to retrieve Magnet Link...")
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
magnet_link = soup.find('a', href=lambda x: x and x.startswith('magnet:'))
if magnet_link:
if state.debug:
print("Magnet Link Retrieved: ", magnet_link['href'])
consoleLog(f"Magnet Link Retrieved: {magnet_link['href']}")
return magnet_link['href']
else:
if state.debug:
print("Magnet Link not Found!")
consoleLog("Magnet Link not Found!")
except requests.RequestException as e:
if state.debug:
print(f"Failed to fetch {post_url}: {e}")
consoleLog(f"Failed to fetch {post_url}: {e}")
return None
+22
View File
@@ -0,0 +1,22 @@
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
from core.utils.network.download import run_download_direct
def split_data(data):
count = data.count
downloads = data.data
return count, downloads
def check_completed(downloads, resume):
for download in downloads:
if download.completed == False:
consoleLog(f"Found unfinished download: {download.title}")
if resume == True:
run_download_direct(download.magnet_uri)
consoleLog(f"Resuming {download.title}")
+36 -32
View File
@@ -21,8 +21,7 @@ def add_download_log(title, url, magnet_uri, completed) -> DownloadList:
if any(d.magnet_uri == magnet_uri or d.url == url for d in downloads):
if state.debug:
print("Skipped Logging, download already in file")
consoleLog("Skipped Logging, download already in file")
return DownloadList(data=downloads, count=len(downloads)) # thanks again claude (im stupid)
@@ -33,8 +32,7 @@ def add_download_log(title, url, magnet_uri, completed) -> DownloadList:
completed=completed,
))
if state.debug:
print(f"Added {title} to Log File")
consoleLog(f"Added {title} to Log File")
download_list = DownloadList(data=downloads, count=len(downloads))
with open(downloads_file, "w") as file:
@@ -51,51 +49,45 @@ def update_download_completed(magnet_uri, completed) -> DownloadList:
existing_data = json.load(file)
downloads = [Download(**d) for d in existing_data.get("data", [])]
except (json.JSONDecodeError, TypeError) as e:
if state.debug:
print(f"Error loading downloads.json: {e}")
consoleLog(f"Error loading downloads.json: {e}")
downloads = []
else:
downloads = []
identifier = (magnet_uri or "").strip()
if state.debug:
print(f"Updating download completed for identifier: {identifier!r}")
print(f"Total downloads in file: {len(downloads)}")
consoleLog(f"Updating download completed for identifier: {identifier!r}")
consoleLog(f"Total downloads in file: {len(downloads)}")
for i, d in enumerate(downloads):
try:
mag = (getattr(d, 'magnet_uri', None) or '')[:50]
url = (getattr(d, 'url', None) or '')[:50]
print(f" [{i}] magnet: {mag}... url: {url}...")
consoleLog(f" [{i}] magnet: {mag}... url: {url}...")
except Exception as e:
print(f" [{i}] Error reading download: {e}")
consoleLog(f" [{i}] Error reading download: {e}")
found = False
for download in downloads:
try:
stored_magnet = (getattr(download, 'magnet_uri', None) or "").strip()
stored_url = (getattr(download, 'url', None) or "").strip()
if state.debug:
print(f"Comparing with magnet: {stored_magnet[:50] if stored_magnet else 'None'}...")
consoleLog(f"Comparing with magnet: {stored_magnet[:50] if stored_magnet else 'None'}...")
if identifier and (stored_magnet == identifier or stored_url == identifier):
if state.debug:
print(f"Match found! Setting completed={completed}")
consoleLog(f"Match found! Setting completed={completed}")
download.completed = completed
found = True
except Exception as e:
if state.debug:
print(f"Error comparing download: {e}")
consoleLog(f"Error comparing download: {e}")
if not found:
if state.debug:
print("No matching download found to update")
consoleLog("No matching download found to update")
return DownloadList(data=downloads, count=len(downloads))
download_list = DownloadList(data=downloads, count=len(downloads))
with open(downloads_file, "w") as file:
json.dump(asdict(download_list), file, indent=4)
if state.debug:
print("Updated download log")
consoleLog("Updated download log")
return download_list
@@ -132,16 +124,14 @@ def update_download_completed_by_hash(info_hash, completed) -> DownloadList:
existing_data = json.load(file)
downloads = [Download(**d) for d in existing_data.get("data", [])]
except (json.JSONDecodeError, TypeError) as e:
if state.debug:
print(f"Error loading downloads.json: {e}")
consoleLog(f"Error loading downloads.json: {e}")
downloads = []
else:
downloads = []
info_hash_upper = (info_hash or "").upper().strip()
if state.debug:
print(f"Updating download by hash: {info_hash_upper}")
print(f"Total downloads in file: {len(downloads)}")
consoleLog(f"Updating download by hash: {info_hash_upper}")
consoleLog(f"Total downloads in file: {len(downloads)}")
found = False
for download in downloads:
@@ -153,19 +143,33 @@ def update_download_completed_by_hash(info_hash, completed) -> DownloadList:
download.completed = completed
found = True
except Exception as e:
if state.debug:
print(f"Error comparing download: {e}")
consoleLog(f"Error comparing download: {e}")
if not found:
if state.debug:
print("No matching download found to update")
consoleLog("No matching download found to update")
return DownloadList(data=downloads, count=len(downloads))
download_list = DownloadList(data=downloads, count=len(downloads))
with open(downloads_file, "w") as file:
json.dump(asdict(download_list), file, indent=4)
if state.debug:
print("Updated download log")
consoleLog("Updated download log")
return download_list
return download_list
_main_window = None
def set_main_window(window):
global _main_window
_main_window = window
def consoleLog(text):
try:
from core.interface.gui import MainWindow
MainWindow.add_log(text)
except Exception:
pass
if state.debug:
print(text)
+3 -4
View File
@@ -1,4 +1,5 @@
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
import threading
import psutil
import sys
@@ -14,15 +15,13 @@ def kill_aria2server():
if state.aria2process:
state.aria2process.kill()
if state.debug:
print("Killed Aria2")
consoleLog("Killed Aria2")
try:
for proc in psutil.process_iter():
if proc.name() == process:
proc.kill()
if state.debug:
print(f"Killed Aria2c (PID {proc.pid})")
consoleLog(f"Killed Aria2c (PID {proc.pid})")
except psutil.NoSuchProcess:
pass
+8 -6
View File
@@ -1,4 +1,5 @@
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
from core.utils.data.tracker import get_item_url
from core.utils.data.tracker import get_magnet_link
from core.network.aria2_wrapper import start_client
@@ -11,21 +12,22 @@ import threading
def download_selected(item, posts, post_titles):
if item is not None:
if state.debug:
print(f"Downloading {item.text()}")
consoleLog(f"Downloading {item.text()}")
run_thread(threading.Thread(target=run_download, args=(item.text(), posts, post_titles)))
else:
if state.debug:
print("No item selected for download.")
consoleLog("No item selected for download.")
def run_download(item, posts, post_titles):
post_url = get_item_url(item, posts, post_titles)
if state.debug:
print("Selected URL: ", post_url)
consoleLog(f"Selected URL: {post_url}")
magnet_uri = get_magnet_link(post_url)
start_client()
add_download_log(item, post_url, magnet_uri, False)
add_magnet(magnet_uri)
def run_download_direct(magnet_uri):
start_client()
add_magnet(magnet_uri)
+9 -12
View File
@@ -1,12 +1,13 @@
import requests
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
def check_for_updates():
url = f"https://api.github.com/repos/KeksPirates/SoftwareManager/releases"
response = requests.get(url)
if response.status_code != 200:
print(f"Failed to fetch releases: {response.status_code}")
consoleLog(f"Failed to fetch releases: {response.status_code}")
exit(1)
releases = response.json()
@@ -18,21 +19,17 @@ def check_for_updates():
if state.version == "dev":
if state.debug:
print("Dev release detected, skipping version check")
return None, None
consoleLog("Dev release detected, skipping version check")
return None, None
elif latest_version != state.version:
if state.debug:
print(f"New release available: {latest_version}")
consoleLog(f"New release available: {latest_version}")
if assets:
if state.debug:
print("Assets:")
for asset in assets:
print(f" - {asset['name']}: {asset['browser_download_url']}")
consoleLog("Assets:")
for asset in assets:
consoleLog(f" - {asset['name']}: {asset['browser_download_url']}")
return assets, latest_version
else:
return None, None
else:
if state.debug:
print("Already up-to-date.")
consoleLog("Already up-to-date.")
return None, None
+12 -4
View File
@@ -1,9 +1,12 @@
from core.interface.gui import MainWindow
from core.utils.data.state import state
from core.utils.general.logs import consoleLog
from core.network.aria2_integration import aria2server
from core.network.aria2_integration import send_notification, update_log
from core.utils.general.logs import get_download_logs
from core.utils.general.shutdown import closehelper, shutdown_event
from core.utils.general.wrappers import run_thread
from core.utils.general.loghandler import split_data, check_completed
from core.utils.config.config import read_config
from PySide6 import QtWidgets
import qdarktheme
@@ -25,6 +28,10 @@ def run_gui():
else:
app.setStyleSheet(qdarktheme.load_stylesheet("light"))
widget = MainWindow()
from core.utils.general.logs import set_main_window
set_main_window(widget)
widget.show()
sys.exit(app.exec())
@@ -37,15 +44,16 @@ def keyboardinterrupthandler(signum, frame):
if __name__ == "__main__":
read_config()
logs = get_download_logs()
count, downloads = split_data(logs)
if args.debug:
state.debug = args.debug # override of read_config
if state.debug:
print("Starting Aria2 Server")
consoleLog("Starting Aria2 Server")
state.aria2process = run_aria2server()
signal.signal(signal.SIGINT, keyboardinterrupthandler)
run_thread(threading.Thread(target=send_notification, args=(shutdown_event,), daemon=True))
run_thread(threading.Thread(target=update_log, args=(shutdown_event,), daemon=True))
if state.debug:
print("Launching GUI")
run_thread(threading.Thread(target=check_completed, args=(downloads, state.autoresume)))
consoleLog("Launching GUI")
run_gui()