# -*- 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))