diff --git a/data/hu.kramo.Cartridges.gschema.xml b/data/hu.kramo.Cartridges.gschema.xml index 15a6ab6..f4a9368 100644 --- a/data/hu.kramo.Cartridges.gschema.xml +++ b/data/hu.kramo.Cartridges.gschema.xml @@ -1,9 +1,9 @@ - - - false - + + + false + false @@ -25,6 +25,12 @@ "~/.var/app/net.lutris.Lutris/cache/lutris" + + "~/.var/app/net.lutris.Lutris/data/lutris/" + + + "~/.var/app/net.lutris.Lutris/cache/lutris" + false @@ -34,19 +40,19 @@ "~/.var/app/com.heroicgameslauncher.hgl/config/heroic/" - - true - - - true - - - true - + + true + + + true + + + true + true - + "~/.var/app/com.usebottles.bottles/data/bottles/" @@ -67,7 +73,7 @@ false - + 1110 @@ -80,13 +86,13 @@ - - - - - + + + + + "a-z" - + \ No newline at end of file diff --git a/src/importer/importer.py b/src/importer/importer.py index 91fcec9..de6256a 100644 --- a/src/importer/importer.py +++ b/src/importer/importer.py @@ -74,21 +74,30 @@ class Importer: # Scan sources in threads threads = [] for source in self.sources: - t = Thread(target=self.__import_source, args=tuple(source,)) # fmt: skip + print(f"{source.full_name}, installed: {source.is_installed}") # ! DEBUG + if not source.is_installed: + continue + t = Thread(target=self.__import_source, args=tuple([source])) # fmt: skip threads.append(t) t.start() + for t in threads: t.join() + # Save games + for game in self.games: + game.save() + self.close_dialog() def __import_source(self, *args, **kwargs): """Source import thread entry point""" # TODO error handling in source iteration + # TODO add SGDB image (move to a game manager) source, *rest = args iterator = source.__iter__() with self.progress_lock: - self.counts[source.id]["total"] = len(iterator) + self.counts[source.id]["total"] = iterator.__len__() for game in iterator: with self.games_lock: self.games.add(game) @@ -96,5 +105,3 @@ class Importer: if not game.blacklisted: self.counts[source.id]["done"] += 1 self.update_progressbar() - # TODO add SGDB image (move to a game manager) - exit(0) diff --git a/src/importer/source.py b/src/importer/source.py index f69957a..c53687d 100644 --- a/src/importer/source.py +++ b/src/importer/source.py @@ -1,9 +1,8 @@ from abc import abstractmethod -from collections.abc import Iterable, Iterator -from enum import IntEnum, auto +from collections.abc import Iterable, Iterator, Sized -class SourceIterator(Iterator): +class SourceIterator(Iterator, Sized): """Data producer for a source of games""" source = None @@ -67,6 +66,12 @@ class Source(Iterable): """The executable format used to construct game executables""" pass + @property + @abstractmethod + def is_installed(self): + """Whether the source is detected as installed""" + pass + @abstractmethod def __iter__(self): """Get the source's iterator, to use in for loops""" diff --git a/src/importer/sources/lutris_source.py b/src/importer/sources/lutris_source.py index 89423a9..c59a7ad 100644 --- a/src/importer/sources/lutris_source.py +++ b/src/importer/sources/lutris_source.py @@ -1,4 +1,4 @@ -from functools import cached_property, cache +from functools import cache from sqlite3 import connect from time import time @@ -65,7 +65,6 @@ class LutrisSourceIterator(SourceIterator): raise e # Create game - row = self.__next_row() values = { "added": int(time()), "hidden": row[4], @@ -98,8 +97,18 @@ class LutrisSource(Source): def game_id_format(self): return super().game_id_format + "_{game_internal_id}" - def __init__(self, win): - super().__init__(win) + @property + def is_installed(self): + try: + self.location + self.cache_location + except FileNotFoundError: + return False + else: + return True + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) def __iter__(self): return LutrisSourceIterator(source=self) @@ -110,13 +119,13 @@ class LutrisNativeSource(LutrisSource): variant = "native" - @cached_property + @property @replaced_by_schema_key("lutris-location") @replaced_by_path("~/.local/share/lutris/") def location(self): raise FileNotFoundError() - @cached_property + @property @replaced_by_schema_key("lutris-cache-location") @replaced_by_path("~/.local/share/lutris/covers") def cache_location(self): @@ -128,13 +137,13 @@ class LutrisFlatpakSource(LutrisSource): variant = "flatpak" - @cached_property + @property @replaced_by_schema_key("lutris-flatpak-location") @replaced_by_path("~/.var/app/net.lutris.Lutris/data/lutris") def location(self): raise FileNotFoundError() - @cached_property + @property @replaced_by_schema_key("lutris-flatpak-cache-location") @replaced_by_path("~/.var/app/net.lutris.Lutris/data/lutris/covers") def cache_location(self): diff --git a/src/main.py b/src/main.py index 60445b2..8a23105 100644 --- a/src/main.py +++ b/src/main.py @@ -149,8 +149,8 @@ class CartridgesApplication(Adw.Application): def on_import_action(self, *_args): importer = Importer(self.win) if self.win.schema.get_boolean("lutris"): - importer.add_source(LutrisNativeSource) - importer.add_source(LutrisFlatpakSource) + importer.add_source(LutrisNativeSource(self.win)) + importer.add_source(LutrisFlatpakSource(self.win)) importer.import_games() def on_remove_game_action(self, *_args): diff --git a/src/utils/decorators.py b/src/utils/decorators.py index 75d5622..e38a017 100644 --- a/src/utils/decorators.py +++ b/src/utils/decorators.py @@ -19,7 +19,8 @@ from functools import wraps def replaced_by_path(path: PathLike): # Decorator builder - """Replace the method's returned path with the override if the override exists on disk""" + """Replace the method's returned path with the override + if the override exists on disk""" def decorator(original_function): # Built decorator (closure) @wraps(original_function) @@ -36,7 +37,8 @@ def replaced_by_path(path: PathLike): # Decorator builder def replaced_by_schema_key(key: str): # Decorator builder - """Replace the method's returned path with the path pointed by the key if it exists on disk""" + """Replace the method's returned path with the path pointed by the key + if it exists on disk""" def decorator(original_function): # Built decorator (closure) @wraps(original_function) @@ -47,7 +49,7 @@ def replaced_by_schema_key(key: str): # Decorator builder except Exception: return original_function(*args, **kwargs) else: - return replaced_by_path(override)(*args, **kwargs) + return replaced_by_path(override)(original_function)(*args, **kwargs) return wrapper