diff --git a/modules/home-manager/services/mopidy.nix b/modules/home-manager/services/mopidy.nix new file mode 100644 index 00000000..c9ed984c --- /dev/null +++ b/modules/home-manager/services/mopidy.nix @@ -0,0 +1,88 @@ +# This service is adapted from the NixOS module. +{ config, options, lib, pkgs, ... }: + +let + cfg = config.services.mopidy; + + mopidyConf = pkgs.writeText "mopidy.conf" cfg.configuration; + mopidyEnv = pkgs.buildEnv { + name = "mopidy-with-extensions-${pkgs.mopidy.version}"; + # TODO: Improve this that doesn't use `lib.misc`. + paths = lib.closePropagation cfg.extensionPackages; + pathsToLink = [ "/${pkgs.mopidyPackages.python.sitePackages}" ]; + buildInputs = [ pkgs.makeWrapper ]; + postBuild = '' + makeWrapper ${pkgs.mopidy}/bin/mopidy $out/bin/mopidy --prefix PYTHONPATH : $out/${pkgs.mopidyPackages.python.sitePackages} + ''; + }; +in { + options.services.mopidy = { + enable = lib.mkEnableOption "Mopidy music player daemon"; + + dataDir = lib.mkOption { + default = "${config.xdg.dataHome}/mopidy"; + type = with lib.types; either path str; + description = "The directory where Mopidy stores its state."; + }; + + extensionPackages = lib.mkOption { + default = []; + type = with lib.types; listOf package; + example = lib.literalExpression "with pkgs; [ mopidy-spotify mopidy-mpd mopidy-mpris ]"; + description = '' + Mopidy extensions that should be loaded by the service. + ''; + }; + + # TODO: Revise the configuration to a proper Nix setting. + configuration = lib.mkOption { + default = ""; + type = lib.types.lines; + description = "The configuration Mopidy uses in the service."; + }; + + extraConfigFiles = lib.mkOption { + default = []; + type = with lib.types; listOf str; + description = '' + Extra config files to be read to the service. + Note that later files overrides earlier configuration. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + (lib.hm.assertions.assertPlatform "services.mopidy" pkgs lib.platforms.linux) + ]; + + systemd.user.services.mopidy = { + Unit = { + Description = "mopidy music player daemon"; + After = [ "network.target" "sound.target" ]; + Documentation = [ "https://mopidy.com/" ]; + }; + + Service = { + ExecStart = "${mopidyEnv}/bin/mopidy --config ${lib.concatStringsSep ":" ([mopidyConf] ++ cfg.extraConfigFiles)}"; + }; + + Install.WantedBy = [ "default.target" ]; + }; + + systemd.user.services.mopidy-scan = { + Unit = { + After = [ "network.target" "sound.target" ]; + Description = "mopidy local files scanner"; + Documentation = [ "https://mopidy.com/" ]; + }; + + Service = { + ExecStart = "${mopidyEnv}/bin/mopidy --config ${lib.concatStringsSep ":" ([mopidyConf] ++ cfg.extraConfigFiles)} local scan"; + Type = "oneshot"; + }; + + Install.WantedBy = [ "default.target" ]; + }; + }; +}