diff options
Diffstat (limited to 'oni/home')
-rw-r--r-- | oni/home/config/rincewind.scm | 26 | ||||
-rw-r--r-- | oni/home/services/mpd.scm | 124 |
2 files changed, 148 insertions, 2 deletions
diff --git a/oni/home/config/rincewind.scm b/oni/home/config/rincewind.scm index c093f66..7b58931 100644 --- a/oni/home/config/rincewind.scm +++ b/oni/home/config/rincewind.scm @@ -5,6 +5,7 @@ #:use-module (gnu packages commencement) #:use-module (gnu packages emacs) #:use-module (gnu packages emacs-xyz) + #:use-module (gnu packages file-systems) #:use-module (gnu packages linux) #:use-module (gnu packages music) #:use-module (gnu packages video) @@ -32,7 +33,10 @@ #:use-module (oni packages notmuch-collect-tasks) #:use-module (oni packages notmuch-tag-mailinglists) #:use-module (oni packages pick-random-wallpaper) - #:use-module (oni packages shutdown-rofi)) + #:use-module (oni packages shutdown-rofi) + #:use-module (oni packages mpd-random-albums) + #:use-module (oni home services mpd) + #:use-module (oop goops)) (define (with-master-branch package) "Apply a transformation to PACKAGE so that it uses the master branch." @@ -55,6 +59,8 @@ emacs-org-roam emacs-vterm fakeroot ; Needed for build arch packages + tmsu + mpd-random-albums )) (services @@ -106,4 +112,20 @@ (home-emacs-configuration (package emacs-next))) - (service home-flameshot-service-type)))) + (service home-flameshot-service-type) + + (service home-mpd-service-type + (home-mpd-configuration + (music-directory "~/music") + (playlist-directory "~/music/playlists") + (log-file "~/.local/share/mpd/mpd.log") + (pid-file "~/.local/share/mpd/mpd.pid") + (db-file "~/.local/share/mpd/mpd.db") + (state-file "~/.local/share/mpd/mpdstate") + (audio-outputs + (list (make <home-mpd-audio-output> #:type "pulse" #:name "MPD Pulse") + (make <home-mpd-audio-output> + #:type "fifo" + #:name "Visualizer" + #:path "/tmp/mpd.fifo" + #:format "44100:16:2")))))))) 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."))) |