Compare commits
4 Commits
c7bed80570
...
8e34c92385
Author | SHA1 | Date | |
---|---|---|---|
8e34c92385
|
|||
d50b63bca7
|
|||
6966253e9b
|
|||
13f3af7a42
|
@@ -12,10 +12,13 @@
|
|||||||
- Уменьшена длительность анимации открытия карточки с 800 до 350мс
|
- Уменьшена длительность анимации открытия карточки с 800 до 350мс
|
||||||
- Контекстное меню при открытие теперь сразу фокусируется на первом элементе
|
- Контекстное меню при открытие теперь сразу фокусируется на первом элементе
|
||||||
- Анимации теперь можно настраивать через темы (за подробностями в документацию)
|
- Анимации теперь можно настраивать через темы (за подробностями в документацию)
|
||||||
|
- Общие json (steam_apps и anticheat_games) теперь перекачиваются если сломаны
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- legendary list теперь не вызывается если вход в EGS не был произведён
|
- legendary list теперь не вызывается если вход в EGS не был произведён
|
||||||
- Скриншоты тем теперь не теряют в качестве при масштабе отличном от 100%
|
- Скриншоты тем теперь не теряют в качестве при масштабе отличном от 100%
|
||||||
|
- Данные от HLTB теперь не отображаются в карточке если нет данных о времени прохождения
|
||||||
|
- Диалог добавления игры теперь не добавляет игру если exe не существует
|
||||||
|
|
||||||
|
|
||||||
### Contributors
|
### Contributors
|
||||||
|
@@ -677,7 +677,10 @@ class AddGameDialog(QDialog):
|
|||||||
exe_path = self.exeEdit.text().strip()
|
exe_path = self.exeEdit.text().strip()
|
||||||
name = self.nameEdit.text().strip()
|
name = self.nameEdit.text().strip()
|
||||||
|
|
||||||
if not exe_path or not name:
|
if not exe_path or not os.path.isfile(exe_path):
|
||||||
|
return None, None
|
||||||
|
|
||||||
|
if not name:
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
portproton_path = get_portproton_location()
|
portproton_path = get_portproton_location()
|
||||||
|
@@ -219,9 +219,11 @@ class ResultParser:
|
|||||||
("comp_plus", "main_extra"),
|
("comp_plus", "main_extra"),
|
||||||
("comp_100", "completionist")
|
("comp_100", "completionist")
|
||||||
]
|
]
|
||||||
|
all_zero = all(game_data.get(json_field, 0) == 0 for json_field, _ in time_fields)
|
||||||
for json_field, attr_name in time_fields:
|
for json_field, attr_name in time_fields:
|
||||||
if json_field in game_data:
|
if json_field in game_data:
|
||||||
time_hours = round(game_data[json_field] / 3600, 2)
|
time_seconds = game_data[json_field]
|
||||||
|
time_hours = None if all_zero else round(time_seconds / 3600, 2)
|
||||||
setattr(game, attr_name, time_hours)
|
setattr(game, attr_name, time_hours)
|
||||||
game.similarity = self._calculate_similarity(game)
|
game.similarity = self._calculate_similarity(game)
|
||||||
return game
|
return game
|
||||||
|
@@ -291,7 +291,7 @@ def load_steam_apps_async(callback: Callable[[list], None]):
|
|||||||
if os.path.exists(cache_tar):
|
if os.path.exists(cache_tar):
|
||||||
os.remove(cache_tar)
|
os.remove(cache_tar)
|
||||||
logger.info("Archive %s deleted after extraction", cache_tar)
|
logger.info("Archive %s deleted after extraction", cache_tar)
|
||||||
steam_apps = data.get("applist", {}).get("apps", []) if isinstance(data, dict) else data or []
|
steam_apps = data if isinstance(data, list) else []
|
||||||
logger.info("Loaded %d apps from archive", len(steam_apps))
|
logger.info("Loaded %d apps from archive", len(steam_apps))
|
||||||
callback(steam_apps)
|
callback(steam_apps)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -303,12 +303,25 @@ def load_steam_apps_async(callback: Callable[[list], None]):
|
|||||||
try:
|
try:
|
||||||
with open(cache_json, "rb") as f:
|
with open(cache_json, "rb") as f:
|
||||||
data = orjson.loads(f.read())
|
data = orjson.loads(f.read())
|
||||||
steam_apps = data.get("applist", {}).get("apps", []) if isinstance(data, dict) else data or []
|
# Validate JSON structure
|
||||||
|
if not isinstance(data, list):
|
||||||
|
logger.error("Cached JSON %s has invalid format (not a list), re-downloading", cache_json)
|
||||||
|
raise ValueError("Invalid JSON structure")
|
||||||
|
# Validate each app entry
|
||||||
|
for app in data:
|
||||||
|
if not isinstance(app, dict) or "appid" not in app or "normalized_name" not in app:
|
||||||
|
logger.error("Cached JSON %s contains invalid app entry, re-downloading", cache_json)
|
||||||
|
raise ValueError("Invalid app entry structure")
|
||||||
|
steam_apps = data
|
||||||
logger.info("Loaded %d apps from cache", len(steam_apps))
|
logger.info("Loaded %d apps from cache", len(steam_apps))
|
||||||
callback(steam_apps)
|
callback(steam_apps)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error("Error reading cached JSON: %s", e)
|
logger.error("Error reading or validating cached JSON %s: %s", cache_json, e)
|
||||||
callback([])
|
# Attempt to re-download if cache is invalid or corrupted
|
||||||
|
app_list_url = (
|
||||||
|
"https://git.linux-gaming.ru/Boria138/PortProtonQt/raw/branch/main/data/games_appid.tar.xz"
|
||||||
|
)
|
||||||
|
downloader.download_async(app_list_url, cache_tar, timeout=5, callback=process_tar)
|
||||||
else:
|
else:
|
||||||
app_list_url = (
|
app_list_url = (
|
||||||
"https://git.linux-gaming.ru/Boria138/PortProtonQt/raw/branch/main/data/games_appid.tar.xz"
|
"https://git.linux-gaming.ru/Boria138/PortProtonQt/raw/branch/main/data/games_appid.tar.xz"
|
||||||
@@ -448,12 +461,25 @@ def load_weanticheatyet_data_async(callback: Callable[[list], None]):
|
|||||||
try:
|
try:
|
||||||
with open(cache_json, "rb") as f:
|
with open(cache_json, "rb") as f:
|
||||||
data = orjson.loads(f.read())
|
data = orjson.loads(f.read())
|
||||||
anti_cheat_data = data or []
|
# Validate JSON structure
|
||||||
|
if not isinstance(data, list):
|
||||||
|
logger.error("Cached JSON %s has invalid format (not a list), re-downloading", cache_json)
|
||||||
|
raise ValueError("Invalid JSON structure")
|
||||||
|
# Validate each anti-cheat entry
|
||||||
|
for entry in data:
|
||||||
|
if not isinstance(entry, dict) or "normalized_name" not in entry or "status" not in entry:
|
||||||
|
logger.error("Cached JSON %s contains invalid anti-cheat entry, re-downloading", cache_json)
|
||||||
|
raise ValueError("Invalid anti-cheat entry structure")
|
||||||
|
anti_cheat_data = data
|
||||||
logger.info("Loaded %d anti-cheat entries from cache", len(anti_cheat_data))
|
logger.info("Loaded %d anti-cheat entries from cache", len(anti_cheat_data))
|
||||||
callback(anti_cheat_data)
|
callback(anti_cheat_data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error("Error reading cached WeAntiCheatYet JSON: %s", e)
|
logger.error("Error reading or validating cached WeAntiCheatYet JSON %s: %s", cache_json, e)
|
||||||
callback([])
|
# Attempt to re-download if cache is invalid or corrupted
|
||||||
|
app_list_url = (
|
||||||
|
"https://git.linux-gaming.ru/Boria138/PortProtonQt/raw/branch/main/data/anticheat_games.tar.xz"
|
||||||
|
)
|
||||||
|
downloader.download_async(app_list_url, cache_tar, timeout=5, callback=process_tar)
|
||||||
else:
|
else:
|
||||||
app_list_url = (
|
app_list_url = (
|
||||||
"https://git.linux-gaming.ru/Boria138/PortProtonQt/raw/branch/main/data/anticheat_games.tar.xz"
|
"https://git.linux-gaming.ru/Boria138/PortProtonQt/raw/branch/main/data/anticheat_games.tar.xz"
|
||||||
|
Reference in New Issue
Block a user