1# Module for MiniDLNA, a simple DLNA server. 2 3{ config, lib, pkgs, ... }: 4 5with lib; 6 7let 8 9 cfg = config.services.minidlna; 10 11 port = 8200; 12 13in 14 15{ 16 17 ###### interface 18 19 options = { 20 21 services.minidlna.enable = mkOption { 22 type = types.bool; 23 default = false; 24 description = 25 '' 26 Whether to enable MiniDLNA, a simple DLNA server. It serves 27 media files such as video and music to DLNA client devices 28 such as televisions and media players. 29 ''; 30 }; 31 32 services.minidlna.mediaDirs = mkOption { 33 type = types.listOf types.str; 34 default = []; 35 example = [ "/data/media" "V,/home/alice/video" ]; 36 description = 37 '' 38 Directories to be scanned for media files. The prefixes 39 <literal>A,</literal>, <literal>V,</literal> and 40 <literal>P,</literal> restrict a directory to audio, video 41 or image files. The directories must be accessible to the 42 <literal>minidlna</literal> user account. 43 ''; 44 }; 45 46 services.minidlna.config = mkOption { 47 type = types.lines; 48 description = "The contents of MiniDLNA's configuration file."; 49 }; 50 51 }; 52 53 54 ###### implementation 55 56 config = mkIf cfg.enable { 57 58 services.minidlna.config = 59 '' 60 port=${toString port} 61 friendly_name=NixOS Media Server 62 db_dir=/var/cache/minidlna 63 log_dir=/var/log/minidlna 64 inotify=yes 65 ${concatMapStrings (dir: '' 66 media_dir=${dir} 67 '') cfg.mediaDirs} 68 ''; 69 70 users.extraUsers.minidlna = { 71 description = "MiniDLNA daemon user"; 72 group = "minidlna"; 73 uid = config.ids.uids.minidlna; 74 }; 75 76 users.extraGroups.minidlna.gid = config.ids.gids.minidlna; 77 78 systemd.services.minidlna = 79 { description = "MiniDLNA Server"; 80 81 wantedBy = [ "multi-user.target" ]; 82 after = [ "network.target" "local-fs.target" ]; 83 84 preStart = 85 '' 86 mkdir -p /var/cache/minidlna /var/log/minidlna /run/minidlna 87 chown minidlna /var/cache/minidlna /var/log/minidlna /run/minidlna 88 ''; 89 90 # FIXME: log through the journal rather than 91 # /var/log/minidlna. The -d flag does that, but also raises 92 # the log level to debug... 93 serviceConfig = 94 { User = "minidlna"; 95 Group = "nogroup"; 96 PermissionsStartOnly = true; 97 Type = "forking"; 98 PIDFile = "/run/minidlna/pid"; 99 ExecStart = 100 "@${pkgs.minidlna}/sbin/minidlnad minidlnad -P /run/minidlna/pid" + 101 " -f ${pkgs.writeText "minidlna.conf" cfg.config}"; 102 }; 103 }; 104 105 }; 106 107}