diff --git a/CHANGELOG.md b/CHANGELOG.md index 1256925..a5038ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [1.0.0] — 2026-10-13 +## [1.3.0] — 2026-10-13 ### Features @@ -16,3 +16,72 @@ ### Build - Migrated project tooling from Poetry to **uv** (`uv.lock`, `uv_build` backend); VS Code configured to use uv as the environment and package manager. + +## [1.2.0] — 2026-06-06 + +### Features + +- Background threading — library refresh, update checks and downloads now run off the GUI thread, so the app no longer freezes during network or disk I/O +- Parallel product-info fetching — up to 16 concurrent requests dramatically speed up library refresh and update checks (previously one request per game, sequentially) +- Download progress — per-file byte progress bar with live transfer speed, plus a Cancel button to abort an in-progress download + +### Improvements + +- "Scan Existing Installers" now matches sanitized folder names and marks detected games as managed, so they appear checked in the Library tab +- In-session caching of product info and owned game IDs in the GOG API client, cleared at the start of each manual refresh +- Atomic writes for `config.json`, metadata and auth tokens — a crash mid-write can no longer corrupt them +- `User-Agent` header now reports the real application version +- File logging to `~/.config/gogupdater/gogupdater.log` (2 MB rotation) plus verbose diagnostics and logging of uncaught exceptions raised inside Qt slots + +### Fixes + +- Background workers were garbage-collected before running, so "Refresh Library" and "Check for Updates" did nothing — workers are now kept alive until their thread finishes +- Download resume no longer corrupts files when the server ignores the HTTP `Range` request (falls back to a full re-download) + +### Tests + +- Added unit tests for folder-name sanitization, version comparison, prune strategies, atomic writes and the threading helpers; rewrote the stale constants test to match the current module + +## [1.1.0] — 2026-05-13 + +### Features + +- Dedicated Pruning tab — global keep-count setting with four strategies: latest N only, latest N + oldest, latest N + one per year, latest N + one per year + oldest +- Per-game pruning overrides — exclude individual games from global pruning or set a custom keep count, configurable via the existing game settings dialog +- Prune confirmation dialog shows a per-platform preview (Windows and Linux pruned independently — no cross-platform version comparison) + +### Changes + +- Pruning controls removed from Status tab and moved to the new Pruning tab +- Fixed bug in `prune_old_versions()`: installer list was reassigned inside the loop and `latest_version` was not updated after pruning + +## [1.0.1] — 2026-05-12 + +### Improvements + +- Version decision cache — ambiguous version comparisons are stored in `config.json`; the dialog is shown only once per version pair, answer is reused on subsequent checks +- Library → Status propagation — after "Refresh Library", the Status tab is automatically populated for both platforms without additional API calls; product data fetched during library refresh is reused directly +- Download logic refactored into `_run_download_for_platform()` shared helper + +## [1.0.0] — 2026-04-09 + +### Features + +- GOG OAuth2 authentication — browser-based login, paste authorization code +- Game library browser with checkboxes for management, DLCs as sub-items +- Windows / Linux platform switcher in Library and Status tabs (games shown only for platforms where installers exist) +- Per-language installer management — each language tracked independently, version comparison per language +- Language selection tab — choose which languages to download globally +- English-only mode — single toggle to skip language subfolders entirely +- Bonus content support — soundtracks, wallpapers, manuals etc. stored in `GameName/Bonus/` +- Per-game settings override — double-click any game in Library to configure languages, english-only and bonus per game +- Folder name sanitization — strips ®, ™, replaces `:` with ` - `, collapses spaces +- Version comparison — numeric dot-separated comparison with GOG suffix stripping; ambiguous versions ask user via dialog +- Status tab — per-language version display, color-coded status (up to date, update available, not downloaded, unversioned) +- Download with resume support (HTTP Range), real filename extracted from CDN URL +- Prune old versions — keep N most recent, configurable per platform +- Metadata integrity check — stale entries (manually deleted files) cleaned automatically on each check +- Scan existing installers — detect already-downloaded files from correct folder structure and import into metadata +- Version history dialog — double-click game in Status tab to see all downloaded versions with delete options +- DLC installers stored in parent game's folder, not separate folders +- Windows-only games do not download bonus content to Linux path and vice versa diff --git a/pyproject.toml b/pyproject.toml index 5061131..e156cd9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "gogupdater" -version = "1.0.0" +version = "1.3.0" description = "Add your description here" readme = "README.md" authors = [ diff --git a/uv.lock b/uv.lock index a34e193..1a86b70 100644 --- a/uv.lock +++ b/uv.lock @@ -184,7 +184,7 @@ wheels = [ [[package]] name = "gogupdater" -version = "1.0.0" +version = "1.3.0" source = { editable = "." } dependencies = [ { name = "loguru" },