From 13c21d9d15a8b9e2e8e8b3e1b1deace8a68957e7 Mon Sep 17 00:00:00 2001
From: Myned <dev@bjork.tech>
Date: Sat, 29 Mar 2025 18:11:15 -0500
Subject: [PATCH] desktops: add kodi

---
 options/custom/default.nix               |  7 +-
 options/custom/desktops/default.nix      |  3 +-
 options/custom/desktops/kodi/default.nix | 85 ++++++++++++++++++++++++
 3 files changed, 88 insertions(+), 7 deletions(-)
 create mode 100644 options/custom/desktops/kodi/default.nix

diff --git a/options/custom/default.nix b/options/custom/default.nix
index c5bd7f2..b4481cb 100644
--- a/options/custom/default.nix
+++ b/options/custom/default.nix
@@ -35,12 +35,7 @@ in {
     rounding = mkOption {default = 16.0;};
 
     ### Misc
-    desktop = mkOption {
-      default =
-        if config.custom.full
-        then "niri"
-        else "gnome";
-    };
+    desktop = mkOption {default = null;};
 
     lockscreen = mkOption {default = "hyprlock";};
     menu = mkOption {default = "rofi";};
diff --git a/options/custom/desktops/default.nix b/options/custom/desktops/default.nix
index b695905..4305757 100644
--- a/options/custom/desktops/default.nix
+++ b/options/custom/desktops/default.nix
@@ -7,7 +7,7 @@ with lib; let
   cfg = config.custom.desktops;
 in {
   options.custom.desktops = {
-    enable = mkOption {default = config.custom.minimal;};
+    enable = mkOption {default = isString config.custom.desktop;};
   };
 
   config = mkIf cfg.enable {
@@ -15,6 +15,7 @@ in {
       gnome.enable = config.custom.desktop == "gnome";
       hyprland.enable = config.custom.desktop == "hyprland";
       kde.enable = config.custom.desktop == "kde";
+      kodi.enable = config.custom.desktop == "kodi";
       niri.enable = config.custom.desktop == "niri";
       sway.enable = config.custom.desktop == "sway";
     };
diff --git a/options/custom/desktops/kodi/default.nix b/options/custom/desktops/kodi/default.nix
new file mode 100644
index 0000000..4746104
--- /dev/null
+++ b/options/custom/desktops/kodi/default.nix
@@ -0,0 +1,85 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+with lib; let
+  cfg = config.custom.desktops.kodi;
+  hm = config.home-manager.users.${config.custom.username};
+in {
+  options.custom.desktops.kodi = {
+    enable = mkOption {default = false;};
+    firewall = mkOption {default = false;};
+  };
+
+  config = mkIf cfg.enable {
+    # https://github.com/xbmc/xbmc
+    # https://kodi.wiki/view/Main_Page
+    # https://wiki.archlinux.org/title/Kodi
+    # https://wiki.nixos.org/wiki/Kodi
+    services = {
+      displayManager.autoLogin = {
+        enable = true;
+        user = "kodi";
+      };
+
+      xserver = {
+        enable = true;
+        displayManager.lightdm.greeter.enable = false;
+
+        desktopManager.kodi = {
+          enable = true;
+
+          # https://wiki.nixos.org/wiki/Kodi#Plugins
+          package = pkgs.unstable.kodi-gbm.withPackages (kodiPackages:
+            with kodiPackages; [
+              youtube # https://github.com/anxdpanic/plugin.video.youtube
+            ]);
+        };
+      };
+    };
+
+    # https://kodi.wiki/view/Smartphone/tablet_remotes#Firewall
+    # https://wiki.nixos.org/wiki/Kodi#Access_from_other_machines
+    networking.firewall = mkIf cfg.firewall {
+      allowedTCPPorts = [8080];
+      allowedUDPPorts = [9777];
+    };
+
+    users.users.kodi = {
+      isNormalUser = true;
+    };
+
+    home-manager.users.kodi = {
+      home = {
+        homeDirectory = "/home/kodi";
+        stateVersion = hm.home.stateVersion;
+        username = "kodi";
+      };
+
+      programs = {
+        home-manager.enable = true;
+
+        kodi = {
+          enable = true;
+          package = config.services.xserver.desktopManager.kodi.package;
+
+          # advancedsettings.xml
+          # https://kodi.wiki/view/Advancedsettings.xml
+          settings = {
+            # guisettings.xml
+            # https://kodi.wiki/view/Advancedsettings.xml#guisettings.xml_Setting_Conversion
+            # https://github.com/xbmc/xbmc/blob/master/system/settings/settings.xml
+
+            # https://kodi.wiki/view/Webserver
+            services = {
+              webserver = "true";
+              webserverauthentication = "false";
+            };
+          };
+        };
+      };
+    };
+  };
+}