From 680378e6913811a4d918740781bb98cf9abe16b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20R=C3=B6ger?= Date: Thu, 24 Jul 2025 20:32:00 +0200 Subject: [PATCH] System Gen86 @ 2025-07-24-20:32:00 by jonas@monolith --- hosts/monolith/configuration.nix | 8 +++--- modules/programs/spotify-shortcuts.nix | 23 +++++++++------ .../spotify_shortcuts/config.py | 28 +++++++++++++------ 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/hosts/monolith/configuration.nix b/hosts/monolith/configuration.nix index a606fb1..53f9bb8 100644 --- a/hosts/monolith/configuration.nix +++ b/hosts/monolith/configuration.nix @@ -17,12 +17,12 @@ sopsFile = ../../secrets/monolith/wg.yaml; key = "privateKey"; }; - sops.secrets.spotify-shortcuts-clientId = { + sops.secrets.spotifyShortcutsClientId = { sopsFile = ../../secrets/spotify-shortcuts.yaml; key = "clientId"; mode = "0644"; }; - sops.secrets.spotify-shortcuts-clientSecret = { + sops.secrets.spotifyShortcutsClientSecret = { sopsFile = ../../secrets/spotify-shortcuts.yaml; key = "clientSecret"; mode = "0644"; @@ -81,8 +81,8 @@ }; hive.programs.spotify-shortcuts = { enable = true; - clientIdFile = config.sops.secrets.spotify-shortcuts-clientId.path; - clientSecretFile = config.sops.secrets.spotify-shortcuts-clientSecret.path; + clientIdSopsKey = config.sops.secrets.spotifyShortcutsClientId.name; + clientSecretSopsKey = config.sops.secrets.spotifyShortcutsClientSecret.name; }; # system packages diff --git a/modules/programs/spotify-shortcuts.nix b/modules/programs/spotify-shortcuts.nix index 30fe4ef..37cd980 100644 --- a/modules/programs/spotify-shortcuts.nix +++ b/modules/programs/spotify-shortcuts.nix @@ -8,21 +8,26 @@ in { options.hive.programs.spotify-shortcuts = { enable = lib.mkEnableOption "Enable Spotify Shortcuts"; - clientIdFile = lib.mkOption { - type = lib.types.path; - description = "Spotify API Client ID Path"; + clientIdSopsKey = lib.mkOption { + type = lib.types.singleLineStr; + description = "Spotify API Client ID sops secret name"; }; - clientSecretFile = lib.mkOption { - type = lib.types.path; - description = "Spotify API Client Secret Path"; + clientSecretSopsKey = lib.mkOption { + type = lib.types.singleLineStr; + description = "Spotify API Client Secret Path sops secret name"; }; }; config = lib.mkIf cfg.enable { environment.systemPackages = [pkgs.hive.spotify-shortcuts]; - environment.etc."profile.d/spotify-shortcuts.sh".text = '' - export SPOTIFY_SHORTCUTS_CLIENT_ID=$(cat ${cfg.clientIdFile}) - export SPOTIFY_SHORTCUTS_CLIENT_SECRET=$(cat ${cfg.clientSecretFile}) + environment.variables = { + SPOTIFY_SHORTCUTS_CONFIG = config.sops.templates."spotify-shortcuts-client.json".path; + }; + sops.templates."spotify-shortcuts-client.json".content = '' + { + "clientId": "${config.sops.placeholder.${cfg.clientIdSopsKey}}", + "clientSecret": "${config.sops.placeholder.${cfg.clientSecretSopsKey}}" + } ''; }; } diff --git a/pkgs/spotify-shortcuts/spotify_shortcuts/config.py b/pkgs/spotify-shortcuts/spotify_shortcuts/config.py index dbaeb31..c997893 100644 --- a/pkgs/spotify-shortcuts/spotify_shortcuts/config.py +++ b/pkgs/spotify-shortcuts/spotify_shortcuts/config.py @@ -5,6 +5,7 @@ from typing import List from os import getenv from sys import argv from xdg.BaseDirectory import xdg_cache_home +from json import loads @dataclass @@ -13,6 +14,19 @@ class Config: client_id: str | None = None client_secret: str | None = None + @staticmethod + def from_file(path: Path): + if not path.exists(): + raise FileNotFoundError(f"Configuration file {path} does not exist.") + with open(path, "r") as f: + data = loads(f.read()) + + return Config( + cache_file=Path(data.get("cacheFile", Config.cache_file)), + client_id=data.get("clientId", Config.client_id), + client_secret=data.get("clientSecret", Config.client_secret), + ) + def load_config(args: List[str] = argv[1:]) -> Config: parser = ArgumentParser(description="Spotify CLI Tool") @@ -37,14 +51,12 @@ def load_config(args: List[str] = argv[1:]) -> Config: ns = parser.parse_args(args) - cfg = Config( - cache_file=ns.cache_file, - client_id=ns.client_id, - client_secret=ns.client_secret, - ) + cfg = Config() + if (cfg_file := getenv("SPOTIFY_SHORTCUTS_CONFIG", None)) != None: + cfg = Config.from_file(Path(cfg_file)) return Config( - cache_file=Path(getenv("SPOTIFY_SHORTCUTS_CACHE_FILE", cfg.cache_file)), - client_id=getenv("SPOTIFY_SHORTCUTS_CLIENT_ID", cfg.client_id), - client_secret=getenv("SPOTIFY_SHORTCUTS_CLIENT_SECRET", cfg.client_secret), + cache_file=ns.cache_file or cfg.cache_file, + client_id=ns.client_id or cfg.client_id, + client_secret=ns.client_secret or cfg.client_secret, )