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