aboutsummaryrefslogtreecommitdiffstats
path: root/oni/home/services/mpd.scm
diff options
context:
space:
mode:
Diffstat (limited to 'oni/home/services/mpd.scm')
-rw-r--r--oni/home/services/mpd.scm124
1 files changed, 124 insertions, 0 deletions
diff --git a/oni/home/services/mpd.scm b/oni/home/services/mpd.scm
new file mode 100644
index 0000000..6719754
--- /dev/null
+++ b/oni/home/services/mpd.scm
@@ -0,0 +1,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.")))