nixpkgs/nixos/modules/services/networking/minidlna.nix

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

149 lines
5.7 KiB
Nix
Raw Normal View History

# Module for MiniDLNA, a simple DLNA server.
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.minidlna;
settingsFormat = pkgs.formats.keyValue { listsAsDuplicateKeys = true; };
settingsFile = settingsFormat.generate "minidlna.conf" cfg.settings;
in
{
###### interface
options.services.minidlna.enable = mkOption {
type = types.bool;
default = false;
description = lib.mdDoc ''
Whether to enable MiniDLNA, a simple DLNA server.
It serves media files such as video and music to DLNA client devices
2023-01-12 07:51:00 +00:00
such as televisions and media players. If you use the firewall, consider
adding the following: `services.minidlna.openFirewall = true;`
'';
};
options.services.minidlna.openFirewall = mkOption {
type = types.bool;
default = false;
description = lib.mdDoc ''
Whether to open both HTTP (TCP) and SSDP (UDP) ports in the firewall.
'';
};
options.services.minidlna.settings = mkOption {
default = {};
description = lib.mdDoc ''
The contents of MiniDLNA's configuration file.
2022-08-01 21:26:23 +00:00
When the service is activated, a basic template is generated from the current options opened here.
'';
type = types.submodule {
freeformType = settingsFormat.type;
options.media_dir = mkOption {
type = types.listOf types.str;
default = [];
example = [ "/data/media" "V,/home/alice/video" ];
description = lib.mdDoc ''
Directories to be scanned for media files.
2022-08-01 21:26:23 +00:00
The `A,` `V,` `P,` prefixes restrict a directory to audio, video or image files.
The directories must be accessible to the `minidlna` user account.
'';
};
options.notify_interval = mkOption {
type = types.int;
default = 90000;
description = lib.mdDoc ''
The interval between announces (in seconds).
2022-08-01 21:26:23 +00:00
Instead of waiting for announces, you should set `openFirewall` option to use SSDP discovery.
2023-01-12 07:51:00 +00:00
Lower values (e.g. 30 seconds) should be used if your network blocks the discovery unicast.
Some relevant information can be found here:
https://sourceforge.net/p/minidlna/discussion/879957/thread/1389d197/
'';
};
options.port = mkOption {
type = types.port;
default = 8200;
description = lib.mdDoc "Port number for HTTP traffic (descriptions, SOAP, media transfer).";
};
options.db_dir = mkOption {
type = types.path;
default = "/var/cache/minidlna";
example = "/tmp/minidlna";
description = lib.mdDoc "Specify the directory where you want MiniDLNA to store its database and album art cache.";
};
options.friendly_name = mkOption {
type = types.str;
2022-08-01 21:26:23 +00:00
default = config.networking.hostName;
defaultText = literalExpression "config.networking.hostName";
example = "rpi3";
description = lib.mdDoc "Name that the DLNA server presents to clients.";
};
options.root_container = mkOption {
type = types.str;
2023-01-12 07:51:00 +00:00
default = "B";
example = ".";
description = lib.mdDoc "Use a different container as the root of the directory tree presented to clients.";
};
options.log_level = mkOption {
type = types.str;
default = "warn";
example = "general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn";
description = lib.mdDoc "Defines the type of messages that should be logged and down to which level of importance.";
};
options.inotify = mkOption {
type = types.enum [ "yes" "no" ];
default = "no";
description = lib.mdDoc "Whether to enable inotify monitoring to automatically discover new files.";
};
options.enable_tivo = mkOption {
type = types.enum [ "yes" "no" ];
default = "no";
description = lib.mdDoc "Support for streaming .jpg and .mp3 files to a TiVo supporting HMO.";
};
options.wide_links = mkOption {
type = types.enum [ "yes" "no" ];
default = "no";
2022-08-01 21:26:23 +00:00
description = lib.mdDoc "Set this to yes to allow symlinks that point outside user-defined `media_dir`.";
};
};
};
imports = [
(mkRemovedOptionModule [ "services" "minidlna" "config" ] "")
(mkRemovedOptionModule [ "services" "minidlna" "extraConfig" ] "")
(mkRenamedOptionModule [ "services" "minidlna" "loglevel"] [ "services" "minidlna" "settings" "log_level" ])
(mkRenamedOptionModule [ "services" "minidlna" "rootContainer"] [ "services" "minidlna" "settings" "root_container" ])
(mkRenamedOptionModule [ "services" "minidlna" "mediaDirs"] [ "services" "minidlna" "settings" "media_dir" ])
(mkRenamedOptionModule [ "services" "minidlna" "friendlyName"] [ "services" "minidlna" "settings" "friendly_name" ])
(mkRenamedOptionModule [ "services" "minidlna" "announceInterval"] [ "services" "minidlna" "settings" "notify_interval" ])
];
###### implementation
config = mkIf cfg.enable {
networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ cfg.settings.port ];
networking.firewall.allowedUDPPorts = mkIf cfg.openFirewall [ 1900 ];
users.users.minidlna = {
2013-08-26 13:20:25 +00:00
description = "MiniDLNA daemon user";
group = "minidlna";
uid = config.ids.uids.minidlna;
};
users.groups.minidlna.gid = config.ids.gids.minidlna;
2023-01-12 07:51:00 +00:00
systemd.services.minidlna = {
description = "MiniDLNA Server";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
2023-01-12 07:51:00 +00:00
serviceConfig = {
User = "minidlna";
Group = "minidlna";
CacheDirectory = "minidlna";
RuntimeDirectory = "minidlna";
PIDFile = "/run/minidlna/pid";
ExecStart = "${pkgs.minidlna}/sbin/minidlnad -S -P /run/minidlna/pid -f ${settingsFile}";
};
2023-01-12 07:51:00 +00:00
};
};
}