mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-13 13:40:28 +03:00
nixos/minidlna: refactor (#344018)
This commit is contained in:
commit
3a3b9dbba3
1 changed files with 45 additions and 77 deletions
|
@ -1,47 +1,23 @@
|
|||
# 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
|
||||
format = pkgs.formats.keyValue { listsAsDuplicateKeys = true; };
|
||||
cfgfile = format.generate "minidlna.conf" cfg.settings;
|
||||
|
||||
{
|
||||
###### 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. If you use the firewall, consider
|
||||
adding the following: `services.minidlna.openFirewall = true;`
|
||||
'';
|
||||
};
|
||||
in {
|
||||
options.services.minidlna.enable = lib.mkEnableOption "MiniDLNA, a simple DLNA server. Consider adding `openFirewall = true` into your config";
|
||||
options.services.minidlna.openFirewall = lib.mkEnableOption "opening HTTP (TCP) and SSDP (UDP) ports in the firewall";
|
||||
options.services.minidlna.package = lib.mkPackageOption pkgs "minidlna" {};
|
||||
|
||||
options.services.minidlna.package = lib.mkPackageOption pkgs "minidlna" { };
|
||||
|
||||
options.services.minidlna.openFirewall = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to open both HTTP (TCP) and SSDP (UDP) ports in the firewall.
|
||||
'';
|
||||
};
|
||||
|
||||
options.services.minidlna.settings = mkOption {
|
||||
options.services.minidlna.settings = lib.mkOption {
|
||||
default = {};
|
||||
description = ''
|
||||
The contents of MiniDLNA's configuration file.
|
||||
When the service is activated, a basic template is generated from the current options opened here.
|
||||
'';
|
||||
type = types.submodule {
|
||||
freeformType = settingsFormat.type;
|
||||
description = "Configuration for `minidlna.conf(5)`.";
|
||||
type = lib.types.submodule {
|
||||
freeformType = format.type;
|
||||
|
||||
options.media_dir = mkOption {
|
||||
type = types.listOf types.str;
|
||||
options.media_dir = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.str;
|
||||
default = [];
|
||||
example = [ "/data/media" "V,/home/alice/video" ];
|
||||
description = ''
|
||||
|
@ -50,88 +26,80 @@ in
|
|||
The directories must be accessible to the `minidlna` user account.
|
||||
'';
|
||||
};
|
||||
options.notify_interval = mkOption {
|
||||
type = types.int;
|
||||
options.notify_interval = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 90000;
|
||||
description = ''
|
||||
The interval between announces (in seconds).
|
||||
Instead of waiting for announces, you should set `openFirewall` option to use SSDP discovery.
|
||||
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/
|
||||
Lower values (e.g. 30 seconds) should be used if your network is blocking the SSDP multicast.
|
||||
Some relevant information can be found [here](https://sourceforge.net/p/minidlna/discussion/879957/thread/1389d197/).
|
||||
'';
|
||||
};
|
||||
options.port = mkOption {
|
||||
type = types.port;
|
||||
options.port = lib.mkOption {
|
||||
type = lib.types.port;
|
||||
default = 8200;
|
||||
description = "Port number for HTTP traffic (descriptions, SOAP, media transfer).";
|
||||
};
|
||||
options.db_dir = mkOption {
|
||||
type = types.path;
|
||||
options.db_dir = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
default = "/var/cache/minidlna";
|
||||
example = "/tmp/minidlna";
|
||||
description = "Specify the directory where you want MiniDLNA to store its database and album art cache.";
|
||||
description = "Specify the directory to store database and album art cache.";
|
||||
};
|
||||
options.friendly_name = mkOption {
|
||||
type = types.str;
|
||||
options.friendly_name = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = config.networking.hostName;
|
||||
defaultText = literalExpression "config.networking.hostName";
|
||||
defaultText = lib.literalExpression "config.networking.hostName";
|
||||
example = "rpi3";
|
||||
description = "Name that the DLNA server presents to clients.";
|
||||
description = "Name that the server presents to clients.";
|
||||
};
|
||||
options.root_container = mkOption {
|
||||
type = types.str;
|
||||
options.root_container = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
default = "B";
|
||||
example = ".";
|
||||
description = "Use a different container as the root of the directory tree presented to clients.";
|
||||
};
|
||||
options.log_level = mkOption {
|
||||
type = types.str;
|
||||
options.log_level = lib.mkOption {
|
||||
type = lib.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.";
|
||||
};
|
||||
options.inotify = mkOption {
|
||||
type = types.enum [ "yes" "no" ];
|
||||
options.enable_subtitles = lib.mkOption {
|
||||
type = lib.types.enum [ "yes" "no" ];
|
||||
default = "yes";
|
||||
description = "Enable subtitle support on unknown clients.";
|
||||
};
|
||||
options.inotify = lib.mkOption {
|
||||
type = lib.types.enum [ "yes" "no" ];
|
||||
default = "no";
|
||||
description = "Whether to enable inotify monitoring to automatically discover new files.";
|
||||
};
|
||||
options.enable_tivo = mkOption {
|
||||
type = types.enum [ "yes" "no" ];
|
||||
options.enable_tivo = lib.mkOption {
|
||||
type = lib.types.enum [ "yes" "no" ];
|
||||
default = "no";
|
||||
description = "Support for streaming .jpg and .mp3 files to a TiVo supporting HMO.";
|
||||
};
|
||||
options.wide_links = mkOption {
|
||||
type = types.enum [ "yes" "no" ];
|
||||
options.wide_links = lib.mkOption {
|
||||
type = lib.types.enum [ "yes" "no" ];
|
||||
default = "no";
|
||||
description = "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 ];
|
||||
config = lib.mkIf cfg.enable {
|
||||
networking.firewall.allowedTCPPorts = lib.mkIf cfg.openFirewall [ cfg.settings.port ];
|
||||
networking.firewall.allowedUDPPorts = lib.mkIf cfg.openFirewall [ 1900 ];
|
||||
|
||||
users.groups.minidlna.gid = config.ids.gids.minidlna;
|
||||
users.users.minidlna = {
|
||||
description = "MiniDLNA daemon user";
|
||||
group = "minidlna";
|
||||
uid = config.ids.uids.minidlna;
|
||||
};
|
||||
|
||||
users.groups.minidlna.gid = config.ids.gids.minidlna;
|
||||
|
||||
systemd.services.minidlna = {
|
||||
description = "MiniDLNA Server";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
@ -143,7 +111,7 @@ in
|
|||
CacheDirectory = "minidlna";
|
||||
RuntimeDirectory = "minidlna";
|
||||
PIDFile = "/run/minidlna/pid";
|
||||
ExecStart = "${lib.getExe cfg.package} -S -P /run/minidlna/pid -f ${settingsFile}";
|
||||
ExecStart = "${lib.getExe cfg.package} -S -P /run/minidlna/pid -f ${cfgfile}";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue