From 5f46121fc753d59fc45d7ff9a37d36d28c33933d Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Mon, 7 Nov 2022 20:16:19 -0800 Subject: Add MPD configuration This also includes an attempt at installing a custom SCSH that defines some search paths. But unfortunately it didn't work, so the SCSH ends up being the usual one and the ‘mpd-random-albums’ package doesn't actually work. The main MPD configuration does work, though. This also includes the instruction to install tmsu which I want to try out again. --- oni/home/services/mpd.scm | 124 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 oni/home/services/mpd.scm (limited to 'oni/home/services') 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 + )) + +(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."))) -- cgit v1.2.3-54-g00ecf