diff --git a/modules/misc/news.nix b/modules/misc/news.nix
index 8f160ad2..88c8f632 100644
--- a/modules/misc/news.nix
+++ b/modules/misc/news.nix
@@ -711,6 +711,13 @@ in
A new module is available: 'xsession.windowManager.awesome'.
'';
}
+
+ {
+ time = "2018-07-18T20:14:11+00:00";
+ message = ''
+ A new module is available: 'services.mpd'.
+ '';
+ }
];
};
}
diff --git a/modules/modules.nix b/modules/modules.nix
index 78254c1d..323fe176 100644
--- a/modules/modules.nix
+++ b/modules/modules.nix
@@ -64,6 +64,7 @@ let
./services/keepassx.nix
./services/keybase.nix
./services/mbsync.nix
+ ./services/mpd.nix
./services/network-manager-applet.nix
./services/owncloud-client.nix
./services/parcellite.nix
diff --git a/modules/services/mpd.nix b/modules/services/mpd.nix
new file mode 100644
index 00000000..5cc58117
--- /dev/null
+++ b/modules/services/mpd.nix
@@ -0,0 +1,148 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ name = "mpd";
+
+ cfg = config.services.mpd;
+
+ mpdConf = pkgs.writeText "mpd.conf" ''
+ music_directory "${cfg.musicDirectory}"
+ playlist_directory "${cfg.playlistDirectory}"
+ ${lib.optionalString (cfg.dbFile != null) ''
+ db_file "${cfg.dbFile}"
+ ''}
+ state_file "${cfg.dataDir}/state"
+ sticker_file "${cfg.dataDir}/sticker.sql"
+ log_file "syslog"
+
+ ${optionalString (cfg.network.listenAddress != "any")
+ ''bind_to_address "${cfg.network.listenAddress}"''}
+ ${optionalString (cfg.network.port != 6600)
+ ''port "${toString cfg.network.port}"''}
+
+ ${cfg.extraConfig}
+ '';
+
+in {
+
+ ###### interface
+
+ options = {
+
+ services.mpd = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable MPD, the music player daemon.
+ '';
+ };
+
+ musicDirectory = mkOption {
+ type = types.path;
+ default = "${config.home.homeDirectory}/music";
+ defaultText = "$HOME/music";
+ description = ''
+ The directory where mpd reads music from.
+ '';
+ };
+
+ playlistDirectory = mkOption {
+ type = types.path;
+ default = "${cfg.dataDir}/playlists";
+ defaultText = ''''${dataDir}/playlists'';
+ description = ''
+ The directory where mpd stores playlists.
+ '';
+ };
+
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Extra directives added to to the end of MPD's configuration
+ file, mpd.conf. Basic configuration
+ like file location and uid/gid is added automatically to the
+ beginning of the file. For available options see
+
+ mpd.conf
+ 5
+ .
+ '';
+ };
+
+ dataDir = mkOption {
+ type = types.path;
+ default = "${config.xdg.dataHome}/${name}";
+ defaultText = "$XDG_DATA_HOME/mpd";
+ description = ''
+ The directory where MPD stores its state, tag cache,
+ playlists etc.
+ '';
+ };
+
+ network = {
+
+ listenAddress = mkOption {
+ type = types.str;
+ default = "127.0.0.1";
+ example = "any";
+ description = ''
+ The address for the daemon to listen on.
+ Use any to listen on all addresses.
+ '';
+ };
+
+ port = mkOption {
+ type = types.ints.positive;
+ default = 6600;
+ description = ''
+ The TCP port on which the the daemon will listen.
+ '';
+ };
+
+ };
+
+ dbFile = mkOption {
+ type = types.nullOr types.str;
+ default = "${cfg.dataDir}/tag_cache";
+ defaultText = ''''${dataDir}/tag_cache'';
+ description = ''
+ The path to MPD's database. If set to
+ null the parameter is omitted from the
+ configuration.
+ '';
+ };
+ };
+
+ };
+
+
+ ###### implementation
+
+ config = mkIf cfg.enable {
+
+ systemd.user.services.mpd = {
+ Unit = {
+ After = [ "network.target" "sound.target" ];
+ Description = "Music Player Daemon";
+ };
+
+ Install = {
+ WantedBy = [ "default.target" ];
+ };
+
+ Service = {
+ Environment = "PATH=%h/.nix-profile/bin";
+ ExecStart = "${pkgs.mpd}/bin/mpd --no-daemon ${mpdConf}";
+ Type = "notify";
+ ExecStartPre = ''${pkgs.bash}/bin/bash -c "${pkgs.coreutils}/bin/mkdir -p '${cfg.dataDir}' '${cfg.playlistDirectory}'"'';
+ };
+ };
+ };
+
+}