Danielle McLean
bc56686fc4
python-mpd2 unreliably returns either a single value or a list of values for commands like currentsong, which is super fun if you're trying to write type stubs for it that statically describe its behaviour. Whee. Anyway, I ended up changing my internal song model to always use lists for tags like artist and genre which are likely to have multiple values. There's some finagling involved in massaging python-mpd2's output into lists every time. However it's much nicer to work with an object that always has a list of artists, even if it's a list of one or zero artists, rather than an object that can have a single artist, a list of multiple artists, or a null. So it's worth it. The MPNowPlayingInfoCenter in MacOS only works with single string values for these tags, not lists, so we have to join the artists and such into a single string for its consumption. I'm using commas for the separator at the moment, but I may make this a config option later on if there's interest. |
||
---|---|---|
src | ||
stubs | ||
.editorconfig | ||
.envrc | ||
.gitignore | ||
me.00dani.mpd-now-playable.plist | ||
pdm.lock | ||
pyproject.toml | ||
README.md |
mpd-now-playable
This little Python program turns your MPD server into a now playable app on MacOS. This enables your keyboard's standard media keys to control MPD, as well as more esoteric music control methods like the buttons on your Bluetooth headphones.
Installation
The recommended way to install mpd-now-playable and its dependencies is with pipx:
pipx install mpd-now-playable
# or, if you'd like to use a separate cache service, one of these:
pipx install mpd-now-playable[redis,msgpack]
pipx install mpd-now-playable[memcached,msgpack]
Once pipx is done, the mpd-now-playable
script should be available on your $PATH
and ready to use.
Most likely, you'll want mpd-now-playable to stay running in the background as a launchd service. Here's the service plist I use, but it's hardcoded to my $HOME
so you'll want to customise it.
Configuration
You may not need any configuration! If you've got a relatively normal MPD setup on your local machine, mpd-now-playable ought to just work out of the box, as it uses sensible defaults. If you need to control a remote MPD server, or your MPD clients use a password, though, you'll need configuration for that use case.
Currently, mpd-now-playable can only be configured through environment variables. Command-line arguments are intentionally not supported, since your MPD password is among the supported settings and command-line arguments are not a secure way to pass secrets such as passwords into commands. Reading configuration from a file is secure, provided the file itself is kept secure, so mpd-now-playable may support a config file in future.
The following environment variables are read. The MPD_HOST
and MPD_PORT
variables are supported in the same way mpc
uses them, but you can alternatively provide your password as a separate MPD_PASSWORD
variable if you wish.
MPD_HOST
- defaults tolocalhost
, which should be fine for most users. If you want to control a remote MPD server, though, you can.MPD_PORT
- defaults to 6600, which will almost always be the correct port to use.MPD_PASSWORD
- has no default. Set this only if your MPD server expects a password. You can also provide a password by settingMPD_HOST=password@host
, if you want to be consistent with howmpc
works.
Additionally, mpd-now-playable caches your album artwork, by default simply in memory. It may be configured to use an external cache, and currently supports Redis and Memcached for this purpose. To use one of these, set the environment variable MPD_NOW_PLAYABLE_CACHE
to an appropriate URL for your cache service:
- For Redis, use something like
redis://localhost:6379/0
. - For Memcached, use something like
memcached://localhost:11211
.
You may provide a namespace
query parameter to prefix cache keys if you wish, as well as a password
query parameter if your service requires a password to access. As with your other environment variables, keep your cache password secure.
One simple secure way to set your environment variables is with a small wrapper script like this:
#!/bin/sh
export MPD_HOSTNAME=my.cool.mpd.host
export MPD_PORT=6700
export MPD_PASSWORD=swordfish
export MPD_NOW_PLAYABLE_CACHE='redis://localhost:6379/0?namespace=mpd-now-playable&password=fishsword'
exec mpd-now-playable
Make sure this wrapper script is only readable by you, with something like chmod 700
!
Limitations
mpd-now-playable is currently very specific to MacOS. I did my best to keep the generic MPD and extremely Apple parts separate, but it definitely won't work with MPRIS2 or the Windows system media feature.
Chances are my MacOS integration code isn't the best, either. This is the first project I've written using PyObjC and it took a lot of fiddling to get working.
I'm very open to contributions to fix any of these things, if you're interested in writing them!