Compare commits

...

31 Commits

Author SHA1 Message Date
Vxrtrauter 207eb70f11 Sync README dependencies 2026-05-14 21:10:34 +00:00
shayaa 64144e5ed7 Merge pull request #98 from KeksPirates/dependabot/pip/requests-2.34.2
build(deps): bump requests from 2.34.1 to 2.34.2
2026-05-14 23:10:21 +02:00
dependabot[bot] d05fae7e87 build(deps): bump requests from 2.34.1 to 2.34.2
Bumps [requests](https://github.com/psf/requests) from 2.34.1 to 2.34.2.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.34.1...v2.34.2)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.34.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-14 19:37:56 +00:00
shayaa 9abdec6c33 Merge pull request #97 from KeksPirates/auto/sync-readme-dependencies
Sync README dependencies
2026-05-13 22:08:47 +02:00
Vxrtrauter fb5eb61d05 Sync README dependencies 2026-05-13 20:07:34 +00:00
shayaa eff2164ecc Merge pull request #89 from KeksPirates/dependabot/pip/pyinstaller-6.20.0
build(deps): bump pyinstaller from 6.19.0 to 6.20.0
2026-05-13 22:07:23 +02:00
shayaa d8aa206ea2 Merge pull request #94 from KeksPirates/dependabot/pip/pyside6-essentials-6.11.1
build(deps): bump pyside6-essentials from 6.11.0 to 6.11.1
2026-05-13 22:07:00 +02:00
dependabot[bot] 6de74303ff build(deps): bump pyside6-essentials from 6.11.0 to 6.11.1
Bumps [pyside6-essentials](https://pyside.org) from 6.11.0 to 6.11.1.

---
updated-dependencies:
- dependency-name: pyside6-essentials
  dependency-version: 6.11.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-13 20:06:46 +00:00
shayaa 5eb6314cb2 Merge pull request #96 from KeksPirates/auto/sync-readme-dependencies
Sync README dependencies
2026-05-13 22:05:49 +02:00
Vxrtrauter 179dd0af83 Sync README dependencies 2026-05-13 20:05:32 +00:00
shayaa 365700900f Merge pull request #95 from KeksPirates/dependabot/pip/requests-2.34.1
build(deps): bump requests from 2.34.0 to 2.34.1
2026-05-13 22:05:03 +02:00
dependabot[bot] babbccdc9a build(deps): bump requests from 2.34.0 to 2.34.1
Bumps [requests](https://github.com/psf/requests) from 2.34.0 to 2.34.1.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.34.0...v2.34.1)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.34.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-13 19:47:10 +00:00
shayaa 367ffab86a Merge pull request #93 from KeksPirates/auto/sync-readme-dependencies
Sync README dependencies
2026-05-12 10:57:57 +02:00
Vxrtrauter 71bad60617 Sync README dependencies 2026-05-12 08:46:59 +00:00
shayaa 27758f794c Merge pull request #92 from KeksPirates/dependabot/pip/requests-2.34.0
build(deps): bump requests from 2.33.1 to 2.34.0
2026-05-12 10:46:50 +02:00
dependabot[bot] d82afe8577 build(deps): bump requests from 2.33.1 to 2.34.0
Bumps [requests](https://github.com/psf/requests) from 2.33.1 to 2.34.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.33.1...v2.34.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.34.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-12 02:25:02 +00:00
Vxrtrauter 8592b3058e Merge branch 'main' of https://github.com/KeksPirates/SoftwareManager 2026-05-04 21:51:20 +02:00
Vxrtrauter 7a82e948b9 refactor: remove unused imports 2026-05-04 21:51:18 +02:00
shayaa 782b0b6bc9 Merge pull request #91 from KeksPirates/feat/bzzhr-impl
Add bzzhr implementation and improve file preallocation on Windows
2026-05-04 21:49:51 +02:00
KeksNino 71cc0d9f1f fix: workflows (forgot to git add again) 2026-05-04 20:58:38 +02:00
KeksNino 675dead1d9 fix: readd dependency installation step for linux in workflow
gets rid of pyinstaller warnings and is needed for future appimages
2026-05-04 20:47:05 +02:00
Vxrtrauter 64ca3c76a2 Fix: update buzzheavier link detection logic and improve filename extraction from headers 2026-05-04 19:07:42 +02:00
shayaa d378ee8258 Enhance macOS build process in create-release.yml
Added installation step for create-dmg on macOS and updated artifact handling for macOS builds.
2026-04-24 11:28:56 +02:00
shayaa e9b01426f8 Merge pull request #90 from KeksPirates/feat/crossplatform-updatecheck
Feat/crossplatform updatecheck
2026-04-24 10:37:40 +02:00
Vxrtrauter 631f6592ac Refactor: remove unused imports from update dialog 2026-04-24 10:36:14 +02:00
Vxrtrauter 468faff16b Refactor: streamline update notification logic and enhance settings dialog for cross-platform compatibility 2026-04-24 10:20:26 +02:00
shayaa 6b45c40aad Update GitHub Actions workflow for macOS builds 2026-04-24 09:17:42 +02:00
dependabot[bot] d6302fc43f build(deps): bump pyinstaller from 6.19.0 to 6.20.0
Bumps [pyinstaller](https://github.com/pyinstaller/pyinstaller) from 6.19.0 to 6.20.0.
- [Release notes](https://github.com/pyinstaller/pyinstaller/releases)
- [Changelog](https://github.com/pyinstaller/pyinstaller/blob/develop/doc/CHANGES.rst)
- [Commits](https://github.com/pyinstaller/pyinstaller/compare/v6.19.0...v6.20.0)

---
updated-dependencies:
- dependency-name: pyinstaller
  dependency-version: 6.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-23 19:37:36 +00:00
shayaa e768c7518b Remove Activity section from README
Removed the Activity section and its associated analytics image from the README.
2026-04-18 19:01:34 +02:00
shayaa 49c390131a Merge pull request #87 from KeksPirates/dependabot/github_actions/softprops/action-gh-release-3
build(deps): bump softprops/action-gh-release from 2 to 3
2026-04-18 03:28:01 +02:00
dependabot[bot] 04aaff3b29 build(deps): bump softprops/action-gh-release from 2 to 3
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 20:41:00 +00:00
13 changed files with 130 additions and 45 deletions
+22 -7
View File
@@ -141,7 +141,7 @@ jobs:
if: runner.os == 'macOS'
shell: bash
run: |
pyinstaller --onefile \
pyinstaller --windowed \
--add-data "build_info.json:." \
--exclude-module PyQt6 \
--exclude-module PyQt5 \
@@ -153,6 +153,10 @@ jobs:
--name ${{ env.APP_NAME }} \
src/main.py
- name: Install create-dmg (macOS)
if: runner.os == 'macOS'
run: brew install create-dmg
- name: Rename artifact
shell: bash
run: |
@@ -160,9 +164,20 @@ jobs:
if [ "$RUNNER_OS" == "Windows" ]; then
mv nuitka-build/main.dist dist-final/${{ env.APP_NAME }}
ls -la dist-final/${{ env.APP_NAME }}/
else
elif [ "$RUNNER_OS" == "Linux" ]; then
chmod +x dist/${{ env.APP_NAME }}
mv dist/${{ env.APP_NAME }} dist-final/${{ matrix.artifact_name }}
elif [ "$RUNNER_OS" == "macOS" ]; then
create-dmg \
--volname "${{ env.APP_NAME }}" \
--window-pos 200 120 \
--window-size 600 300 \
--icon-size 100 \
--icon "${{ env.APP_NAME }}.app" 150 150 \
--hide-extension "${{ env.APP_NAME }}.app" \
--app-drop-link 450 150 \
"dist-final/${{ matrix.artifact_name }}.dmg" \
"dist/"
fi
ls -la dist-final/
@@ -203,7 +218,7 @@ jobs:
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.os }}-build
path: dist-final/${{ matrix.artifact_name }}
path: dist-final/${{ matrix.artifact_name }}*
retention-days: 1
release:
@@ -225,8 +240,8 @@ jobs:
cp artifacts/ubuntu-22.04-build/SoftwareManager-stable-*-linux release/SoftwareManager-stable-${SHORT_SHA}-linux
cp artifacts/windows-latest-build/SoftwareManager-stable-*-windows.zip release/SoftwareManager-stable-${SHORT_SHA}-windows.zip
cp artifacts/windows-latest-build/SoftwareManager-stable-*-windows-setup.exe release/SoftwareManager-stable-${SHORT_SHA}-windows-setup.exe
cp artifacts/macos-latest-build/SoftwareManager-stable-*-macos release/SoftwareManager-stable-${SHORT_SHA}-macos
chmod +x release/SoftwareManager-stable-*-linux release/SoftwareManager-stable-*-macos
cp artifacts/macos-latest-build/SoftwareManager-stable-*-macos.dmg release/SoftwareManager-stable-${SHORT_SHA}-macos.dmg
chmod +x release/SoftwareManager-stable-*-linux
ls -la release/
- name: Generate checksums
@@ -236,7 +251,7 @@ jobs:
cat SHA256SUMS.txt
- name: Create Release (Public)
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
with:
token: ${{ secrets.RELEASE_TOKEN }}
tag_name: ${{ needs.build.outputs.version }}
@@ -246,5 +261,5 @@ jobs:
release/SoftwareManager-stable-${{ needs.build.outputs.short_sha }}-linux
release/SoftwareManager-stable-${{ needs.build.outputs.short_sha }}-windows.zip
release/SoftwareManager-stable-${{ needs.build.outputs.short_sha }}-windows-setup.exe
release/SoftwareManager-stable-${{ needs.build.outputs.short_sha }}-macos
release/SoftwareManager-stable-${{ needs.build.outputs.short_sha }}-macos.dmg
release/SHA256SUMS.txt
+11 -2
View File
@@ -58,6 +58,15 @@ jobs:
env:
UV_SYSTEM_PYTHON: 1
- name: Install dependencies (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y \
libxcb-cursor0 libxcb-render-util0 libxcb-xkb1 \
libxcb-icccm4 libxcb-keysyms1 libxcb-image0 \
libxcb-shape0 libxcb-util1 libxkbcommon-x11-0
- name: Install Nuitka (Windows only)
if: runner.os == 'Windows'
run: uv pip install nuitka
@@ -266,7 +275,7 @@ jobs:
cat release_notes.md
- name: Create Release (Public)
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v3
with:
tag_name: ${{ needs.build.outputs.version }}
name: ${{ needs.build.outputs.version }}
@@ -278,4 +287,4 @@ jobs:
release/SoftwareManager-dev-${{ needs.build.outputs.short_sha }}-macos
release/SHA256SUMS.txt
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+19 -4
View File
@@ -14,7 +14,7 @@ jobs:
build:
name: Build ${{ matrix.os }}
strategy:
fail-fast: false # keep other platforms building even if one fails
fail-fast: false
matrix:
include:
- os: ubuntu-22.04
@@ -138,7 +138,7 @@ jobs:
if: runner.os == 'macOS'
shell: bash
run: |
pyinstaller --onefile \
pyinstaller --windowed \
--add-data "build_info.json:." \
--exclude-module PyQt6 \
--exclude-module PyQt5 \
@@ -150,15 +150,30 @@ jobs:
--name ${{ env.APP_NAME }} \
src/main.py
- name: Install create-dmg (macOS)
if: runner.os == 'macOS'
run: brew install create-dmg
- name: Stage artifact
shell: bash
run: |
mkdir -p dist-final
if [ "$RUNNER_OS" == "Windows" ]; then
mv nuitka-build/main.dist dist-final/${{ env.APP_NAME }}
else
elif [ "$RUNNER_OS" == "Linux" ]; then
chmod +x dist/${{ env.APP_NAME }}
mv dist/${{ env.APP_NAME }} dist-final/${{ matrix.artifact_name }}
elif [ "$RUNNER_OS" == "macOS" ]; then
create-dmg \
--volname "${{ env.APP_NAME }} Test" \
--window-pos 200 120 \
--window-size 600 300 \
--icon-size 100 \
--icon "${{ env.APP_NAME }}.app" 150 150 \
--hide-extension "${{ env.APP_NAME }}.app" \
--app-drop-link 450 150 \
"dist-final/${{ matrix.artifact_name }}.dmg" \
"dist/"
fi
ls -la dist-final/
@@ -181,5 +196,5 @@ jobs:
uses: actions/upload-artifact@v7
with:
name: ${{ matrix.os }}-build
path: dist-final/${{ matrix.artifact_name }}
path: dist-final/${{ matrix.artifact_name }}*
retention-days: 7
+3 -7
View File
@@ -41,11 +41,11 @@ SoftwareManager is a Python-based GUI tool that simplifies searching and downloa
<!-- python-dependencies:start -->
```text
requests (2.33.1)
PySide6-Essentials (6.11.0)
requests (2.34.2)
PySide6-Essentials (6.11.1)
beautifulsoup4 (4.14.3)
darkdetect (0.7.1)
pyinstaller (6.19.0)
pyinstaller (6.20.0)
PyQtDarkTheme-fork (2.3.6)
plyer (2.1.0)
psutil (7.2.2)
@@ -55,10 +55,6 @@ SoftwareManager is a Python-based GUI tool that simplifies searching and downloa
```
<!-- python-dependencies:end -->
## Activity
![Alt](https://repobeats.axiom.co/api/embed/3a61ea02ffdeb9ed5dd948d974a21e0d6cfae36c.svg "Repobeats analytics image")
## Star History
<a href="https://www.star-history.com/#KeksPirates/SoftwareManager&type=date&legend=top-left">
+3 -3
View File
@@ -1,8 +1,8 @@
requests==2.33.1
PySide6-Essentials==6.11.0
requests==2.34.2
PySide6-Essentials==6.11.1
beautifulsoup4==4.14.3
darkdetect==0.7.1
pyinstaller==6.19.0
pyinstaller==6.20.0
PyQtDarkTheme-fork==2.3.6
plyer==2.1.0
psutil==7.2.2
+1 -1
View File
@@ -113,7 +113,7 @@ class SteamripScraper:
try:
consoleLog(f"Found download link: {best}")
if "buzzheavier" in best:
if "buzzheavier" or "bzzhr" in best:
link = scrape_buzzheavier(best)
return link
elif "gofile" in best:
-1
View File
@@ -12,7 +12,6 @@ import threading
import webbrowser
import subprocess
import platform
import time
import os
+2 -3
View File
@@ -79,9 +79,8 @@ def settings_dialog(self):
# Ignore Updates checkbox
update_checkbox_container, update_checkbox = create_widget(QCheckBox, "Ignore Updates: ")
if platform.system() == "Windows":
update_checkbox.setChecked(state.ignore_updates)
update_checkbox.toggled.connect(lambda checked: setattr(state, 'ignore_updates', checked))
update_checkbox.setChecked(state.ignore_updates)
update_checkbox.toggled.connect(lambda checked: setattr(state, 'ignore_updates', checked))
# Autoresume Container Checkbox
autoresume_container, autoresume_checkbox = create_widget(QCheckBox, "Auto-Resume Downloads: ")
+47 -13
View File
@@ -1,13 +1,17 @@
from PySide6.QtWidgets import QDialog, QMessageBox, QCheckBox
from utils.network.update_checker import get_updates
from PySide6.QtWidgets import QDialog, QMessageBox
from utils.network.updater import download_update
from utils.config.config import create_config
from utils.logging.logs import consoleLog
from utils.data.state import state
from pathlib import Path
import webbrowser
import platform
import json
import os
RELEASES_URL = "https://github.com/KeksPirates/SoftwareManager/releases/latest"
def _get_build_info_path() -> (Path | None):
current_dir = Path(__file__).resolve().parent
@@ -31,19 +35,49 @@ def get_version() -> None:
else:
consoleLog(f"Could not find build info file (Path: {build_info_path})")
def _show_notify_dialog(latest: str) -> None:
msg = QMessageBox()
msg.setIcon(QMessageBox.Icon.Information)
msg.setWindowTitle("Update Available")
msg.setText(f"A new version is available: <b>{latest}</b>")
msg.setInformativeText("Visit the releases page to download it.")
dont_show = QCheckBox("Don't show again")
msg.setCheckBox(dont_show)
open_btn = msg.addButton("Open Releases Page", QMessageBox.ButtonRole.AcceptRole)
msg.addButton("Dismiss", QMessageBox.ButtonRole.RejectRole)
msg.exec()
if dont_show.isChecked():
state.ignore_updates = True
create_config()
if msg.clickedButton() == open_btn:
webbrowser.open(RELEASES_URL)
class UpdateDialog(QDialog):
def __init__(self, parent=None):
if state.ignore_updates is False and platform.system() == "Windows":
if state.ignore_updates:
return
assets, latest = get_updates()
if assets != None:
msg = QMessageBox()
msg.setIcon(QMessageBox.Icon.Information)
msg.setWindowTitle("Update Available")
msg.setText(f"A new version is available\n({latest})")
msg.setInformativeText("Press Ok to download.")
msg.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Ignore)
response = msg.exec_()
if response == QMessageBox.StandardButton.Ok:
download_update(assets)
assets, latest = get_updates()
if assets is None:
return
if platform.system() == "Windows":
msg = QMessageBox()
msg.setIcon(QMessageBox.Icon.Information)
msg.setWindowTitle("Update Available")
msg.setText(f"A new version is available\n({latest})")
msg.setInformativeText("Press Ok to download.")
msg.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Ignore)
response = msg.exec_()
if response == QMessageBox.StandardButton.Ok:
download_update(assets)
else:
_show_notify_dialog(latest)
+3 -1
View File
@@ -20,12 +20,14 @@ def add_direct_download(url: str, title: str, dl_path: Optional[str] = None, hea
consoleLog(f"Download already active: {title}")
return
filename = (
raw_filename = (
detect_filename_from_headers(url, DirectDownloadHandle.USER_AGENT)
or extract_filename_from_url(url)
or sanitize_filename(title) + ".zip"
)
filename = sanitize_filename(raw_filename)
handle = DirectDownloadHandle(url, filename, dl_path, headers, single_threaded)
with state.downloads_lock:
state.active_downloads[url] = handle
+18 -1
View File
@@ -10,6 +10,7 @@ import requests
import hashlib
import json
import time
import sys
import os
@@ -231,8 +232,24 @@ class DirectDownloadHandle:
def _preallocate_file(self, total_size: int):
if os.path.exists(self._file_path) and os.path.getsize(self._file_path) == total_size:
return
with open(self._file_path, "wb") as f:
f.truncate(total_size)
if sys.platform == "win32":
import msvcrt
import ctypes
from ctypes.wintypes import DWORD
handle = msvcrt.get_osfhandle(f.fileno())
kernel32 = ctypes.windll.kernel32
bytes_returned = DWORD()
kernel32.DeviceIoControl(
handle, 590020, None, 0, None, 0, ctypes.byref(bytes_returned), None
)
kernel32.SetFilePointerEx(handle, ctypes.c_int64(total_size), None, 0)
kernel32.SetEndOfFile(handle)
else:
f.truncate(total_size)
def _compute_chunks(self, total_size: int) -> list[ChunkSpec]:
num_chunks = min(self.NUM_THREADS, max(1, total_size // self.MIN_CHUNK_SIZE))
+1 -1
View File
@@ -34,7 +34,7 @@ def detect_filename_from_headers(url: str, user_agent: str) -> Optional[str]:
if "filename=" in cd:
parts = cd.split("filename=")
if len(parts) > 1:
fname = parts[-1].strip().strip('"').strip("'")
fname = parts[1].split(";")[0].strip().strip('"').strip("'")
if fname:
return fname
except Exception as e:
-1
View File
@@ -4,7 +4,6 @@ from PySide6.QtCore import QObject, QTimer
from utils.data.state import state
from plyer import notification
import libtorrent as lt
import time
import os