diff --git a/rare/shared/workers/wine_resolver.py b/rare/shared/workers/wine_resolver.py index c095e248..891bd71a 100644 --- a/rare/shared/workers/wine_resolver.py +++ b/rare/shared/workers/wine_resolver.py @@ -98,17 +98,23 @@ class OriginWineWorker(QRunnable): # lk: this is the alternative way of getting the path by using wine itself install_dir = wine.query_reg_key(wine_exec, wine_env, f"HKLM\\{reg_path}", reg_key) - logger.debug("Found Wine install directory %s", install_dir) - if install_dir: + logger.debug("Found Wine install directory %s", install_dir) install_dir = wine.convert_to_unix_path(wine_exec, wine_env, install_dir) - logger.debug("Found Unix install directory %s", install_dir) + if install_dir: + logger.debug("Found Unix install directory %s", install_dir) + else: + logger.info("Could not find Unix install directory for %s", rgame.title) + else: + logger.info("Could not find Wine install directory for %s", rgame.title) if install_dir: if os.path.isdir(install_dir): install_size = path_size(install_dir) rgame.set_origin_attributes(install_dir, install_size) - logger.debug(f"Origin game {rgame.title} ({install_dir}, {format_size(install_size)})") + logger.info("Origin game %s (%s, %s)", rgame.title, install_dir, format_size(install_size)) else: - logger.warning(f"Origin game {rgame.title} ({install_dir} does not exist)") - logger.info(f"Origin worker finished in {time.time() - t}s") + logger.warning("Origin game %s (%s does not exist)", rgame.title, install_dir) + else: + logger.info("Origin game %s is not installed", rgame.title) + logger.info("Origin worker finished in %ss", time.time() - t) diff --git a/rare/utils/wine.py b/rare/utils/wine.py index 0d7e963e..9106884f 100644 --- a/rare/utils/wine.py +++ b/rare/utils/wine.py @@ -28,17 +28,20 @@ def execute(cmd: List, wine_env: Mapping) -> Tuple[str, str]: for name, value in wine_env.items(): flatpak_cmd.append(f"--env={name}={value}") cmd = flatpak_cmd + cmd - proc = subprocess.Popen( - cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - # Use the current environment if we are in flatpak or our own if we are on host - # In flatpak our environment is passed through `flatpak-spawn` arguments - env=os.environ.copy() if os.environ.get("container") == "flatpak" else wine_env, - shell=False, - text=True, - ) - res = proc.communicate() + try: + proc = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + # Use the current environment if we are in flatpak or our own if we are on host + # In flatpak our environment is passed through `flatpak-spawn` arguments + env=os.environ.copy() if os.environ.get("container") == "flatpak" else wine_env, + shell=False, + text=True, + ) + res = proc.communicate() + except (FileNotFoundError, PermissionError) as e: + res = ("", str(e)) return res @@ -49,7 +52,11 @@ def resolve_path(wine_exec: str, wine_env: Mapping, path: str) -> str: # lk: if path exists and needs a case-sensitive interpretation form # cmd = [wine_cmd, 'cmd', '/c', f'cd {path} & cd'] out, err = execute(cmd, wine_env) - return out.strip().strip('"') + out, err = out.strip(), err.strip() + if not out: + logger.error("Failed to resolve wine path due to \"%s\"", err) + return out + return out.strip('"') def query_reg_path(wine_exec: str, wine_env: Mapping, reg_path: str): @@ -59,6 +66,10 @@ def query_reg_path(wine_exec: str, wine_env: Mapping, reg_path: str): def query_reg_key(wine_exec: str, wine_env: Mapping, reg_path: str, reg_key) -> str: cmd = [wine_exec, "reg", "query", reg_path, "/v", reg_key] out, err = execute(cmd, wine_env) + out, err = out.strip(), err.strip() + if not out: + logger.error("Failed to query registry key due to \"%s\"", err) + return out lines = out.split("\n") keys: Dict = {} for line in lines: @@ -76,7 +87,10 @@ def convert_to_unix_path(wine_exec: str, wine_env: Mapping, path: str) -> str: path = path.strip().strip('"') cmd = [wine_exec, "winepath.exe", "-u", path] out, err = execute(cmd, wine_env) - return os.path.realpath(out.strip()) + out, err = out.strip(), err.strip() + if not out: + logger.error("Failed to convert to unix path due to \"%s\"", err) + return os.path.realpath(out) if (out := out.strip()) else out def wine(core: LegendaryCore, app_name: str = "default") -> str: