From e2a2ea6da2fd2f29cc04dd82827505b174ece99f Mon Sep 17 00:00:00 2001 From: kramo <93832451+kra-mo@users.noreply.github.com> Date: Wed, 15 Mar 2023 13:12:48 +0100 Subject: [PATCH] Add developer property --- data/gtk/window.blp | 14 ++++++ hu.kramo.Cartridges.json | 15 +----- python3-modules.json | 75 ++++++++++++++++++++++++++++++ src/game.py | 7 +-- src/utils/create_details_window.py | 15 +++++- src/utils/heroic_parser.py | 4 +- src/utils/steam_parser.py | 16 +++++++ src/window.py | 7 +++ 8 files changed, 132 insertions(+), 21 deletions(-) create mode 100644 python3-modules.json diff --git a/data/gtk/window.blp b/data/gtk/window.blp index 33f5b7d..e24d27b 100644 --- a/data/gtk/window.blp +++ b/data/gtk/window.blp @@ -99,6 +99,20 @@ template CartridgesWindow : Adw.ApplicationWindow { "title-1", ] } + + Label overview_developer { + margin-top: 3; + hexpand: true; + halign: start; + wrap: true; + wrap-mode: word_char; + natural-wrap-mode: word; + + styles [ + "heading" + ] + } + Label overview_added { margin-top: 12; hexpand: true; diff --git a/hu.kramo.Cartridges.json b/hu.kramo.Cartridges.json index 40a20d3..7d07a4f 100644 --- a/hu.kramo.Cartridges.json +++ b/hu.kramo.Cartridges.json @@ -29,20 +29,7 @@ "*.a" ], "modules" : [ - { - "name": "python3-PyYAML", - "buildsystem": "simple", - "build-commands": [ - "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"PyYAML>=6.0\" --no-build-isolation" - ], - "sources": [ - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/36/2b/61d51a2c4f25ef062ae3f74576b01638bebad5e045f747ff12643df63844/PyYAML-6.0.tar.gz", - "sha256": "68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2" - } - ] - }, + "python3-modules.json", { "name": "blueprint-compiler", "buildsystem": "meson", diff --git a/python3-modules.json b/python3-modules.json new file mode 100644 index 0000000..a5b1d30 --- /dev/null +++ b/python3-modules.json @@ -0,0 +1,75 @@ +{ + "name": "python3-modules", + "buildsystem": "simple", + "build-commands": [], + "modules": [ + { + "name": "python3-pyyaml", + "buildsystem": "simple", + "build-commands": [ + "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"pyyaml\" --no-build-isolation" + ], + "sources": [ + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/36/2b/61d51a2c4f25ef062ae3f74576b01638bebad5e045f747ff12643df63844/PyYAML-6.0.tar.gz", + "sha256": "68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2" + } + ] + }, + { + "name": "python3-steam", + "buildsystem": "simple", + "build-commands": [ + "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"steam\" --no-build-isolation" + ], + "sources": [ + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/db/14/2b48a834d349eee94677e8702ea2ef98b7c674b090153ea8d3f6a788584e/cachetools-5.3.0-py3-none-any.whl", + "sha256": "429e1a1e845c008ea6c85aa35d4b98b65d6a9763eeef3e37e92728a12d1de9d4" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/71/4c/3db2b8021bd6f2f0ceb0e088d6b2d49147671f25832fb17970e9b583d742/certifi-2022.12.7-py3-none-any.whl", + "sha256": "4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/ff/d7/8d757f8bd45be079d76309248845a04f09619a7b17d6dfc8c9ff6433cac2/charset-normalizer-3.1.0.tar.gz", + "sha256": "34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", + "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/3d/07/cfd8f52b9068877801317d26dc7225e19421bc659e1395d2cd6933b1a351/pycryptodomex-3.17.tar.gz", + "sha256": "0af93aad8d62e810247beedef0261c148790c52f3cd33643791cc6396dd217c1" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/d2/f4/274d1dbe96b41cf4e0efb70cbced278ffd61b5c7bb70338b62af94ccb25b/requests-2.28.2-py3-none-any.whl", + "sha256": "64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/9a/31/62ac25584988182dee5ee949395e08943ff8b11634dc33abab7078d28433/steam-1.4.4.tar.gz", + "sha256": "2b5bd6911c0d4a7312f441b8d162b9d8d47c8bebb8efc6c8867393b0323fa52e" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/7b/f5/890a0baca17a61c1f92f72b81d3c31523c99bec609e60c292ea55b387ae8/urllib3-1.26.15-py2.py3-none-any.whl", + "sha256": "aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42" + }, + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/96/60/6456b687cf55cf60020dcd01f9bc51561c3cc84f05fd8e0feb71ce60f894/vdf-3.4-py2.py3-none-any.whl", + "sha256": "68c1a125cc49e343d535af2dd25074e9cb0908c6607f073947c4a04bbe234534" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/game.py b/src/game.py index 6529b51..6e8bc0b 100644 --- a/src/game.py +++ b/src/game.py @@ -46,11 +46,8 @@ class game(Gtk.Box): self.hidden = data["hidden"] self.last_played = data["last_played"] self.name = data["name"] - - if "removed" in data.keys(): - self.removed = True - else: - self.removed = False + self.developer = data["developer"] if "developer" in data.keys() else None + self.removed = "removed" in data.keys() self.pixbuf = get_cover(self.game_id, self.parent_widget) diff --git a/src/utils/create_details_window.py b/src/utils/create_details_window.py index a8f26a3..9746259 100644 --- a/src/utils/create_details_window.py +++ b/src/utils/create_details_window.py @@ -31,7 +31,7 @@ from .save_games import save_games def create_details_window(parent_widget, game_id=None): window = Adw.Window( - modal=True, default_width=450, default_height=650, transient_for=parent_widget + modal=True, default_width=450, default_height=750, transient_for=parent_widget ) games = parent_widget.games @@ -41,11 +41,15 @@ def create_details_window(parent_widget, game_id=None): window.set_title(_("Add New Game")) cover = Gtk.Picture.new_for_pixbuf(parent_widget.placeholder_pixbuf) name = Gtk.Entry() + developer = Gtk.Entry() executable = Gtk.Entry() apply_button = Gtk.Button.new_with_label(_("Confirm")) else: window.set_title(_("Edit Game Details")) cover = Gtk.Picture.new_for_pixbuf(get_cover(game_id, parent_widget)) + developer = Gtk.Entry.new_with_buffer( + Gtk.EntryBuffer.new(games[game_id].developer, -1) + ) name = Gtk.Entry.new_with_buffer(Gtk.EntryBuffer.new(games[game_id].name, -1)) executable = Gtk.Entry.new_with_buffer( Gtk.EntryBuffer.new((games[game_id].executable), -1) @@ -92,6 +96,12 @@ def create_details_window(parent_widget, game_id=None): ) title_group.add(name) + developer_group = Adw.PreferencesGroup( + title=_("Developer"), + description=_("The developer or publisher (optional)"), + ) + developer_group.add(developer) + exec_group = Adw.PreferencesGroup( title=_("Executable"), description=_("File to open or command to run when launching the game"), @@ -101,6 +111,7 @@ def create_details_window(parent_widget, game_id=None): general_page = Adw.PreferencesPage() general_page.add(cover_group) general_page.add(title_group) + general_page.add(developer_group) general_page.add(exec_group) cancel_button = Gtk.Button.new_with_label(_("Cancel")) @@ -142,6 +153,7 @@ def create_details_window(parent_widget, game_id=None): values = {} final_name = name.get_buffer().get_text() + final_developer = developer.get_buffer().get_text() final_executable = executable.get_buffer().get_text() if game_id is None: @@ -195,6 +207,7 @@ def create_details_window(parent_widget, game_id=None): save_cover(None, parent_widget, None, pixbuf, game_id) values["name"] = final_name + values["developer"] = final_developer if final_developer else None values["executable"] = final_executable path = os.path.join( diff --git a/src/utils/heroic_parser.py b/src/utils/heroic_parser.py index 91da35d..fef4e39 100644 --- a/src/utils/heroic_parser.py +++ b/src/utils/heroic_parser.py @@ -113,6 +113,7 @@ def heroic_parser(parent_widget, action): continue values["name"] = game["title"] + values["developer"] = game["developer"] values["executable"] = "xdg-open heroic://launch/" + app_name values["hidden"] = False values["source"] = "heroic_epic" @@ -153,7 +154,7 @@ def heroic_parser(parent_widget, action): ): continue - # Get game title from library.json as it's not present in installed.json + # Get game title and developer from library.json as they are not present in installed.json with open( os.path.join(heroic_dir, "gog_store", "library.json"), "r" ) as open_file: @@ -162,6 +163,7 @@ def heroic_parser(parent_widget, action): library = json.loads(data) for game in library["games"]: if game["app_name"] == app_name: + values["developer"] = game["developer"] values["name"] = game["title"] image_path = os.path.join( heroic_dir, diff --git a/src/utils/steam_parser.py b/src/utils/steam_parser.py index 926c499..3d5a830 100644 --- a/src/utils/steam_parser.py +++ b/src/utils/steam_parser.py @@ -22,6 +22,7 @@ import re import time from gi.repository import GLib, Gtk +from steam.utils.appcache import parse_appinfo from .create_dialog import create_dialog from .save_cover import save_cover @@ -92,6 +93,17 @@ def steam_parser(parent_widget, action): if os.path.isfile(path) and "appmanifest" in open_file: appmanifests.append(path) + with open("/home/kramo/.steam/steam/appcache/appinfo.vdf", "rb") as open_file: + _header, apps = parse_appinfo(open_file) + + developers = { + app["appid"]: app["data"]["appinfo"]["common"]["associations"]["0"]["name"] + for app in apps + if "common" in app["data"]["appinfo"] + and "associations" in app["data"]["appinfo"]["common"] + and "0" in app["data"]["appinfo"]["common"]["associations"] + } + for appmanifest in appmanifests: values = {} with open(appmanifest, "r") as open_file: @@ -114,6 +126,10 @@ def steam_parser(parent_widget, action): values["source"] = "steam" values["added"] = current_time values["last_played"] = 0 + try: + values["developer"] = developers[int(values["appid"])] + except KeyError: + pass if os.path.isfile( os.path.join( diff --git a/src/window.py b/src/window.py index ac554f6..55e6704 100644 --- a/src/window.py +++ b/src/window.py @@ -54,6 +54,7 @@ class CartridgesWindow(Adw.ApplicationWindow): overview_launch = Gtk.Template.Child() overview_blurred_cover = Gtk.Template.Child() overview_menu_button = Gtk.Template.Child() + overview_developer = Gtk.Template.Child() overview_added = Gtk.Template.Child() overview_last_played = Gtk.Template.Child() @@ -231,6 +232,12 @@ class CartridgesWindow(Adw.ApplicationWindow): def show_overview(self, _widget, game_id): current_game = self.games[game_id] + if current_game.developer: + self.overview_developer.set_label(current_game.developer) + self.overview_developer.set_visible(True) + else: + self.overview_developer.set_visible(False) + if not current_game.hidden: self.overview_menu_button.set_menu_model(self.game_options) else: