diff --git a/data/hu.kramo.Cartridges.gschema.xml.in b/data/hu.kramo.Cartridges.gschema.xml.in
index 326bdf9..c56b82b 100644
--- a/data/hu.kramo.Cartridges.gschema.xml.in
+++ b/data/hu.kramo.Cartridges.gschema.xml.in
@@ -16,12 +16,6 @@
"~/.steam/"
-
- "~/.var/app/com.valvesoftware.Steam/data/Steam/"
-
-
- "C:\Program Files (x86)\Steam"
-
true
@@ -31,12 +25,6 @@
"~/.var/app/net.lutris.Lutris/cache/lutris"
-
- "~/.var/app/net.lutris.Lutris/data/lutris/"
-
-
- "~/.var/app/net.lutris.Lutris/cache/lutris"
-
false
@@ -46,12 +34,6 @@
"~/.config/heroic/"
-
- "~/.var/app/com.heroicgameslauncher.hgl/config/heroic/"
-
-
- ""
-
true
diff --git a/src/importer/sources/heroic_source.py b/src/importer/sources/heroic_source.py
index b1bfb17..57d521a 100644
--- a/src/importer/sources/heroic_source.py
+++ b/src/importer/sources/heroic_source.py
@@ -8,7 +8,12 @@ from typing import Generator, Optional, TypedDict
from src import shared
from src.game import Game
-from src.importer.sources.source import NTSource, PosixSource, Source, SourceIterator
+from src.importer.sources.source import (
+ LinuxSource,
+ Source,
+ SourceIterator,
+ WindowsSource,
+)
from src.utils.decorators import (
replaced_by_env_path,
replaced_by_path,
@@ -121,7 +126,6 @@ class HeroicSource(Source):
"""Generic heroic games launcher source"""
name = "Heroic"
- executable_format = "xdg-open heroic://launch/{app_name}"
@property
def game_id_format(self) -> str:
@@ -132,28 +136,20 @@ class HeroicSource(Source):
return HeroicSourceIterator(source=self)
-class HeroicNativeSource(HeroicSource, PosixSource):
- variant = "native"
+class HeroicNativeSource(HeroicSource, LinuxSource):
+ variant = "linux"
+ executable_format = "xdg-open heroic://launch/{app_name}"
@property
@replaced_by_schema_key("heroic-location")
+ @replaced_by_path("~/.var/app/com.heroicgameslauncher.hgl/config/heroic/")
@replaced_by_env_path("XDG_CONFIG_HOME", "heroic/")
@replaced_by_path("~/.config/heroic/")
def location(self) -> Path:
raise FileNotFoundError()
-class HeroicFlatpakSource(HeroicSource, PosixSource):
- variant = "flatpak"
-
- @property
- @replaced_by_schema_key("heroic-flatpak-location")
- @replaced_by_path("~/.var/app/com.heroicgameslauncher.hgl/config/heroic/")
- def location(self) -> Path:
- raise FileNotFoundError()
-
-
-class HeroicWindowsSource(HeroicSource, NTSource):
+class HeroicWindowsSource(HeroicSource, WindowsSource):
variant = "windows"
executable_format = "start heroic://launch/{app_name}"
diff --git a/src/importer/sources/lutris_source.py b/src/importer/sources/lutris_source.py
index befadc4..bec4a8b 100644
--- a/src/importer/sources/lutris_source.py
+++ b/src/importer/sources/lutris_source.py
@@ -3,7 +3,7 @@ from time import time
from src import shared
from src.game import Game
-from src.importer.sources.source import PosixSource, Source, SourceIterator
+from src.importer.sources.source import LinuxSource, Source, SourceIterator
from src.utils.decorators import replaced_by_path, replaced_by_schema_key
from src.utils.save_cover import resize_cover, save_cover
@@ -74,7 +74,6 @@ class LutrisSource(Source):
"""Generic lutris source"""
name = "Lutris"
- executable_format = "xdg-open lutris:rungameid/{game_id}"
@property
def game_id_format(self):
@@ -84,21 +83,13 @@ class LutrisSource(Source):
return LutrisSourceIterator(source=self)
-class LutrisNativeSource(LutrisSource, PosixSource):
- variant = "native"
+class LutrisNativeSource(LutrisSource, LinuxSource):
+ variant = "linux"
+ executable_format = "xdg-open lutris:rungameid/{game_id}"
@property
@replaced_by_schema_key("lutris-location")
+ @replaced_by_path("~/.var/app/net.lutris.Lutris/data/lutris/")
@replaced_by_path("~/.local/share/lutris/")
def location(self):
raise FileNotFoundError()
-
-
-class LutrisFlatpakSource(LutrisSource, PosixSource):
- variant = "flatpak"
-
- @property
- @replaced_by_schema_key("lutris-flatpak-location")
- @replaced_by_path("~/.var/app/net.lutris.Lutris/data/lutris/")
- def location(self):
- raise FileNotFoundError()
diff --git a/src/importer/sources/source.py b/src/importer/sources/source.py
index c65a845..44e2290 100644
--- a/src/importer/sources/source.py
+++ b/src/importer/sources/source.py
@@ -1,4 +1,4 @@
-import os
+import sys
from abc import abstractmethod
from collections.abc import Iterable, Iterator
from pathlib import Path
@@ -66,7 +66,7 @@ class Source(Iterable):
self.location
except FileNotFoundError:
return False
- return os.name in self.available_on
+ return sys.platform in self.available_on
@property
@abstractmethod
@@ -83,17 +83,17 @@ class Source(Iterable):
"""Get the source's iterator, to use in for loops"""
-class NTSource(Source):
+class WindowsSource(Source):
"""Mixin for sources available on Windows"""
def __init__(self) -> None:
super().__init__()
- self.available_on.add("nt")
+ self.available_on.add("win32")
-class PosixSource(Source):
- """Mixin for sources available on POXIX-compliant systems"""
+class LinuxSource(Source):
+ """Mixin for sources available on Linux"""
def __init__(self) -> None:
super().__init__()
- self.available_on.add("posix")
+ self.available_on.add("linux")
diff --git a/src/importer/sources/steam_source.py b/src/importer/sources/steam_source.py
index 312551a..1258bf9 100644
--- a/src/importer/sources/steam_source.py
+++ b/src/importer/sources/steam_source.py
@@ -5,7 +5,12 @@ from typing import Iterator
from src import shared
from src.game import Game
-from src.importer.sources.source import NTSource, PosixSource, Source, SourceIterator
+from src.importer.sources.source import (
+ LinuxSource,
+ Source,
+ SourceIterator,
+ WindowsSource,
+)
from src.utils.decorators import (
replaced_by_env_path,
replaced_by_path,
@@ -20,10 +25,12 @@ class SteamSourceIterator(SourceIterator):
manifests: set = None
manifests_iterator: Iterator[Path] = None
installed_state_mask: int = 4
+ appid_cache: set = None
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
+ self.appid_cache = set()
self.manifests = set()
# Get dirs that contain steam app manifests
@@ -64,8 +71,13 @@ class SteamSourceIterator(SourceIterator):
if not int(local_data["stateflags"]) & self.installed_state_mask:
return None
- # Build game from local data
+ # Skip duplicate appids
appid = local_data["appid"]
+ if appid in self.appid_cache:
+ return None
+ self.appid_cache.add(appid)
+
+ # Build game from local data
values = {
"version": shared.SPEC_VERSION,
"added": int(time()),
@@ -91,17 +103,18 @@ class SteamSourceIterator(SourceIterator):
class SteamSource(Source):
name = "Steam"
- executable_format = "xdg-open steam://rungameid/{game_id}"
def __iter__(self):
return SteamSourceIterator(source=self)
-class SteamNativeSource(SteamSource, PosixSource):
- variant = "native"
+class SteamNativeSource(SteamSource, LinuxSource):
+ variant = "linux"
+ executable_format = "xdg-open steam://rungameid/{game_id}"
@property
@replaced_by_schema_key("steam-location")
+ @replaced_by_path("~/.var/app/com.valvesoftware.Steam/data/Steam/")
@replaced_by_env_path("XDG_DATA_HOME", "Steam/")
@replaced_by_path("~/.steam/")
@replaced_by_path("~/.local/share/Steam/")
@@ -109,23 +122,12 @@ class SteamNativeSource(SteamSource, PosixSource):
raise FileNotFoundError()
-class SteamFlatpakSource(SteamSource, PosixSource):
- variant = "flatpak"
-
- @property
- @replaced_by_schema_key("steam-flatpak-location")
- @replaced_by_path("~/.var/app/com.valvesoftware.Steam/data/Steam/")
- def location(self):
- raise FileNotFoundError()
-
-
-class SteamWindowsSource(SteamSource, NTSource):
+class SteamWindowsSource(SteamSource, WindowsSource):
variant = "windows"
executable_format = "start steam://rungameid/{game_id}"
@property
- @replaced_by_schema_key("steam-windows-location")
+ @replaced_by_schema_key("steam-location")
@replaced_by_env_path("programfiles(x86)", "Steam")
- @replaced_by_path("C:\\Program Files (x86)\\Steam")
def location(self):
raise FileNotFoundError()