diff --git a/flake.lock b/flake.lock
index 81995f6..3723df4 100644
--- a/flake.lock
+++ b/flake.lock
@@ -365,11 +365,11 @@
]
},
"locked": {
- "lastModified": 1713077896,
- "narHash": "sha256-Noot8H0EZEAFRQWyGxh9ryvhK96xpIqKbh78X447JWs=",
+ "lastModified": 1713166971,
+ "narHash": "sha256-t0P/rKlsE5l1O3O2LYtAelLzp7PeoPCSzsIietQ1hSM=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "630a0992b3627c64e34f179fab68e3d48c6991c0",
+ "rev": "1c43dcfac48a2d622797f7ab741670fdbcf8f609",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 8680c65..0964fc5 100644
--- a/flake.nix
+++ b/flake.nix
@@ -37,9 +37,9 @@
overlays = {
kodi = final: prev: {
kodi-standalone =
- final.kodi-wayland.passthru.withPackages
+ final.kodi-wayland.withPackages
(kodiPkgs:
- with final.kodiPackages; [
+ with kodiPkgs; [
youtube
pvr-iptvsimple
keymap
diff --git a/modules/home-manager/binary-cache/default.nix b/modules/home-manager/binary-cache/default.nix
index 10a95d3..a28f5ee 100644
--- a/modules/home-manager/binary-cache/default.nix
+++ b/modules/home-manager/binary-cache/default.nix
@@ -1,16 +1,12 @@
-{pkgs, ...}: {
+_: {
nix = {
- package = pkgs.nix;
+ # package = pkgs.nix;
settings = {
substituters = [
"http://nixcache.odie.intranet"
"https://nix-community.cachix.org"
"https://cache.nixos.org/"
];
- trusted-public-keys = [
- "nixcache.odie.intranet:2j5qAVmtBUSZMPWlIRS8Gn0Il9tbotJ9c2y43N0RLKU="
- "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
- ];
};
};
}
diff --git a/modules/home-manager/desktop/default.nix b/modules/home-manager/desktop/default.nix
index 3f80885..b13698b 100644
--- a/modules/home-manager/desktop/default.nix
+++ b/modules/home-manager/desktop/default.nix
@@ -62,8 +62,8 @@
services = {
nextcloud-client.enable = lib.mkDefault true;
udiskie = {
+ enable = lib.mkDefault true;
settings = {
- enable = lib.mkDefault true;
program_options = {
udisks_version = 2;
tray = true;
diff --git a/modules/home-manager/mediacenter/default.nix b/modules/home-manager/mediacenter/default.nix
index 65a5386..329cf4a 100644
--- a/modules/home-manager/mediacenter/default.nix
+++ b/modules/home-manager/mediacenter/default.nix
@@ -1,5 +1,6 @@
-{
+{lib, ...}: with lib; {
imports = [
./kodi
];
+ mediacenter.kodi.enable = mkDefault true;
}
diff --git a/modules/home-manager/mediacenter/kodi/advancedsettings.nix b/modules/home-manager/mediacenter/kodi/advancedsettings.nix
index 25d3ce2..6acd324 100644
--- a/modules/home-manager/mediacenter/kodi/advancedsettings.nix
+++ b/modules/home-manager/mediacenter/kodi/advancedsettings.nix
@@ -1,78 +1,74 @@
-{vars,...}: let
-inherit (vars) timeZone hostName domain;
-datadirs = "smb://svartalbenheim.odie.intranet/kodi/userdata";
- mysql = {
- port = 3306;
- user = "kodi";
- pass = "kodi";
- };
+{
+ vars,
+ mysql,
+ media,
+ ...
+}: let
+ inherit (vars) timeZone hostName domain;
+ datadirs = "smb://${media.host}/kodi/userdata";
in {
- advancedsettings = {
- addons = {
- unknownsourcecs = true;
- };
- services = {
- devicename = "${hostName}.${domain}";
- webserver = true;
- webserverauthentication = false;
- webserverusername = "kodi";
- webserverpassword = "kodi";
- webserverport = 8000;
- webserverssl = false;
- zeroconf = true;
- wsdiscovery = true;
- upnp = true;
- upnpserver = true;
- airplay = true;
- airplayvideosupport = true;
- };
- locale = {
- language = "resource.language.de_de";
- country = "Deutschland";
- timezone = timeZone;
- };
- lookandfeed = {
- enablerssfeeds = false;
- };
- videodatabase = {
- type = "mysql";
- inherit (mysql) user pass port;
- };
- musicdatabase = {
- type = "mysql";
- inherit (mysql) user pass port;
- };
- videolibrary = {
- importwatchedstate = true;
- importresumepoint = true;
- };
- pathsubstitution = {
- substitute = [
- {
- from = "special://profile/playlists/";
- to = "${datadirs}/playlists/";
- }
- {
- from = "special://profile/sources.xml";
- to = "${datadirs}/sources.xml";
- }
- {
- from = "special://profile/mediasources.xml";
- to = "${datadirs}/mediasources.xml";
- }
- {
- from = "special://profile/RssFeeds.xml";
- to = "${datadirs}/RssFeeds.xml";
- }
- {
- from = "special://profile/favourites.xml";
- to = "${datadirs}/favourites.xml";
- }
- {
- from = "special://profile/passwords.xml";
- to = "${datadirs}/passwords.xml";
- }
- ];
- };
+ addons = {
+ unknownsources = "true";
+ };
+ services = {
+ devicename = "${hostName}.${domain}";
+ webserver = "true";
+ webserverauthentication = "false";
+ webserverusername = "kodi";
+ webserverpassword = "kodi";
+ webserverport = "8000";
+ webserverssl = "false";
+ zeroconf = "true";
+ wsdiscovery = "true";
+ upnp = "true";
+ upnpserver = "true";
+ airplay = "true";
+ airplayvideosupport = "true";
+ };
+ locale = {
+ language = "resource.language.de_de";
+ country = "Deutschland";
+ timezone = timeZone;
+ };
+ lookandfeed = {
+ enablerssfeeds = "false";
+ };
+ videodatabase = {
+ inherit (mysql) user pass host;
+ type = "mysql";
+ port = builtins.toString mysql.port;
+ };
+ musicdatabase = {
+ inherit (mysql) user pass host;
+ type = "mysql";
+ port = builtins.toString mysql.port;
+ };
+ videolibrary = {
+ importwatchedstate = "true";
+ importresumepoint = "true";
+ };
+ pathsubstitution = {
+ substitute = [
+ {
+ from = "special://profile/playlists/";
+ to = "${datadirs}/playlists/";
+ }
+ {
+ from = "special://profile/sources.xml";
+ to = "${datadirs}/sources.xml";
+ }
+ {
+ from = "special://profile/mediasources.xml";
+ to = "${datadirs}/mediasources.xml";
+ }
+ {
+ from = "special://profile/RssFeeds.xml";
+ to = "${datadirs}/RssFeeds.xml";
+ }
+ {
+ from = "special://profile/favourites.xml";
+ to = "${datadirs}/favourites.xml";
+ }
+ ];
};
}
diff --git a/modules/home-manager/mediacenter/kodi/default.nix b/modules/home-manager/mediacenter/kodi/default.nix
index 858c039..982c0ab 100644
--- a/modules/home-manager/mediacenter/kodi/default.nix
+++ b/modules/home-manager/mediacenter/kodi/default.nix
@@ -6,18 +6,59 @@
...
}: let
cfg = config.mediacenter.kodi;
+ inherit (lib) types;
in
with lib; {
- options = {
- mediacenter.kodi = {
- enable = mkEnableOption "kodi";
+ options.mediacenter.kodi = {
+ # enable = mkEnableOption "kodi";
+ media = {
+ host = mkOption {
+ type = types.str;
+ default = "media";
+ };
+ user = mkOption {
+ type = types.str;
+ default = "kodi";
+ };
+ pass = mkOption {
+ type = types.str;
+ default = "kodi";
+ };
+ };
+ mysql = {
+ host = mkOption {
+ type = types.str;
+ default = "localhost";
+ };
+ port = mkOption {
+ type = types.int;
+ default = 3306;
+ };
+ user = mkOption {
+ type = types.str;
+ default = "kodi";
+ };
+ pass = mkOption {
+ type = types.str;
+ default = "kodi";
+ };
};
};
+ imports = [./kodi.nix]; # import overridden kodi module
config = mkIf cfg.enable {
- programs.kodi = {
- enable = true;
+ #programs.kodi = {
+ mediacenter.kodi = {
+ # enable = true;
package = pkgs.kodi-standalone;
- settings = import ./advancedsettings.nix {inherit vars;};
+ settings = import ./advancedsettings.nix {inherit vars; inherit (cfg) mysql media;};
+ };
+ home.file = {
+ "kodi-passwords.xml" = {
+ target = ".kodi/userdata/passwords.xml";
+ text = import ./passwords.nix {
+ inherit (cfg) media;
+ };
+ };
};
};
}
diff --git a/modules/home-manager/mediacenter/kodi/kodi.nix b/modules/home-manager/mediacenter/kodi/kodi.nix
new file mode 100644
index 0000000..a8c3140
--- /dev/null
+++ b/modules/home-manager/mediacenter/kodi/kodi.nix
@@ -0,0 +1,262 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib; let
+ stylesheetCommonHeader = ''
+
+
+
+
+ '';
+
+ stylesheetCommonFooter = "";
+
+ stylesheetNestedTags = ''
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ '';
+
+ stylesheetTagsAsSettingWithId = ''
+
+
+
+
+
+
+
+
+ '';
+
+ stylesheetAdvancedSettingsRootTag = ''
+
+ Generated by Home Manager.
+
+
+
+
+ '';
+
+ stylesheetSourcesRootTag = ''
+
+ Generated by Home Manager.
+
+
+
+
+ '';
+
+ stylesheetAddonSettingsRootTag = ''
+
+ Generated by Home Manager.
+
+
+
+
+ '';
+
+ attrsetToXml = attrs: name: stylesheet:
+ pkgs.runCommand name {
+ # Package splicing for libxslt does not work correctly leading to errors
+ # when cross-compiling. Use the version from buildPackages explicitly to
+ # fix this.
+ nativeBuildInputs = [pkgs.buildPackages.libxslt.bin];
+ xml = builtins.toXML attrs;
+ passAsFile = ["xml"];
+ } ''
+ xsltproc ${stylesheet} - < "$xmlPath" > "$out"
+ '';
+
+ attrsetToAdvancedSettingsXml = attrs: name: let
+ stylesheet = builtins.toFile "stylesheet.xsl" ''
+ ${stylesheetCommonHeader}
+ ${stylesheetAdvancedSettingsRootTag}
+ ${stylesheetNestedTags}
+ ${stylesheetCommonFooter}
+ '';
+ in
+ attrsetToXml attrs name stylesheet;
+
+ attrsetToSourcesXml = attrs: name: let
+ stylesheet = builtins.toFile "stylesheet.xsl" ''
+ ${stylesheetCommonHeader}
+ ${stylesheetSourcesRootTag}
+ ${stylesheetNestedTags}
+ ${stylesheetCommonFooter}
+ '';
+ in
+ attrsetToXml attrs name stylesheet;
+
+ attrsetToAddonSettingsXml = attrs: name: let
+ stylesheet = builtins.toFile "stylesheet.xsl" ''
+ ${stylesheetCommonHeader}
+ ${stylesheetAddonSettingsRootTag}
+ ${stylesheetTagsAsSettingWithId}
+ ${stylesheetCommonFooter}
+ '';
+ in
+ attrsetToXml attrs name stylesheet;
+in {
+ meta.maintainers = [hm.maintainers.dwagenk];
+
+ options.mediacenter.kodi = {
+ enable = mkEnableOption "Kodi";
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.kodi;
+ defaultText = literalExpression "pkgs.kodi";
+ example =
+ literalExpression
+ "pkgs.kodi.withPackages (exts: [ exts.pvr-iptvsimple ])";
+ description = ''
+ The `kodi` package to use.
+ Can be used to specify extensions.
+ '';
+ };
+
+ datadir = mkOption {
+ type = types.path;
+ default = "${config.home.homeDirectory}/.kodi";
+ defaultText =
+ literalExpression ''"''${config.home.homeDirectory}/.kodi"'';
+ example = literalExpression ''"''${config.xdg.dataHome}/kodi"'';
+ description = "Directory to store configuration and metadata.";
+ };
+
+ settings = mkOption {
+ type = with types; let
+ valueType =
+ oneOf [str (attrsOf valueType) (listOf valueType)]
+ // {
+ description = "attribute sets or lists of strings";
+ };
+ in
+ nullOr valueType;
+ default = null;
+ example = literalExpression ''
+ { videolibrary.showemptytvshows = "true"; }
+ '';
+ description = ''
+ Configuration to write to the `advancedsettings.xml`
+ file in kodis userdata directory. Settings specified here will be
+ immutable from inside kodi and be hidden from the GUI settings dialog.
+
+ See as
+ reference for how settings need to be specified.
+
+ The innermost attributes must be of type str.
+ '';
+ };
+
+ sources = mkOption {
+ type = with types; let
+ valueType =
+ oneOf [str (attrsOf valueType) (listOf valueType)]
+ // {
+ description = "attribute sets or lists of strings";
+ };
+ in
+ nullOr valueType;
+ default = null;
+ example = literalExpression ''
+ {
+ video = {
+ default = "movies";
+ source = [
+ { name = "videos"; path = "/path/to/videos"; allowsharing = "true"; }
+ { name = "movies"; path = "/path/to/movies"; allowsharing = "true"; }
+ ];
+ };
+ }
+ '';
+ description = ''
+ Contents to populate the file `sources.xml` in kodis
+ userdata directory.
+
+ See as
+ reference for how sources need to be specified.
+
+ Kodi will still show the dialogs to modify sources in the GUI and they
+ appear to be mutable. This however is not the case and the sources will
+ stay as specified via Home Manager.
+
+ The innermost attributes must be of type str.
+ '';
+ };
+
+ addonSettings = mkOption {
+ type = with types; nullOr (attrsOf (attrsOf str));
+ default = null;
+ example = literalExpression ''
+ { "service.xbmc.versioncheck".versioncheck_enable = "false"; }
+ '';
+ description = ''
+ Attribute set with the plugin namespace as toplevel key and the plugins
+ settings as lower level key/value pairs.
+
+ Kodi will still show the settings of plugins configured via this
+ mechanism in the GUI and they appear to be mutable. This however is
+ not the case and the settings will stay as specified via Home Manager.
+ '';
+ };
+ };
+
+ config = let
+ cfg = config.mediacenter.kodi;
+ in
+ mkIf cfg.enable (mkMerge [
+ {
+ assertions = [
+ (lib.hm.assertions.assertPlatform "programs.kodi" pkgs
+ lib.platforms.linux)
+ ];
+
+ home.packages = [cfg.package];
+ home.sessionVariables = {KODI_DATA = cfg.datadir;};
+ }
+
+ (mkIf (cfg.settings != null) {
+ home.file."${cfg.datadir}/userdata/advancedsettings.xml".source =
+ attrsetToAdvancedSettingsXml cfg.settings "kodi-advancedsettings.xml";
+ })
+
+ (mkIf (cfg.sources != null) {
+ home.file."${cfg.datadir}/userdata/sources.xml".source =
+ attrsetToSourcesXml cfg.sources "kodi-sources.xml";
+ })
+
+ (mkIf (cfg.addonSettings != null) {
+ home.file = mapAttrs' (k: v:
+ attrsets.nameValuePair
+ "${cfg.datadir}/userdata/addon_data/${k}/settings.xml" {
+ source = attrsetToAddonSettingsXml v "kodi-addon-${k}-settings.xml";
+ })
+ cfg.addonSettings;
+ })
+ ]);
+}
diff --git a/modules/home-manager/mediacenter/kodi/passwords.nix b/modules/home-manager/mediacenter/kodi/passwords.nix
new file mode 100644
index 0000000..7d1d322
--- /dev/null
+++ b/modules/home-manager/mediacenter/kodi/passwords.nix
@@ -0,0 +1,8 @@
+{media,...}: ''
+
+
+ smb://${media.host}
+ smb://${media.user}:${media.pass}@${media.host}
+
+
+''
diff --git a/modules/nixos/base/binary-cache/default.nix b/modules/nixos/base/binary-cache/default.nix
index b3482ad..cd6d9d3 100644
--- a/modules/nixos/base/binary-cache/default.nix
+++ b/modules/nixos/base/binary-cache/default.nix
@@ -5,7 +5,6 @@
substituters = [
"http://nixcache.odie.intranet"
"https://nix-community.cachix.org"
- "https://cache.nixos.org/"
];
trusted-public-keys = [
"nixcache.odie.intranet:2j5qAVmtBUSZMPWlIRS8Gn0Il9tbotJ9c2y43N0RLKU="
diff --git a/modules/nixos/base/network/default.nix b/modules/nixos/base/network/default.nix
index 0158e4b..aa5e2f9 100644
--- a/modules/nixos/base/network/default.nix
+++ b/modules/nixos/base/network/default.nix
@@ -1,10 +1,15 @@
-{ config, lib, pkgs, vars, ... }:
-let
- inherit (vars) hostName;
-in
{
+ vars,
+ ...
+}: let
+ inherit (vars) hostName domain;
+in {
networking = {
- inherit hostName;
+ inherit hostName domain;
+ search = [
+ domain
+ "fritz.box"
+ ];
firewall.enable = true;
};
}
diff --git a/modules/nixos/mediacenter/kodi/default.nix b/modules/nixos/mediacenter/kodi/default.nix
index 2d2a3d7..ab0e755 100644
--- a/modules/nixos/mediacenter/kodi/default.nix
+++ b/modules/nixos/mediacenter/kodi/default.nix
@@ -14,12 +14,35 @@ in
};
config = let
user = "kodi";
+ starter = pkgs.callPackage (
+ {pkgs, kodi-standalone, ...}:
+ pkgs.writeShellApplication {
+ name = "kodi-launcher";
+ runtimeInputs = [kodi-standalone];
+ text = ''
+ #!/usr/bin/env bash
+
+ while true
+ do
+ ping -c1 svartalbenheim.odie.intranet && break
+ sleep 5
+ done
+
+
+ while true
+ do
+ sleep 1
+ kodi-standalone
+ done
+ '';
+ }
+ ) {};
in
lib.mkIf cfg.enable {
services.cage = {
inherit user;
enable = true;
- program = "${pkgs.kodi-standalone}/bin/kodi-standalone";
+ program = "${starter}/bin/kodi-launcher";
};
users.users.kodi = {
diff --git a/profiles/home-manager/kodi@vm/home.nix b/profiles/home-manager/kodi@vm/home.nix
index a15210d..876d8e7 100644
--- a/profiles/home-manager/kodi@vm/home.nix
+++ b/profiles/home-manager/kodi@vm/home.nix
@@ -16,7 +16,17 @@ in {
language.base = vars.locale;
stateVersion = "23.05";
};
- mediacenter.kodi.enable = true;
+ mediacenter.kodi = {
+ enable = true;
+ media = {
+ host = "svartalbenheim.odie.intranet";
+ pass = "Bx5sTkw1Qeg69I9!";
+ };
+ mysql = {
+ host = "svartalbenheim.odie.intranet";
+ pass = "Bx5sTkw1Qeg69I9!";
+ };
+ };
}
];
}
diff --git a/profiles/home-manager/odie@vm/home.nix b/profiles/home-manager/odie@vm/home.nix
index 0081a8f..2a810d3 100644
--- a/profiles/home-manager/odie@vm/home.nix
+++ b/profiles/home-manager/odie@vm/home.nix
@@ -1,4 +1,4 @@
-{ outputs, ... }: {
+{outputs, ...}: {
imports = [
outputs.homeManagerModules.base
outputs.homeManagerModules.shell
@@ -7,14 +7,24 @@
outputs.homeManagerModules.development
outputs.homeManagerModules.games
outputs.homeManagerModules.binary-cache
- {
- services.picom.enable = false;
- desktop = {
- enable = false;
- };
- programs = {
- kitty.enable = false;
- };
- }
];
+ desktop = {
+ enable = false;
+ awesome.enable = false;
+ pcmanfm.enable = false;
+ thunar.enable = false;
+ network-manager.enable = false;
+ };
+ programs = {
+ kitty.enable = true;
+ keepassxc.enable = false;
+ firefox.enable = false;
+ };
+ services = {
+ nextcloud-client.enable = false;
+ udiskie.enable = false;
+ picom.enable = false;
+ };
+ theme.cursor.enable = false;
+ theme.gtk.enable = false;
}
diff --git a/profiles/nixos/vm/configuration.nix b/profiles/nixos/vm/configuration.nix
index 957119e..06336bd 100644
--- a/profiles/nixos/vm/configuration.nix
+++ b/profiles/nixos/vm/configuration.nix
@@ -17,9 +17,6 @@
./hardware-configuration.nix
];
- services.nginx.enable = true;
- services.nix-serve.enable = true;
-
home-manager.users =
flakeLib.mkNixosHomeConfiguration {
inherit vars system;