(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 )) (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 )) 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 () (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.")))