1
0
Fork 0
mirror of https://github.com/nix-community/home-manager synced 2024-11-15 23:59:45 +01:00
home-manager/modules/services/mpd.nix

217 lines
5.9 KiB
Nix
Raw Normal View History

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")
''bind_to_address "${cfg.network.listenAddress}"''}
2018-07-15 08:33:32 +02:00
${optionalString (cfg.network.port != 6600)
''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 {
type = with types; either path str;
defaultText = literalExpression ''
''${home.homeDirectory}/music if state version < 22.11
''${xdg.userDirs.music} if xdg.userDirs.enable == true
undefined otherwise
'';
apply = toString; # Prevent copies to Nix store.
2018-07-15 08:33:32 +02:00
description = ''
The directory where mpd reads music from.
</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";
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>.
'';
};
extraArgs = mkOption {
type = types.listOf types.str;
default = [ ];
example = [ "--verbose" ];
description = ''
Extra command-line arguments to pass to MPD.
'';
};
2018-07-15 08:33:32 +02:00
dataDir = mkOption {
type = types.path;
default = "${config.xdg.dataHome}/${name}";
defaultText = "$XDG_DATA_HOME/mpd";
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 = ''
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 {
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";
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 {
assertions = [
(lib.hm.assertions.assertPlatform "services.mpd" pkgs lib.platforms.linux)
];
2018-07-15 08:33:32 +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";
ExecStart = "${cfg.package}/bin/mpd --no-daemon ${mpdConf} ${
escapeShellArgs cfg.extraArgs
}";
2018-07-15 08:33:32 +02:00
Type = "notify";
ExecStartPre = ''
${pkgs.bash}/bin/bash -c "${pkgs.coreutils}/bin/mkdir -p '${cfg.dataDir}' '${cfg.playlistDirectory}'"'';
2018-07-15 08:33:32 +02:00
};
};
2020-10-02 22:50:48 +02:00
systemd.user.sockets.mpd = mkIf cfg.network.startWhenNeeded {
Socket = {
ListenStream = let
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;
};
Install = { WantedBy = [ "sockets.target" ]; };
2020-10-02 22:50:48 +02:00
};
home.packages = [ cfg.package ];
2018-07-15 08:33:32 +02:00
};
}