| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  | # Module for MiniDLNA, a simple DLNA server. | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  |  | { config, lib, pkgs, ... }: | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 16:26:48 +02:00
										 |  |  |  | with lib; | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 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 { | 
					
						
							| 
									
										
										
										
											2015-06-15 18:18:46 +02:00
										 |  |  |  |       type = types.listOf types.str; | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  |       default = []; | 
					
						
							| 
									
										
										
										
											2013-10-30 15:33:20 +01:00
										 |  |  |  |       example = [ "/data/media" "V,/home/alice/video" ]; | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  |       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. | 
					
						
							|  |  |  |  |         '';
 | 
					
						
							|  |  |  |  |     }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-08 00:18:56 +01:00
										 |  |  |  |     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. | 
					
						
							|  |  |  |  |         '';
 | 
					
						
							|  |  |  |  |     }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  |     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} | 
					
						
							| 
									
										
										
										
											2016-04-08 22:36:03 +02:00
										 |  |  |  |         friendly_name=${config.networking.hostName} MiniDLNA | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  |         db_dir=/var/cache/minidlna | 
					
						
							| 
									
										
										
										
											2018-04-08 00:18:56 +01:00
										 |  |  |  |         log_level=${cfg.loglevel} | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  |         inotify=yes | 
					
						
							|  |  |  |  |         ${concatMapStrings (dir: ''
 | 
					
						
							|  |  |  |  |           media_dir=${dir} | 
					
						
							|  |  |  |  |         '') cfg.mediaDirs}
 | 
					
						
							|  |  |  |  |       '';
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-30 01:58:35 +02:00
										 |  |  |  |     users.users.minidlna = { | 
					
						
							| 
									
										
										
										
											2013-08-26 15:20:25 +02:00
										 |  |  |  |       description = "MiniDLNA daemon user"; | 
					
						
							|  |  |  |  |       group = "minidlna"; | 
					
						
							|  |  |  |  |       uid = config.ids.uids.minidlna; | 
					
						
							|  |  |  |  |     }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-30 01:58:35 +02:00
										 |  |  |  |     users.groups.minidlna.gid = config.ids.gids.minidlna; | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     systemd.services.minidlna = | 
					
						
							|  |  |  |  |       { description = "MiniDLNA Server"; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         wantedBy = [ "multi-user.target" ]; | 
					
						
							| 
									
										
										
										
											2014-11-12 23:19:43 +01:00
										 |  |  |  |         after = [ "network.target" "local-fs.target" ]; | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |         preStart = | 
					
						
							|  |  |  |  |           ''
 | 
					
						
							| 
									
										
										
										
											2016-04-08 22:37:11 +02:00
										 |  |  |  |             mkdir -p /var/cache/minidlna | 
					
						
							|  |  |  |  |             chown -R minidlna:minidlna /var/cache/minidlna | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  |           '';
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         serviceConfig = | 
					
						
							|  |  |  |  |           { User = "minidlna"; | 
					
						
							| 
									
										
										
										
											2016-04-08 22:37:11 +02:00
										 |  |  |  |             Group = "minidlna"; | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  |             PermissionsStartOnly = true; | 
					
						
							| 
									
										
										
										
											2016-04-08 22:37:11 +02:00
										 |  |  |  |             RuntimeDirectory = "minidlna"; | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  |             PIDFile = "/run/minidlna/pid"; | 
					
						
							|  |  |  |  |             ExecStart = | 
					
						
							| 
									
										
										
										
											2016-04-08 22:37:11 +02:00
										 |  |  |  |               "${pkgs.minidlna}/sbin/minidlnad -S -P /run/minidlna/pid" + | 
					
						
							| 
									
										
										
										
											2013-02-16 23:08:53 +01:00
										 |  |  |  |               " -f ${pkgs.writeText "minidlna.conf" cfg.config}"; | 
					
						
							|  |  |  |  |           }; | 
					
						
							|  |  |  |  |       }; | 
					
						
							|  |  |  |  |   }; | 
					
						
							|  |  |  |  | } |