elmpd is a tight, asynchronous, ergonomic MPD client library in Emacs Lisp.
This package is released under the GPL v3.
Emacs 25.1.
The simplest way to install elmpd is from MELPA.
You can also install the package manually. Download the .tar file from Github or my personal page and say:
(package-install-file "elmpd-1.0.0.tar")
I’m now making GitHub releases that include Autotools source distributions:
curl -L --output elmpd-1.0.0.tar.gz https://github.com/sp1ff/elmpd/releases/download/1.0.0/elmpd-1.0.0.tar.gz
tar xf elmpd-1.0.0.tar.gz && cd elmpd-1.0.0
./configure && make all check
sudo make install
And of course, you can just build from source:
git clone git@github.com:sp1ff/elmpd.git
cd elmpd
./bootstrap
./configure && make all check
sudo make install
User documentation is provided with the package, and may also be found here.
Damien Cassou, the author of mpdel and libmpdel, reached out to ask “Why elmpd?” His question prompted me to clarify my thoughts around this project & I’ve adapted my response here.
I’ve looked at a few MPD clients, including mpdel. As I fine-tuned my workflow, however, I found myself wanting less functionality: rather than interacting with a fully-featured client, I just wanted to skip to the next song while I was editing code, for example. I customize my mode line heavily, and I wanted just a little bit of logic to add the current track to the mode line & keep it up-to-date. I have written a companion daemon to MPD that maintains ratings & play counts; I just needed a little function that would let me rate the current track while I was reading mail, for instance.
My next move was to read through a number of client libraries for inspiration, both in C & Emacs Lisp. Many of them had strong opinions on how one should talk to MPD. Having been programming MPD for a while I had come to appreciate its simplicity (after all, one can program it from bash by simply echo
-ing commands to /dev/tcp/$host/$port
). My experience with async Rust inspired me to see how simple I could make this. elmpd
exports two primary functions: elmpd-connect & elmpd-send. Each connection consumes a socket & optionally a callback– that’s it; no buffer, no transaction queue. Put another way, if other libraries are Gnus (featureful, encourages you to read your e-mail in a certain way), then elmpd is Mailutils (small utilities that leave it up to the user to assemble them into something useful).
The package has been stable for a few years now, so as of September 2024 I’m calling this “1.0”. It’s ripe for being used to build up a more caller-friendly API: something like (play)
instead of
(let ((conn (elmpd-connect)))
(elmpd-send conn "play"))
I’ve written a separate package, mpdmacs, that hopefully does so in a generic way.
Comments, suggestions & bug reports welcome in the issues or at sp1ff@pobox.com.