Compare commits

...

22 Commits

Author SHA1 Message Date
KeksNino 1da62ef414 feat: browse directories to select download_path and image_path 2026-01-30 10:43:43 +01:00
KeksNino 4b5c36030d fix macos open folder button 2026-01-30 10:32:10 +01:00
KeksNino cc5f6a804c show open folder button when download is complete 2026-01-29 22:55:30 +01:00
KeksNino b783d0a0cb only show ignore auto updates on windows 2026-01-24 10:28:58 +01:00
KeksNino d057624548 fix pause/resume and add eta + completed length in download 2026-01-23 23:18:04 +01:00
KeksNino 81f7970c47 fix workflow with ubuntu 22.04 2026-01-23 15:27:22 +01:00
KeksNino 6a41ac44c9 switch workflow to ubuntu 22.04 for better glibc compat 2026-01-22 19:21:52 +01:00
Vxrtrauter 26c5410f3f Merge branch 'main' of https://github.com/KeksPirates/SoftwareManager 2026-01-20 17:41:43 +01:00
Vxrtrauter 7067f243ae update appid 2026-01-20 17:39:06 +01:00
Vxrtrauter d82008c9fe fix no item in downloads text 2026-01-20 11:26:49 +01:00
Vxrtrauter 83ff2720c8 add error handling for magnet uri being none 2026-01-20 10:43:02 +01:00
Vxrtrauter 83adbb027f fix aria2 connection refused errors caused by autoresume 2026-01-19 13:49:20 +01:00
KeksNino 606c70efcc add unicode icons for pause/resume and fix action column size 2026-01-18 21:39:40 +01:00
KeksNino 9970086901 WIP: add pause/resume button in downloads tab 2026-01-18 02:03:31 +01:00
Vxrtrauter 0d631e0ab8 fix assets not showing up in build 2026-01-17 15:26:08 +01:00
Vxrtrauter 1c1ce3e69d update workflow again 2026-01-17 14:56:30 +01:00
Vxrtrauter b5931f5590 fix actions 2026-01-17 14:51:53 +01:00
Vxrtrauter 84ea030e2a Enhance asset handling: update icon loading to use dynamic path resolution 2026-01-17 14:46:07 +01:00
Vxrtrauter 356f3bf070 fix dependencies 2026-01-17 14:34:47 +01:00
Vxrtrauter 6ff29e2ea6 add logo to gui and assets 2026-01-17 14:30:48 +01:00
Vxrtrauter 847b50ab10 image overlay error message: add check for valid image path 2026-01-17 14:08:47 +01:00
Vxrtrauter 5bc81b5215 Enhance console logging: add option to print logs regardless of debug state 2026-01-17 02:00:16 +01:00
9 changed files with 225 additions and 53 deletions
+15 -5
View File
@@ -24,7 +24,7 @@ jobs:
strategy: strategy:
matrix: matrix:
include: include:
- os: ubuntu-latest - os: ubuntu-22.04
artifact_name: SoftwareManager-dev-${{ github.sha }}-linux artifact_name: SoftwareManager-dev-${{ github.sha }}-linux
asset_name: SoftwareManager-dev-${{ github.sha }}-linux asset_name: SoftwareManager-dev-${{ github.sha }}-linux
- os: windows-latest - os: windows-latest
@@ -67,7 +67,7 @@ jobs:
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install -r requirements.txt pip install -r requirements.txt
pip install pyinstaller backports.tarfile pip install pyinstaller backports.tarfile pillow
- name: Generate version - name: Generate version
id: version id: version
@@ -103,8 +103,13 @@ jobs:
run: | run: |
pyinstaller --onefile --windowed \ pyinstaller --onefile --windowed \
--add-data "build_info.json;." \ --add-data "build_info.json;." \
--add-data "build_info.json;core" \
--add-data "build_info.json;core/interface" \
--add-data "deps/aria2c.exe;." \ --add-data "deps/aria2c.exe;." \
--add-data "core/interface/assets;core/interface/assets" \ --add-data "core/interface/assets;core/interface/assets" \
--icon "core/interface/assets/logo.png" \
--exclude-module PyQt6 \
--exclude-module PyQt5 \
--hidden-import=backports.tarfile \ --hidden-import=backports.tarfile \
--hidden-import=backports \ --hidden-import=backports \
--hidden-import=jaraco.context \ --hidden-import=jaraco.context \
@@ -119,7 +124,12 @@ jobs:
run: | run: |
pyinstaller --onefile --windowed \ pyinstaller --onefile --windowed \
--add-data "build_info.json:." \ --add-data "build_info.json:." \
--add-data "build_info.json:core" \
--add-data "build_info.json:core/interface" \
--add-data "core/interface/assets:core/interface/assets" \ --add-data "core/interface/assets:core/interface/assets" \
--icon "core/interface/assets/logo.png" \
--exclude-module PyQt6 \
--exclude-module PyQt5 \
--hidden-import=backports.tarfile \ --hidden-import=backports.tarfile \
--hidden-import=backports \ --hidden-import=backports \
--hidden-import=jaraco.context \ --hidden-import=jaraco.context \
@@ -149,7 +159,7 @@ jobs:
release: release:
name: Create Release name: Create Release
needs: build needs: build
runs-on: ubuntu-latest runs-on: ubuntu-22.04
if: success() if: success()
steps: steps:
@@ -162,7 +172,7 @@ jobs:
run: | run: |
mkdir -p release mkdir -p release
SHORT_SHA="${{ needs.build.outputs.short_sha }}" SHORT_SHA="${{ needs.build.outputs.short_sha }}"
cp artifacts/ubuntu-latest-build/SoftwareManager-dev-*-linux release/SoftwareManager-dev-${SHORT_SHA}-linux cp artifacts/ubuntu-22.04-build/SoftwareManager-dev-*-linux release/SoftwareManager-dev-${SHORT_SHA}-linux
cp artifacts/windows-latest-build/SoftwareManager-dev-*-windows.exe release/SoftwareManager-dev-${SHORT_SHA}-windows.exe cp artifacts/windows-latest-build/SoftwareManager-dev-*-windows.exe release/SoftwareManager-dev-${SHORT_SHA}-windows.exe
cp artifacts/macos-latest-build/SoftwareManager-dev-*-macos release/SoftwareManager-dev-${SHORT_SHA}-macos cp artifacts/macos-latest-build/SoftwareManager-dev-*-macos release/SoftwareManager-dev-${SHORT_SHA}-macos
chmod +x release/SoftwareManager-dev-*-linux release/SoftwareManager-dev-*-macos chmod +x release/SoftwareManager-dev-*-linux release/SoftwareManager-dev-*-macos
@@ -197,4 +207,4 @@ jobs:
release/SoftwareManager-dev-${{ needs.build.outputs.short_sha }}-windows.exe release/SoftwareManager-dev-${{ needs.build.outputs.short_sha }}-windows.exe
release/SoftwareManager-dev-${{ needs.build.outputs.short_sha }}-macos release/SoftwareManager-dev-${{ needs.build.outputs.short_sha }}-macos
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+4
View File
@@ -214,3 +214,7 @@ __marimo__/
*.sublime-project *.sublime-project
*.code-workspace *.code-workspace
*.swp *.swp
# Local build files
build-local.ps1
build-local.bat
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

+31 -9
View File
@@ -12,7 +12,9 @@ from PySide6.QtWidgets import (
QHBoxLayout, QHBoxLayout,
QSpinBox, QSpinBox,
QCheckBox, QCheckBox,
) QFileDialog,
)
import platform
def settings_dialog(self): def settings_dialog(self):
@@ -32,14 +34,16 @@ def settings_dialog(self):
update_checkbox_layout = QHBoxLayout() update_checkbox_layout = QHBoxLayout()
# ignore updates checkbox # ignore updates checkbox
update_checkbox = QCheckBox()
update_checkbox_container.setLayout(update_checkbox_layout) if platform.system() == "Windows":
update_checkbox_layout.addWidget(QLabel("Ignore Updates: ")) update_checkbox = QCheckBox()
update_checkbox_layout.addStretch() update_checkbox_container.setLayout(update_checkbox_layout)
update_checkbox.setChecked(state.ignore_updates) update_checkbox_layout.addWidget(QLabel("Ignore Updates: "))
update_checkbox.toggled.connect(lambda checked: setattr(state, 'ignore_updates', checked)) update_checkbox_layout.addStretch()
update_checkbox_layout.addWidget(update_checkbox) update_checkbox.setChecked(state.ignore_updates)
dialog.layout().addWidget(update_checkbox_container) 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 # auto-resume downloads checkbox
@@ -111,6 +115,15 @@ def settings_dialog(self):
download_path.setText(state.download_path) download_path.setText(state.download_path)
dialog.layout().addWidget(download_path_container) dialog.layout().addWidget(download_path_container)
def browse_download_path():
dir_path = QFileDialog.getExistingDirectory(dialog, "Select Download Directory", state.download_path)
if dir_path:
download_path.setText(dir_path)
browse_button = QPushButton("📁")
download_path_layout.addWidget(browse_button)
browse_button.clicked.connect(browse_download_path)
################## ##################
# SPEED LIMITING # # SPEED LIMITING #
################## ##################
@@ -144,6 +157,15 @@ def settings_dialog(self):
image_path.setText(state.image_path) image_path.setText(state.image_path)
dialog.layout().addWidget(image_path_container) dialog.layout().addWidget(image_path_container)
def browse_image_path():
file_path = QFileDialog.getOpenFileName(dialog, "Select Image File", state.image_path, "Image Files (*.png *.jpg)")[0]
if file_path:
image_path.setText(file_path)
browse_button = QPushButton("📁")
image_path_layout.addWidget(browse_button)
browse_button.clicked.connect(browse_image_path)
############### ###############
# SAVE/CANCEL # # SAVE/CANCEL #
############### ###############
+152 -34
View File
@@ -1,6 +1,5 @@
from PySide6 import QtWidgets from PySide6 import QtWidgets
from PySide6 import QtCore from PySide6.QtCore import Qt, QTimer, QModelIndex, QAbstractTableModel, Signal, QEvent
from PySide6.QtCore import Qt, QTimer, QModelIndex, QAbstractTableModel, Signal
from PySide6.QtWidgets import ( from PySide6.QtWidgets import (
QLineEdit, QLineEdit,
QTableView, QTableView,
@@ -16,8 +15,12 @@ from PySide6.QtWidgets import (
QHeaderView, QHeaderView,
QMessageBox, QMessageBox,
QTableWidget, QTableWidget,
QTextEdit QTextEdit,
) QStyle,
QStyleOptionButton,
QStyledItemDelegate,
QApplication,
)
from PySide6.QtGui import QIcon, QAction, QCloseEvent, QImage, QPixmap from PySide6.QtGui import QIcon, QAction, QCloseEvent, QImage, QPixmap
import darkdetect import darkdetect
@@ -45,7 +48,7 @@ def download_update(latest_version):
new_filename = f"SoftwareManager-dev-{latest_version.replace('-dev', '')}-windows.exe" 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" url = f"https://github.com/KeksPirates/SoftwareManager/releases/latest/download/SoftwareManager-dev-{latest_version.replace('-dev', '')}-windows.exe"
consoleLog("Downloading update...") consoleLog("Downloading update...", True)
response = r.get(url, allow_redirects=True) response = r.get(url, allow_redirects=True)
with open(new_filename, "wb") as f: with open(new_filename, "wb") as f:
f.write(response.content) f.write(response.content)
@@ -55,11 +58,11 @@ def download_update(latest_version):
time.sleep(0.5) time.sleep(0.5)
msg = QMessageBox() msg = QMessageBox()
msg.setIcon(QMessageBox.Information) msg.setIcon(QMessageBox.Icon.Information)
msg.setWindowTitle("New Version") msg.setWindowTitle("New Version")
msg.setText("New version installed.") msg.setText("New version installed.")
msg.setInformativeText("Please remove the old exe.") msg.setInformativeText("Please remove the old exe.")
msg.setStandardButtons(QMessageBox.Ok) msg.setStandardButtons(QMessageBox.StandardButton.Ok)
sys.exit(0) sys.exit(0)
@@ -72,6 +75,29 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
MainWindow._instance = self MainWindow._instance = self
self.log_signal.connect(self._on_log_signal) self.log_signal.connect(self._on_log_signal)
def get_asset_path(filename):
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
else:
base_path = os.path.dirname(__file__)
asset_path = os.path.join(base_path, 'core', 'interface', 'assets', filename)
if os.path.exists(asset_path):
return asset_path
return os.path.join('core', 'interface', 'assets', filename)
self.setWindowIcon(QIcon(get_asset_path("logo.png")))
if platform.system() == "Windows":
try:
import ctypes
appid = 'SoftwareManager'
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(appid)
except Exception as e:
consoleLog(f"Could not set app ID: {e}")
build_info_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "build_info.json") 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): if os.path.exists(build_info_path):
with open(build_info_path, "r") as f: with open(build_info_path, "r") as f:
@@ -87,14 +113,14 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
if assets: if assets:
msg = QMessageBox() msg = QMessageBox()
msg.setIcon(QMessageBox.Information) msg.setIcon(QMessageBox.Icon.Information)
msg.setWindowTitle("Update Available") msg.setWindowTitle("Update Available")
msg.setText("A new version is available.") msg.setText("A new version is available.")
msg.setInformativeText("Press Ok to download the update.") msg.setInformativeText("Press Ok to download the update.")
msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Ignore) msg.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Ignore)
response = msg.exec_() response = msg.exec_()
if response == QMessageBox.Ok: if response == QMessageBox.StandardButton.Ok:
download_update(latest_version) download_update(latest_version)
self.setWindowTitle("Software Manager") self.setWindowTitle("Software Manager")
@@ -121,6 +147,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
self.downloadList = QTableView() self.downloadList = QTableView()
self.emptyLibrary = QLabel("No items in library.") self.emptyLibrary = QLabel("No items in library.")
self.emptyDownload = QLabel("No items in downloads.") self.emptyDownload = QLabel("No items in downloads.")
self.emptyDownload.setAlignment(Qt.AlignCenter)
self.consoleLog = QTextEdit() self.consoleLog = QTextEdit()
self.progressbar = QProgressBar() self.progressbar = QProgressBar()
@@ -153,11 +180,11 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
class DownloadModel(QAbstractTableModel): class DownloadModel(QAbstractTableModel):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.headers = ["Name", "Status", "Progress", "Speed", "Size", "Total Size"] self.headers = ["Action", "Name", "Status", "Progress", "Speed", "Size", "Total Size"]
def rowCount(self, parent=QModelIndex()): def rowCount(self, parent=QModelIndex()):
return len(state.downloads) return len(state.downloads)
def columnCount(self, parent=QModelIndex()): def columnCount(self, parent=QModelIndex()):
return len(self.headers) return len(self.headers)
@@ -167,32 +194,109 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
return None return None
def data(self, index, role=Qt.DisplayRole): def data(self, index, role=Qt.DisplayRole):
col = index.column()
download = state.downloads[index.row()]
if role == Qt.DisplayRole: if role == Qt.DisplayRole:
download = state.downloads[index.row()]
col = index.column() col = index.column()
if col == 0: if col == 0:
return download.name return "▶︎" if download.is_paused else "⏸︎"
elif col == 1: elif col == 1:
return getattr(download, 'status', 'Downloading') return download.name
elif col == 2: elif col == 2:
return f"{int(download.progress)}%" return getattr(download, 'status', 'Downloading')
elif col == 3: elif col == 3:
return f"{download.download_speed_string()}" return f"{int(download.progress)}%"
elif col == 4: elif col == 4:
pass return f"{download.download_speed_string()}"
elif col == 5: elif col == 5:
return f"{download.completed_length_string()}"
elif col == 6:
return f"{download.total_length_string()}" return f"{download.total_length_string()}"
elif col == 7:
return f"{download.eta_string()}"
if role == Qt.UserRole and col == 0:
return download.is_paused
return None return None
def toggle_pause_resume(self, row):
download = state.downloads[row]
if download.progress == 100:
if state.download_path is not None and os.path.exists(state.download_path):
if platform.system() == "Windows":
os.startfile(os.path.normpath(state.download_path))
elif platform.system() == "Linux":
subprocess.Popen(["xdg-open", state.download_path])
elif platform.system() == "Darwin":
subprocess.Popen(["open", state.download_path])
else:
if platform.system() == "Windows":
os.startfile(os.path.normpath(os.getcwd()))
elif platform.system() == "Linux":
subprocess.Popen(["xdg-open", os.getcwd()])
elif platform.system() == "Darwin":
subprocess.Popen(["open", os.getcwd()])
return
if download.is_paused:
download.resume()
consoleLog(f"Resumed download: {download.name}", True)
else:
download.pause()
consoleLog(f"Paused download: {download.name}", True)
idx = self.index(row, 0)
self.dataChanged.emit(idx, idx, [Qt.ItemDataRole.DisplayRole, Qt.ItemDataRole.UserRole])
class PauseResumeDelegate(QStyledItemDelegate):
clicked = Signal(int)
def paint(self, painter, option, index):
if index.column() != 0:
super().paint(painter, option, index)
return
paused = index.data(Qt.UserRole)
download = state.downloads[index.row()]
button = QStyleOptionButton()
button.rect = option.rect
if download.progress == 100:
button.text = "📁"
else:
button.text = "▶︎" if paused else "⏸︎"
button.state = QStyle.State_Enabled
QApplication.style().drawControl(
QStyle.CE_PushButton, button, painter
)
def editorEvent(self, event, model, option, index):
if index.column() == 0 and event.type() == QEvent.Type.MouseButtonPress:
self.clicked.emit(index.row())
return True
return False
self.download_model = DownloadModel() self.download_model = DownloadModel()
self.downloadList.setModel(self.download_model) self.downloadList.setModel(self.download_model)
self.downloadList.horizontalHeader().setStretchLastSection(False) self.downloadList.horizontalHeader().setStretchLastSection(False)
self.downloadList.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch) self.downloadList.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
self.downloadList.setSelectionBehavior(QTableView.SelectRows) self.downloadList.setSelectionBehavior(QTableView.SelectRows)
self.downloadList.setAttribute(Qt.WA_TranslucentBackground) self.downloadList.setAttribute(Qt.WA_TranslucentBackground)
self.downloadList.viewport().setAttribute(Qt.WA_TranslucentBackground) self.downloadList.viewport().setAttribute(Qt.WA_TranslucentBackground)
download_model = self.download_model
def on_pause_resume_clicked(row):
download_model.toggle_pause_resume(row)
delegate = PauseResumeDelegate(self.downloadList)
self.downloadList.setItemDelegateForColumn(0, delegate)
delegate.clicked.connect(on_pause_resume_clicked)
# download button triggers # download button triggers
self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(self.qtablewidget.currentItem(), state.posts, state.post_titles)))) self.dlbutton.clicked.connect(lambda: run_thread(threading.Thread(target=download_selected, args=(self.qtablewidget.currentItem(), state.posts, state.post_titles))))
@@ -210,18 +314,20 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
self.tab2 = create_tab("Library", self.emptyLibrary, self.libraryList, self.tabs, None, None) self.tab2 = create_tab("Library", self.emptyLibrary, self.libraryList, self.tabs, None, None)
self.tab3 = create_tab("Downloads", self.emptyDownload, self.downloadList, self.tabs, None, None) self.tab3 = create_tab("Downloads", self.emptyDownload, self.downloadList, self.tabs, None, None)
self.image = QImage(state.image_path) if state.image_path is not None and os.path.exists(state.image_path):
self.pixmap = QPixmap.fromImage(self.image) self.image = QImage(state.image_path)
self.overlay_label = QLabel(self) self.pixmap = QPixmap.fromImage(self.image)
self.overlay_label.setPixmap(self.pixmap) self.overlay_label = QLabel(self)
self.overlay_label.adjustSize() self.overlay_label.setPixmap(self.pixmap)
self.overlay_label.raise_() self.overlay_label.adjustSize()
self.overlay_label.raise_()
offset_x = -1350 offset_x = -1350
offset_y = -550 offset_y = -550
x = self.width() - self.overlay_label.width() - offset_x x = self.width() - self.overlay_label.width() - offset_x
y = self.height() - self.overlay_label.height() - offset_y y = self.height() - self.overlay_label.height() - offset_y
self.overlay_label.move(x, y) self.overlay_label.move(x, y)
# temporarily disabled # temporarily disabled
# state.image_changed.connect(self.update_image_overlay) # state.image_changed.connect(self.update_image_overlay)
@@ -238,9 +344,9 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
self.tracker_list.activated.connect(self.set_tracker) self.tracker_list.activated.connect(self.set_tracker)
if darkdetect.isDark(): if darkdetect.isDark():
settings_action = QAction(QIcon("core/interface/assets/settings_white.png"), "Settings", self) settings_action = QAction(QIcon(get_asset_path("settings_white.png")), "Settings", self)
else: else:
settings_action = QAction(QIcon("core/interface/assets/settings_black.png"), "Settings", self) settings_action = QAction(QIcon(get_asset_path("settings_black.png")), "Settings", self)
settings_action.triggered.connect(lambda: settings_dialog(self)) settings_action.triggered.connect(lambda: settings_dialog(self))
toolbar.addAction(settings_action) toolbar.addAction(settings_action)
@@ -261,6 +367,10 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
self.download_timer.timeout.connect(lambda: run_thread(threading.Thread(target=self.download_list_update))) self.download_timer.timeout.connect(lambda: run_thread(threading.Thread(target=self.download_list_update)))
self.download_timer.start(500) self.download_timer.start(500)
self.active_timer = QTimer()
self.active_timer.timeout.connect(self.show_empty_downloads)
self.active_timer.start(500)
@staticmethod @staticmethod
def add_log(text): def add_log(text):
if MainWindow._instance: if MainWindow._instance:
@@ -283,6 +393,7 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
if self.download_model: if self.download_model:
self.download_model.layoutAboutToBeChanged.emit() self.download_model.layoutAboutToBeChanged.emit()
self.download_model.layoutChanged.emit() self.download_model.layoutChanged.emit()
def closeEvent(self, event: QCloseEvent): def closeEvent(self, event: QCloseEvent):
closehelper() closehelper()
@@ -300,9 +411,16 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
self.qtablewidget.hide() self.qtablewidget.hide()
self.emptyResults.show() self.emptyResults.show()
else: else:
self.emptyResults.hide()
self.qtablewidget.show() self.qtablewidget.show()
self.emptyResults.hide()
def show_empty_downloads(self):
if len(state.downloads) > 0:
self.emptyDownload.hide()
self.downloadList.show()
else:
self.emptyDownload.show()
self.downloadList.hide()
# thank you claude # thank you claude
def resizeEvent(self, event): def resizeEvent(self, event):
@@ -312,4 +430,4 @@ class MainWindow(QtWidgets.QMainWindow, QWidget):
+16
View File
@@ -4,6 +4,7 @@ from core.utils.data.state import state
from core.utils.general.logs import update_download_completed_by_hash from core.utils.general.logs import update_download_completed_by_hash
from core.utils.general.logs import consoleLog from core.utils.general.logs import consoleLog
from plyer import notification from plyer import notification
import socket
import time import time
import sys import sys
@@ -42,6 +43,21 @@ def aria2server():
stderr=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
creationflags=subprocess.CREATE_NO_WINDOW if sys.platform == 'win32' else 0 creationflags=subprocess.CREATE_NO_WINDOW if sys.platform == 'win32' else 0
) )
max_checks = 50
for check in range(max_checks):
try:
sock = socket.socket()
sock.settimeout(0.1)
sock.connect(("localhost", 6800))
sock.close()
break
except(ConnectionRefusedError, socket.timeout):
time.sleep(0.1)
else:
raise RuntimeError("Aria2 Server failed to start")
consoleLog("Aria2 Server started")
return aria2server return aria2server
def dlprogress(): def dlprogress():
+5 -2
View File
@@ -8,8 +8,11 @@ def start_client():
consoleLog("Started Aria2p") consoleLog("Started Aria2p")
def add_magnet(uri): def add_magnet(uri):
aria2.add_magnet(uri) if uri is not None and uri.startswith("magnet:?"):
consoleLog("Magnet URI added to Aria2") aria2.add_magnet(uri)
consoleLog("Magnet URI added to Aria2")
else:
consoleLog(f"Invalid Magnet Link: {uri}")
-1
View File
@@ -1,4 +1,3 @@
from core.utils.data.state import state
from core.utils.general.logs import consoleLog from core.utils.general.logs import consoleLog
from core.utils.network.download import run_download_direct from core.utils.network.download import run_download_direct
+2 -2
View File
@@ -165,7 +165,7 @@ def set_main_window(window):
global _main_window global _main_window
_main_window = window _main_window = window
def consoleLog(text): def consoleLog(text, printAnyways = False):
now = datetime.now() now = datetime.now()
current_time = now.strftime("%H:%M:%S") current_time = now.strftime("%H:%M:%S")
@@ -175,5 +175,5 @@ def consoleLog(text):
except Exception: except Exception:
pass pass
if state.debug: if state.debug or printAnyways:
print(f"[{current_time}] {text}") print(f"[{current_time}] {text}")