{ config , pkgs , lib , ... }: let cfg = config.services.declarative-jellyfin; toXml' = (import ../../lib { nixpkgs = pkgs; }).toXMLGeneric; in with lib; { imports = [ ./system.nix ./encoding.nix ./network.nix ./branding.nix ]; options.services.declarative-jellyfin = { enable = mkEnableOption "Jellyfin Service"; }; config = mkIf cfg.enable ( let isStrList = x: builtins.all (x: builtins.isString x) x; prepass = x: if (builtins.isAttrs x) then if !(builtins.hasAttr "tag" x) then attrsets.mapAttrsToList (tag: value: { inherit tag; content = prepass value; }) x else if (builtins.hasAttr "content" x) then { tag = x.tag; content = prepass x.content; } else x else if (builtins.isList x) then if (isStrList x) then (builtins.map (content: { tag = "string"; inherit content; }) x) else builtins.map prepass x else x; toXml = tag: x: (toXml' { inherit tag; attrib = { "xmlns:xsi" = "http://www.w3.org/2001/XMLSchema-instance"; "xmlns:xsd" = "http://www.w3.org/2001/XMLSchema"; }; content = prepass x; }); in { system.activationScripts = { link-network-xml = lib.stringAfter [ "var" ] ( let storeFile = pkgs.writeText "network.xml" (toXml "NetworkConfiguration" cfg.network); in '' mkdir -p "/var/lib/jellyfin/config" cp -s "${storeFile}" "/var/lib/jellyfin/config/network.xml" '' ); link-encoding-xml = lib.stringAfter [ "var" ] ( let storeFile = pkgs.writeText "encoding.xml" (toXml "EncodingOptions" cfg.network); in '' mkdir -p "/var/lib/jellyfin/config" cp -s "${storeFile}" "/var/lib/jellyfin/config/encoding.xml" '' ); link-system-xml = lib.stringAfter [ "var" ] ( let storeFile = pkgs.writeText "system.xml" (toXml "ServerConfiguration" cfg.network); in '' mkdir -p "/var/lib/jellyfin/config" cp -s "${storeFile}" "/var/lib/jellyfin/config/system.xml" '' ); }; } ); }