2018-07-15 08:33:32 +02:00
|
|
|
{ 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"
|
|
|
|
|
|
|
|
${optionalString (cfg.network.listenAddress != "any")
|
2022-02-27 02:19:28 +01:00
|
|
|
''bind_to_address "${cfg.network.listenAddress}"''}
|
2018-07-15 08:33:32 +02:00
|
|
|
${optionalString (cfg.network.port != 6600)
|
2022-02-27 02:19:28 +01:00
|
|
|
''port "${toString cfg.network.port}"''}
|
2018-07-15 08:33:32 +02:00
|
|
|
|
|
|
|
${cfg.extraConfig}
|
|
|
|
'';
|
|
|
|
|
|
|
|
in {
|
|
|
|
|
|
|
|
###### interface
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
|
|
|
services.mpd = {
|
|
|
|
|
|
|
|
enable = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
|
|
|
description = ''
|
|
|
|
Whether to enable MPD, the music player daemon.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2020-10-02 22:49:40 +02:00
|
|
|
package = mkOption {
|
|
|
|
type = types.package;
|
|
|
|
default = pkgs.mpd;
|
|
|
|
defaultText = "pkgs.mpd";
|
|
|
|
description = ''
|
|
|
|
The MPD package to run.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2020-10-02 22:50:48 +02:00
|
|
|
musicDirectory = mkOption {
|
2020-09-06 23:37:46 +02:00
|
|
|
type = with types; either path str;
|
2022-09-15 22:19:00 +02:00
|
|
|
defaultText = literalExpression ''
|
|
|
|
''${home.homeDirectory}/music if state version < 22.11
|
|
|
|
''${xdg.userDirs.music} if xdg.userDirs.enable == true
|
|
|
|
undefined otherwise
|
|
|
|
'';
|
2022-02-27 02:19:28 +01:00
|
|
|
apply = toString; # Prevent copies to Nix store.
|
2018-07-15 08:33:32 +02:00
|
|
|
description = ''
|
|
|
|
The directory where mpd reads music from.
|
2022-09-15 22:19:00 +02:00
|
|
|
</para><para>
|
|
|
|
If <xref linkend="opt-xdg.userDirs.enable"/> is
|
|
|
|
<literal>true</literal> then the defined XDG music directory is used.
|
|
|
|
Otherwise, you must explicitly specify a value.
|
2018-07-15 08:33:32 +02:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
playlistDirectory = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
default = "${cfg.dataDir}/playlists";
|
2022-02-27 02:19:28 +01:00
|
|
|
defaultText = "\${dataDir}/playlists";
|
|
|
|
apply = toString; # Prevent copies to Nix store.
|
2018-07-15 08:33:32 +02:00
|
|
|
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, <filename>mpd.conf</filename>. Basic configuration
|
|
|
|
like file location and uid/gid is added automatically to the
|
|
|
|
beginning of the file. For available options see
|
|
|
|
<citerefentry>
|
|
|
|
<refentrytitle>mpd.conf</refentrytitle>
|
|
|
|
<manvolnum>5</manvolnum>
|
|
|
|
</citerefentry>.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
dataDir = mkOption {
|
|
|
|
type = types.path;
|
|
|
|
default = "${config.xdg.dataHome}/${name}";
|
|
|
|
defaultText = "$XDG_DATA_HOME/mpd";
|
2022-02-27 02:19:28 +01:00
|
|
|
apply = toString; # Prevent copies to Nix store.
|
2018-07-15 08:33:32 +02:00
|
|
|
description = ''
|
|
|
|
The directory where MPD stores its state, tag cache,
|
|
|
|
playlists etc.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2020-10-02 22:50:48 +02:00
|
|
|
network = {
|
|
|
|
startWhenNeeded = mkOption {
|
|
|
|
type = types.bool;
|
|
|
|
default = false;
|
|
|
|
description = ''
|
2022-02-27 02:19:28 +01:00
|
|
|
Enable systemd socket activation.
|
2020-10-02 22:50:48 +02:00
|
|
|
'';
|
|
|
|
};
|
2018-07-15 08:33:32 +02:00
|
|
|
|
|
|
|
listenAddress = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "127.0.0.1";
|
|
|
|
example = "any";
|
|
|
|
description = ''
|
|
|
|
The address for the daemon to listen on.
|
|
|
|
Use <literal>any</literal> to listen on all addresses.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
port = mkOption {
|
2019-08-19 20:37:48 +02:00
|
|
|
type = types.port;
|
2018-07-15 08:33:32 +02:00
|
|
|
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";
|
2022-02-27 02:19:28 +01:00
|
|
|
defaultText = "\${dataDir}/tag_cache";
|
2018-07-15 08:33:32 +02:00
|
|
|
description = ''
|
|
|
|
The path to MPD's database. If set to
|
|
|
|
<literal>null</literal> the parameter is omitted from the
|
|
|
|
configuration.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
###### implementation
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
2021-07-07 23:24:27 +02:00
|
|
|
assertions = [
|
2022-02-27 02:19:28 +01:00
|
|
|
(lib.hm.assertions.assertPlatform "services.mpd" pkgs lib.platforms.linux)
|
2021-07-07 23:24:27 +02:00
|
|
|
];
|
2018-07-15 08:33:32 +02:00
|
|
|
|
2022-09-15 22:19:00 +02:00
|
|
|
services.mpd = mkMerge [
|
|
|
|
(mkIf (versionAtLeast config.home.stateVersion "22.11"
|
|
|
|
&& config.xdg.userDirs.enable) {
|
|
|
|
musicDirectory = mkOptionDefault config.xdg.userDirs.music;
|
|
|
|
})
|
|
|
|
|
|
|
|
(mkIf (versionOlder config.home.stateVersion "22.11") {
|
|
|
|
musicDirectory = mkOptionDefault "${config.home.homeDirectory}/music";
|
|
|
|
})
|
|
|
|
];
|
|
|
|
|
2018-07-15 08:33:32 +02:00
|
|
|
systemd.user.services.mpd = {
|
|
|
|
Unit = {
|
|
|
|
After = [ "network.target" "sound.target" ];
|
|
|
|
Description = "Music Player Daemon";
|
|
|
|
};
|
2018-07-29 18:15:50 +02:00
|
|
|
|
2020-10-02 22:50:48 +02:00
|
|
|
Install = mkIf (!cfg.network.startWhenNeeded) {
|
2018-07-15 08:33:32 +02:00
|
|
|
WantedBy = [ "default.target" ];
|
|
|
|
};
|
|
|
|
|
|
|
|
Service = {
|
2018-07-29 18:15:50 +02:00
|
|
|
Environment = "PATH=${config.home.profileDirectory}/bin";
|
2020-10-02 22:49:40 +02:00
|
|
|
ExecStart = "${cfg.package}/bin/mpd --no-daemon ${mpdConf}";
|
2018-07-15 08:33:32 +02:00
|
|
|
Type = "notify";
|
2022-02-27 02:19:28 +01:00
|
|
|
ExecStartPre = ''
|
|
|
|
${pkgs.bash}/bin/bash -c "${pkgs.coreutils}/bin/mkdir -p '${cfg.dataDir}' '${cfg.playlistDirectory}'"'';
|
2018-07-15 08:33:32 +02:00
|
|
|
};
|
|
|
|
};
|
2022-09-15 22:19:00 +02:00
|
|
|
|
2020-10-02 22:50:48 +02:00
|
|
|
systemd.user.sockets.mpd = mkIf cfg.network.startWhenNeeded {
|
|
|
|
Socket = {
|
|
|
|
ListenStream = let
|
2022-02-27 02:19:28 +01:00
|
|
|
listen = if cfg.network.listenAddress == "any" then
|
|
|
|
toString cfg.network.port
|
|
|
|
else
|
|
|
|
"${cfg.network.listenAddress}:${toString cfg.network.port}";
|
2020-10-02 22:50:48 +02:00
|
|
|
in [ listen "%t/mpd/socket" ];
|
|
|
|
|
|
|
|
Backlog = 5;
|
|
|
|
KeepAlive = true;
|
|
|
|
};
|
|
|
|
|
2022-02-27 02:19:28 +01:00
|
|
|
Install = { WantedBy = [ "sockets.target" ]; };
|
2020-10-02 22:50:48 +02:00
|
|
|
};
|
2022-10-05 17:22:12 +02:00
|
|
|
|
|
|
|
home.packages = [ cfg.package ];
|
2018-07-15 08:33:32 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|