{ config, lib, pkgs, ... }: with lib; let cfg = config.roles.kodi; in { options.roles.kodi = { enable = mkEnableOption "Enable Kodi"; autologin = mkOption { default = false; }; wayland = mkOption { default = true; }; }; config = let kodiBasePkg = if cfg.wayland then pkgs.kodi-wayland else pkgs.kodi; kodiPkg = kodiBasePkg.withPackages (pkgs: with pkgs; [ jellyfin steam-launcher steam-library youtube ]); in mkIf cfg.enable { users.extraUsers.kodi.isNormalUser = true; networking.firewall = { allowedTCPPorts = [ 8080 ]; allowedUDPPorts = [ 8080 ]; }; services = if cfg.autologin then mkMerge [ (mkIf cfg.wayland { cage = mkIf cfg.wayland { user = "kodi"; #program = "gamescope -f --hdr-enabled ${kodiPkg}/bin/kodi-standalone"; program = let kodiGamescope = pkgs.writeShellApplication { name = "kodi-gamescope"; runtimeInputs = [ kodiPkg pkgs.gamescope ]; text = '' ${pkgs.gamescope}/bin/gamescope --hdr-enabled -f -- ${kodiPkg}/bin/kodi-standalone ''; }; in "${lib.getExe kodiGamescope}"; enable = true; }; xserver = { enable = false; autorun = false; }; }) (mkIf (!cfg.wayland) { xserver = { enable = true; desktopManager.kodi = { enable = true; package = kodiPkg; }; displayManager.lightdm = { enable = true; greeter.enable = false; }; }; displayManager = { autoLogin.enable = true; autoLogin.user = "kodi"; defaultSession = "kodi"; sessionData.autologinSession = "kodi"; }; }) ] else {}; }; }