diff --git a/data/gtk/preferences.blp b/data/gtk/preferences.blp
index 5026889..f7a71b9 100644
--- a/data/gtk/preferences.blp
+++ b/data/gtk/preferences.blp
@@ -186,6 +186,20 @@ template $PreferencesWindow : Adw.PreferencesWindow {
}
}
}
+
+ Adw.ExpanderRow legendary_expander_row {
+ title: _("Legendary");
+ show-enable-switch: true;
+
+ Adw.ActionRow legendary_action_row {
+ title: _("Legendary Install Location");
+
+ Button legendary_file_chooser_button {
+ icon-name: "folder-symbolic";
+ valign: center;
+ }
+ }
+ }
}
}
diff --git a/data/hu.kramo.Cartridges.gschema.xml.in b/data/hu.kramo.Cartridges.gschema.xml.in
index 9de7f7b..4738807 100644
--- a/data/hu.kramo.Cartridges.gschema.xml.in
+++ b/data/hu.kramo.Cartridges.gschema.xml.in
@@ -55,6 +55,12 @@
"~/.var/app/io.itch.itch/config/itch/"
+
+ true
+
+
+ "~/.config/legendary/"
+
""
diff --git a/src/importer/sources/legendary_source.py b/src/importer/sources/legendary_source.py
index 73ad76f..bbc5b5e 100644
--- a/src/importer/sources/legendary_source.py
+++ b/src/importer/sources/legendary_source.py
@@ -32,7 +32,7 @@ class LegendarySourceIterator(SourceIterator):
"source": self.source.id,
"name": entry["title"],
"game_id": self.source.game_id_format.format(game_id=app_name),
- "executable": self.source.game_id_format.format(app_name=app_name),
+ "executable": self.source.executable_format.format(app_name=app_name),
}
data = {}
@@ -55,17 +55,19 @@ class LegendarySourceIterator(SourceIterator):
# Open library
file = self.source.location / "installed.json"
try:
- library = json.load(file.open())
+ library: dict = json.load(file.open())
except (JSONDecodeError, OSError):
logging.warning("Couldn't open Legendary file: %s", str(file))
return
# Generate games from library
- for entry in library:
+ for entry in library.values():
try:
result = self.game_from_library_entry(entry)
- except KeyError:
+ except KeyError as error:
# Skip invalid games
- logging.warning("Invalid Legendary game skipped in %s", str(file))
+ logging.warning(
+ "Invalid Legendary game skipped in %s", str(file), exc_info=error
+ )
continue
yield result
diff --git a/src/main.py b/src/main.py
index 834e204..52dd8e5 100644
--- a/src/main.py
+++ b/src/main.py
@@ -37,6 +37,7 @@ from src.importer.importer import Importer
from src.importer.sources.bottles_source import BottlesLinuxSource
from src.importer.sources.heroic_source import HeroicLinuxSource, HeroicWindowsSource
from src.importer.sources.itch_source import ItchLinuxSource, ItchWindowsSource
+from src.importer.sources.legendary_source import LegendaryLinuxSource
from src.importer.sources.lutris_source import LutrisLinuxSource
from src.importer.sources.steam_source import SteamLinuxSource, SteamWindowsSource
from src.preferences import PreferencesWindow
@@ -202,6 +203,8 @@ class CartridgesApplication(Adw.Application):
if shared.schema.get_boolean("itch"):
importer.add_source(ItchLinuxSource())
importer.add_source(ItchWindowsSource())
+ if shared.schema.get_boolean("legendary"):
+ importer.add_source(LegendaryLinuxSource())
importer.run()
def on_remove_game_action(self, *_args):
diff --git a/src/preferences.py b/src/preferences.py
index e0a5aff..784fab9 100644
--- a/src/preferences.py
+++ b/src/preferences.py
@@ -76,6 +76,10 @@ class PreferencesWindow(Adw.PreferencesWindow):
itch_action_row = Gtk.Template.Child()
itch_file_chooser_button = Gtk.Template.Child()
+ legendary_expander_row = Gtk.Template.Child()
+ legendary_action_row = Gtk.Template.Child()
+ legendary_file_chooser_button = Gtk.Template.Child()
+
sgdb_key_group = Gtk.Template.Child()
sgdb_key_entry_row = Gtk.Template.Child()
sgdb_switch = Gtk.Template.Child()
@@ -156,6 +160,9 @@ class PreferencesWindow(Adw.PreferencesWindow):
# itch
self.create_preferences(self, "itch", "itch", True)
+ # Legendary
+ self.create_preferences(self, "legendary", "Legendary", True)
+
# SteamGridDB
def sgdb_key_changed(*_args):
shared.schema.set_string("sgdb-key", self.sgdb_key_entry_row.get_text())