✨ Initial importer work done
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<schemalist gettext-domain="cartridges">
|
||||
<schema id="hu.kramo.Cartridges" path="/hu/kramo/Cartridges/">
|
||||
<key name="exit-after-launch" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
<schema id="hu.kramo.Cartridges" path="/hu/kramo/Cartridges/">
|
||||
<key name="exit-after-launch" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
<key name="cover-launches-game" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
@@ -25,6 +25,12 @@
|
||||
<key name="lutris-cache-location" type="s">
|
||||
<default>"~/.var/app/net.lutris.Lutris/cache/lutris"</default>
|
||||
</key>
|
||||
<key name="lutris-flatpak-location" type="s">
|
||||
<default>"~/.var/app/net.lutris.Lutris/data/lutris/"</default>
|
||||
</key>
|
||||
<key name="lutris-flatpak-cache-location" type="s">
|
||||
<default>"~/.var/app/net.lutris.Lutris/cache/lutris"</default>
|
||||
</key>
|
||||
<key name="lutris-import-steam" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
@@ -34,19 +40,19 @@
|
||||
<key name="heroic-location" type="s">
|
||||
<default>"~/.var/app/com.heroicgameslauncher.hgl/config/heroic/"</default>
|
||||
</key>
|
||||
<key name="heroic-import-epic" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="heroic-import-gog" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="heroic-import-sideload" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="heroic-import-epic" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="heroic-import-gog" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="heroic-import-sideload" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="bottles" type="b">
|
||||
<default>true</default>
|
||||
</key>
|
||||
<key name="bottles-location" type="s">
|
||||
<key name="bottles-location" type="s">
|
||||
<default>"~/.var/app/com.usebottles.bottles/data/bottles/"</default>
|
||||
</key>
|
||||
<key name="itch" type="b">
|
||||
@@ -67,7 +73,7 @@
|
||||
<key name="sgdb-animated" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
</schema>
|
||||
</schema>
|
||||
<schema id="hu.kramo.Cartridges.State" path="/hu/kramo/Cartridges/State/">
|
||||
<key name="width" type="i">
|
||||
<default>1110</default>
|
||||
@@ -80,13 +86,13 @@
|
||||
</key>
|
||||
<key name="sort-mode" type="s">
|
||||
<choices>
|
||||
<choice value="a-z"/>
|
||||
<choice value="z-a"/>
|
||||
<choice value="newest"/>
|
||||
<choice value="oldest"/>
|
||||
<choice value="last_played"/>
|
||||
<choice value="a-z" />
|
||||
<choice value="z-a" />
|
||||
<choice value="newest" />
|
||||
<choice value="oldest" />
|
||||
<choice value="last_played" />
|
||||
</choices>
|
||||
<default>"a-z"</default>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
</schemalist>
|
||||
@@ -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)
|
||||
|
||||
@@ -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"""
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user