120 lines
3.7 KiB
Nix
120 lines
3.7 KiB
Nix
# Module for MiniDLNA, a simple DLNA server.
|
||
{ config, lib, pkgs, ... }:
|
||
|
||
with lib;
|
||
|
||
let
|
||
cfg = config.services.minidlna;
|
||
port = 8200;
|
||
in
|
||
|
||
{
|
||
###### interface
|
||
options = {
|
||
services.minidlna.enable = mkOption {
|
||
type = types.bool;
|
||
default = false;
|
||
description =
|
||
''
|
||
Whether to enable MiniDLNA, a simple DLNA server. It serves
|
||
media files such as video and music to DLNA client devices
|
||
such as televisions and media players.
|
||
'';
|
||
};
|
||
|
||
services.minidlna.mediaDirs = mkOption {
|
||
type = types.listOf types.str;
|
||
default = [];
|
||
example = [ "/data/media" "V,/home/alice/video" ];
|
||
description =
|
||
''
|
||
Directories to be scanned for media files. The prefixes
|
||
<literal>A,</literal>, <literal>V,</literal> and
|
||
<literal>P,</literal> restrict a directory to audio, video
|
||
or image files. The directories must be accessible to the
|
||
<literal>minidlna</literal> user account.
|
||
'';
|
||
};
|
||
|
||
services.minidlna.loglevel = mkOption {
|
||
type = types.str;
|
||
default = "warn";
|
||
example = "general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn";
|
||
description =
|
||
''
|
||
Defines the type of messages that should be logged, and down to
|
||
which level of importance they should be considered.
|
||
|
||
The possible types are “artwork”, “database”, “general”, “http”,
|
||
“inotify”, “metadata”, “scanner”, “ssdp” and “tivo”.
|
||
|
||
The levels are “off”, “fatal”, “error”, “warn”, “info” and
|
||
“debug”, listed here in order of decreasing importance. “off”
|
||
turns off logging messages entirely, “fatal” logs the most
|
||
critical messages only, and so on down to “debug” that logs every
|
||
single messages.
|
||
|
||
The types are comma-separated, followed by an equal sign (‘=’),
|
||
followed by a level that applies to the preceding types. This can
|
||
be repeated, separating each of these constructs with a comma.
|
||
|
||
Defaults to “general,artwork,database,inotify,scanner,metadata,
|
||
http,ssdp,tivo=warn” which logs every type of message at the
|
||
“warn” level.
|
||
'';
|
||
};
|
||
|
||
services.minidlna.config = mkOption {
|
||
type = types.lines;
|
||
description = "The contents of MiniDLNA's configuration file.";
|
||
};
|
||
};
|
||
|
||
###### implementation
|
||
config = mkIf cfg.enable {
|
||
services.minidlna.config =
|
||
''
|
||
port=${toString port}
|
||
friendly_name=${config.networking.hostName} MiniDLNA
|
||
db_dir=/var/cache/minidlna
|
||
log_level=${cfg.loglevel}
|
||
inotify=yes
|
||
${concatMapStrings (dir: ''
|
||
media_dir=${dir}
|
||
'') cfg.mediaDirs}
|
||
'';
|
||
|
||
users.extraUsers.minidlna = {
|
||
description = "MiniDLNA daemon user";
|
||
group = "minidlna";
|
||
uid = config.ids.uids.minidlna;
|
||
};
|
||
|
||
users.extraGroups.minidlna.gid = config.ids.gids.minidlna;
|
||
|
||
systemd.services.minidlna =
|
||
{ description = "MiniDLNA Server";
|
||
|
||
wantedBy = [ "multi-user.target" ];
|
||
after = [ "network.target" "local-fs.target" ];
|
||
|
||
preStart =
|
||
''
|
||
mkdir -p /var/cache/minidlna
|
||
chown -R minidlna:minidlna /var/cache/minidlna
|
||
'';
|
||
|
||
serviceConfig =
|
||
{ User = "minidlna";
|
||
Group = "minidlna";
|
||
PermissionsStartOnly = true;
|
||
RuntimeDirectory = "minidlna";
|
||
PIDFile = "/run/minidlna/pid";
|
||
ExecStart =
|
||
"${pkgs.minidlna}/sbin/minidlnad -S -P /run/minidlna/pid" +
|
||
" -f ${pkgs.writeText "minidlna.conf" cfg.config}";
|
||
};
|
||
};
|
||
};
|
||
}
|