aboutsummaryrefslogtreecommitdiffstats
path: root/oni/home/services/mpd.scm
blob: 6719754dc57dd705ece6cd3a225165b05ba5ac70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
(define-module (oni home services mpd)
  #:use-module (gnu services configuration)
  #:use-module (gnu packages mpd)
  #:use-module (gnu home services)
  #:use-module (gnu home services shepherd)
  #:use-module (gnu home services utils)
  #:use-module (guix packages)
  #:use-module (guix gexp)
  #:use-module (srfi srfi-1)
  #:use-module (oop goops)
  #:use-module (ice-9 string-fun)

  #:export (home-mpd-service-type
            home-mpd-configuration
            <home-mpd-audio-output>))

(define (serialize-boolean field value)
  "")

(define (serialize-home-mpd-audio-output config)
  (let ((type (slot-ref config 'type))
        (name (slot-ref config 'name))
        (path (slot-ref config 'path))
        (fmt (slot-ref config 'format)))
    (list "audio_output {"
          (format #f "    type ~s" type)
          (format #f "    name ~s" name)
          (if path (format #f "    path ~s" path) "")
          (if fmt (format #f "    format ~s" fmt) "")
          "}")))

(define (serialize-home-mpd-audio-output-list field value)
  (string-join
   (apply append (map serialize-home-mpd-audio-output value))
   "\n"))

(define (serialize-string field value)
  (format #f "~a ~s\n" (string-replace-substring (symbol->string field) "-" "_") value))

(define (type? value)
  (member value '("shout" "null" "fifo" "pipe" "alsa" "ao" "oss" "openal"
                  "solaris" "pipewire" "pulse" "jack" "httpd" "snapcast"
                  "recorder")))

(define (home-mpd-audio-output-list? value)
  (and (list? value)
       (every (lambda (v) (is-a? v <home-mpd-audio-output>)) value)))

(define-maybe string)
(define-maybe home-mpd-audio-output-list)

(define-configuration home-mpd-configuration
  (package
   (package mpd)
   "Package to use for settings MPD")
  (auto-start?
   (boolean #t)
   "Should MPD be started automatically")
  (db-file
   maybe-string
   "Where the db file will be stored")
  (log-file
   maybe-string
   "Where the log file should be located")
  (pid-file
   maybe-string
   "The file to save mpd's process ID in")
  (music-directory
   maybe-string
   "The directory where music is located")
  (playlist-directory
   maybe-string
   "The directory where saved playlists are stored")
  (state-file
   maybe-string
   "Specifies if a state file is used and where it is located")
  (audio-outputs
   maybe-home-mpd-audio-output-list
   "Output configurations"))

(define-class <home-mpd-audio-output> ()
  (type #:init-keyword #:type)
  (name #:init-keyword #:name)
  (path #:init-keyword #:path #:init-value #f)
  (format #:init-keyword #:format #:init-value #f))

(define (add-mpd-packages config)
  (list (home-mpd-configuration-package config)))

(define (serialize-mpd-configuration config)
  (serialize-configuration config home-mpd-configuration-fields))

(define (home-mpd-configuration-file config)
  (mixed-text-file
   "mpd.conf"
   (serialize-mpd-configuration config)))

(define (home-mpd-shepherd-service config)
  (list
   (shepherd-service
    (documentation "Start MPD")
    (provision '(mpd))
    (auto-start? (home-mpd-configuration-auto-start? config))
    (start
     #~(make-forkexec-constructor
        (list #$(file-append (home-mpd-configuration-package config) "/bin/mpd")
              "--no-daemon"
              #$(home-mpd-configuration-file config))
        #:log-file (format #f "~a/.local/var/log/mpd.log" (getenv "HOME"))))
    (stop #~(make-kill-destructor)))))

(define home-mpd-service-type
  (service-type
   (name 'home-mpd)
   (extensions
    (list (service-extension
           home-profile-service-type
           add-mpd-packages)
          (service-extension
           home-shepherd-service-type
           home-mpd-shepherd-service)))
   (compose identity)
   (default-value (home-mpd-configuration))
   (description "Install and configure mpd.")))