{ 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; }; appLauncherServer = { enable = mkOption { type = types.bool; default = true; description = "Enable HTTP app launcher server for remote control"; }; port = mkOption { type = types.int; default = 8081; description = "Port for the app launcher HTTP server"; }; }; }; config = let kodiBasePkg = if cfg.wayland then pkgs.kodi-wayland else pkgs.kodi; kodiPkg = kodiBasePkg.withPackages (pkgs: with pkgs; [ jellyfin-media-player steam-launcher steam-library youtube ]); in mkIf cfg.enable { users.extraUsers.kodi = { isNormalUser = true; extraGroups = [ "wheel" "networkmanager" "audio" "video" ]; }; networking.firewall = { allowedTCPPorts = [ 8080 ] ++ optional cfg.appLauncherServer.enable cfg.appLauncherServer.port; allowedUDPPorts = [ 8080 ]; }; environment.systemPackages = with pkgs; [ kodiPkg wget firefox ] ++ optional cfg.appLauncherServer.enable pkgs.custom.app-launcher-server; programs.kdeconnect.enable = true; systemd.user.services = mkIf cfg.appLauncherServer.enable { app-launcher-server = { description = "HTTP App Launcher Server"; wantedBy = [ "graphical-session.target" ]; after = [ "graphical-session.target" ]; serviceConfig = { Type = "simple"; ExecStart = "${pkgs.custom.app-launcher-server}/bin/app-launcher-server ${toString cfg.appLauncherServer.port}"; Restart = "always"; RestartSec = "5s"; Environment = [ "PATH=${pkgs.firefox}/bin:${kodiPkg}/bin:/run/current-system/sw/bin" ]; }; }; }; services.displayManager = mkIf cfg.autologin { autoLogin.enable = true; autoLogin.user = "kodi"; defaultSession = "plasma"; }; }; }