mirror of
https://github.com/ModOrganizer2/modorganizer-basic_games.git
synced 2026-07-27 14:07:29 -07:00
71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
# -*- encoding: utf-8 -*-
|
|||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import itertools
|
||
|
|
import json
|
||
|
|
import os
|
||
|
|
import sys
|
||
|
|
import winreg
|
||
|
|
from collections.abc import Iterable
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
|
||
|
|
def find_epic_games() -> Iterable[tuple[str, Path]]:
|
||
|
|
try:
|
||
|
|
with winreg.OpenKey(
|
||
|
|
winreg.HKEY_LOCAL_MACHINE,
|
||
|
|
r"Software\Wow6432Node\Epic Games\EpicGamesLauncher",
|
||
|
|
) as key:
|
||
|
|
epic_app_data_path, _ = winreg.QueryValueEx(key, "AppDataPath")
|
||
|
|
except FileNotFoundError:
|
||
|
|
return
|
||
|
|
|
||
|
|
manifests_path = Path(os.path.expandvars(epic_app_data_path)).joinpath("Manifests")
|
||
|
|
if manifests_path.exists():
|
||
|
|
for manifest_file_path in manifests_path.glob("*.item"):
|
||
|
|
try:
|
||
|
|
with open(manifest_file_path, encoding="utf-8") as manifest_file:
|
||
|
|
manifest_file_data = json.load(manifest_file)
|
||
|
|
yield manifest_file_data["AppName"], Path(
|
||
|
|
manifest_file_data["InstallLocation"]
|
||
|
|
)
|
||
|
|
except (json.JSONDecodeError, KeyError):
|
||
|
|
print(
|
||
|
|
"Unable to parse Epic Games manifest file",
|
||
|
|
manifest_file_path,
|
||
|
|
file=sys.stderr,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def find_legendary_games() -> Iterable[tuple[str, Path]]:
|
||
|
|
# Based on legendary source:
|
||
|
|
# https://github.com/derrod/legendary/blob/master/legendary/lfs/lgndry.py
|
||
|
|
if config_path := os.environ.get("XDG_CONFIG_HOME"):
|
||
|
|
legendary_config_path = Path(config_path, "legendary")
|
||
|
|
else:
|
||
|
|
legendary_config_path = Path("~/.config/legendary").expanduser()
|
||
|
|
|
||
|
|
installed_path = legendary_config_path / "installed.json"
|
||
|
|
if installed_path.exists():
|
||
|
|
try:
|
||
|
|
with open(installed_path, encoding="utf-8") as installed_file:
|
||
|
|
installed_games = json.load(installed_file)
|
||
|
|
for game in installed_games.values():
|
||
|
|
yield game["app_name"], Path(game["install_path"])
|
||
|
|
except (json.JSONDecodeError, AttributeError, KeyError):
|
||
|
|
print(
|
||
|
|
"Unable to parse installed games from Legendary",
|
||
|
|
installed_path,
|
||
|
|
file=sys.stderr,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def find_games() -> dict[str, Path]:
|
||
|
|
return dict(itertools.chain(find_epic_games(), find_legendary_games()))
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
games = find_games()
|
||
|
|
for k, v in games.items():
|
||
|
|
print("Found game with id {} at {}.".format(k, v))
|