1{ config, lib, pkgs, ... }:
2
3with pkgs;
4with lib;
5
6let
7 uid = config.ids.uids.mopidy;
8 gid = config.ids.gids.mopidy;
9 cfg = config.services.mopidy;
10
11 mopidyConf = writeText "mopidy.conf" cfg.configuration;
12
13 mopidyEnv = buildEnv {
14 name = "mopidy-with-extensions-${mopidy.version}";
15 paths = closePropagation cfg.extensionPackages;
16 pathsToLink = [ "/${python.sitePackages}" ];
17 buildInputs = [ makeWrapper ];
18 postBuild = ''
19 makeWrapper ${mopidy}/bin/mopidy $out/bin/mopidy \
20 --prefix PYTHONPATH : $out/${python.sitePackages}
21 '';
22 };
23in {
24
25 options = {
26
27 services.mopidy = {
28
29 enable = mkEnableOption "Mopidy, a music player daemon";
30
31 dataDir = mkOption {
32 default = "/var/lib/mopidy";
33 type = types.str;
34 description = ''
35 The directory where Mopidy stores its state.
36 '';
37 };
38
39 extensionPackages = mkOption {
40 default = [];
41 type = types.listOf types.package;
42 example = literalExample "[ pkgs.mopidy-spotify ]";
43 description = ''
44 Mopidy extensions that should be loaded by the service.
45 '';
46 };
47
48 configuration = mkOption {
49 default = "";
50 type = types.lines;
51 description = ''
52 The configuration that Mopidy should use.
53 '';
54 };
55
56 extraConfigFiles = mkOption {
57 default = [];
58 type = types.listOf types.str;
59 description = ''
60 Extra config file read by Mopidy when the service starts.
61 Later files in the list overrides earlier configuration.
62 '';
63 };
64
65 };
66
67 };
68
69 ###### implementation
70
71 config = mkIf cfg.enable {
72
73 systemd.services.mopidy = {
74 wantedBy = [ "multi-user.target" ];
75 after = [ "network.target" "sound.target" ];
76 description = "mopidy music player daemon";
77 preStart = "mkdir -p ${cfg.dataDir} && chown -R mopidy:mopidy ${cfg.dataDir}";
78 serviceConfig = {
79 ExecStart = "${mopidyEnv}/bin/mopidy --config ${concatStringsSep ":" ([mopidyConf] ++ cfg.extraConfigFiles)}";
80 User = "mopidy";
81 PermissionsStartOnly = true;
82 };
83 };
84
85 systemd.services.mopidy-scan = {
86 description = "mopidy local files scanner";
87 preStart = "mkdir -p ${cfg.dataDir} && chown -R mopidy:mopidy ${cfg.dataDir}";
88 serviceConfig = {
89 ExecStart = "${mopidyEnv}/bin/mopidy --config ${concatStringsSep ":" ([mopidyConf] ++ cfg.extraConfigFiles)} local scan";
90 User = "mopidy";
91 PermissionsStartOnly = true;
92 Type = "oneshot";
93 };
94 };
95
96 users.extraUsers.mopidy = {
97 inherit uid;
98 group = "mopidy";
99 extraGroups = [ "audio" ];
100 description = "Mopidy daemon user";
101 home = "${cfg.dataDir}";
102 };
103
104 users.extraGroups.mopidy.gid = gid;
105
106 };
107
108}