Initial importer work done

This commit is contained in:
GeoffreyCoulaud
2023-05-09 11:25:15 +02:00
parent 48ca1d938f
commit 78b91c0d52
6 changed files with 70 additions and 41 deletions

View File

@@ -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)

View File

@@ -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"""

View File

@@ -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):

View File

@@ -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):

View File

@@ -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