4.6 KiB
GOGUpdater
Desktop application (PySide6) for automatic management of GOG.com offline installers.
Description
GOGUpdater authenticates with a GOG account via OAuth2, lets the user select which games to manage, and automatically downloads/updates offline installers (Windows .exe, Linux .sh) to local directories. The user has a clear overview of installer status and can trigger checks and downloads manually.
Current version
1.0.0 (2026-04-09)
Architecture
GUI — 5 tabs
- Login — OAuth2 flow, opens login URL in system browser, user pastes authorization code
- Library — owned games with management checkboxes, DLCs as sub-items; Windows/Linux platform switcher; double-click opens per-game settings
- Languages — select which languages to download globally; disabled when English-only mode is on
- Settings — Windows/Linux installer paths, English-only toggle, bonus content toggle, scan existing installers
- Status — installer status per platform (Windows/Linux switcher), check/download/prune controls; double-click opens version history dialog
Installer folder structure
/path/Game Name/1.63/English/setup_game.exe
/path/Game Name/1.63/Czech/setup_game_cs.exe
/path/Game Name/1.52/English/setup_game.exe ← old version kept
/path/Game Name/Bonus/soundtrack.zip ← bonus content (no version subfolder)
Single-language games and English-only mode skip the language subfolder:
/path/Game Name/1.63/setup_game.exe
DLC installers are stored inside the parent game's folder.
Folder name sanitization
Game titles are sanitized before use as folder names:
:→-- Strips
®,™,© - Removes invalid filesystem characters
- Collapses multiple spaces
Metadata
Each target path (windows/linux) contains gogupdater.json tracking downloaded installers and bonus files. Stale entries (files deleted outside the app) are cleaned automatically on each status check.
{
"games": {
"1207658691": {
"name": "Cyberpunk 2077",
"latest_version": "1.63",
"managed": true,
"installers": [
{
"filename": "setup_cyberpunk_2077_1.63.exe",
"size": 12345678,
"version": "1.63",
"language": "en",
"installer_type": "game",
"downloaded_at": "2026-04-09T10:00:00"
}
],
"bonuses": [],
"last_checked": "2026-04-09T10:00:00"
}
}
}
Application configuration
Stored in ~/.config/gogupdater/:
auth.json— OAuth2 tokensconfig.json— paths, languages, managed games, english_only, include_bonus, per-game overrides
GOG API endpoints
GET /user/data/games— list of owned game IDsGET /products/{id}?expand=downloads,expanded_dlcs— game info, installers, bonus content, DLCsPOST https://auth.gog.com/token— OAuth2 authentication and refresh
Download URL resolution
GOG uses a two-level redirect: API downlink → JSON with CDN URL → actual file. The real filename is extracted from the CDN URL path (e.g. setup_fallout_2.1.0.18.exe).
Version comparison
- Strips GOG suffixes like
(gog-3)before comparing - Numeric dot-separated comparison
- Ambiguous cases (e.g.
2.2(gog-3)vs2.3) prompt the user via dialog - Non-version strings like
"bonus"are treated as unversioned
Per-game settings
Each game can override global settings:
- Languages (which languages to download)
- English-only (skip language subfolder)
- Include bonus content
Stored as game_settings in config.json. Default (no override) entries are not saved.
Modules (src/)
auth.py— authentication, token managementapi.py— GOG API client (installers, bonus content, owned games)config.py— application config, metadata store, scan/verify existing installersdownloader.py— installer and bonus file downloads with resume supportmodels.py— data structures (GameRecord, InstallerInfo, BonusContent, GameSettings, ...)version_compare.py— version comparison with ambiguous case detectionconstants.py— version, app title, debug modeui/main_window.py— main window with tab layoutui/tab_auth.py— login tabui/tab_library.py— library tab with platform switcherui/tab_languages.py— language selection tabui/tab_settings.py— settings tabui/tab_status.py— status tab with platform switcherui/dialog_game_settings.py— per-game settings dialogui/dialog_game_versions.py— downloaded version history dialog
Dependencies
- PySide6
- requests
- python-dotenv
- loguru
- tqdm