BPD Plugin
==========

BPD is a music player using music from a beets library. It runs as a daemon and
implements the MPD protocol, so it's compatible with all the great MPD clients
out there. I'm using `Theremin`_, `gmpc`_, `Sonata`_, and `Ario`_ successfully.

.. _Theremin: https://theremin.sigterm.eu/
.. _gmpc: http://gmpc.wikia.com/wiki/Gnome_Music_Player_Client
.. _Sonata: http://sonata.berlios.de/
.. _Ario: http://ario-player.sourceforge.net/

Dependencies
------------

Before you can use BPD, you'll need the media library called GStreamer (along
with its Python bindings) on your system.

* On Mac OS X, you can use `MacPorts`_ or `Homebrew`_. For MacPorts, just run
  ``port install py27-gst-python``. For Homebrew, the appropriate formulae are
  in `homebrew-versions`_, so run ``brew tap homebrew/versions`` and then
  ``brew install gst-python010``. (Note that you'll need the Mac OS X
  Developer Tools in either case.)

.. _homebrew-versions: https://github.com/Homebrew/homebrew-versions

* On Linux, it's likely that you already have gst-python. (If not, your
  distribution almost certainly has a package for it.)

* On Windows, you may want to try `GStreamer WinBuilds`_ (cavet emptor: I
  haven't tried this).

You will also need the various GStreamer plugin packages to make everything
work. See the :doc:`/plugins/chroma` documentation for more information on
installing GStreamer plugins.

.. _MacPorts: http://www.macports.org/
.. _GStreamer WinBuilds: http://www.gstreamer-winbuild.ylatuya.es/
.. _Homebrew: http://mxcl.github.com/homebrew/

Usage
-----

To use the ``bpd`` plugin, first enable it in your configuration (see
:ref:`using-plugins`).
Then, you can run BPD by invoking::

    $ beet bpd

Fire up your favorite MPD client to start playing music. The MPD site has `a
long list of available clients`_. Here are my favorites:

.. _a long list of available clients: http://mpd.wikia.com/wiki/Clients

* Linux: `gmpc`_, `Sonata`_

* Mac: `Theremin`_

* Windows: I don't know. Get in touch if you have a recommendation.

* iPhone/iPod touch: `MPoD`_

.. _MPoD: http://www.katoemba.net/makesnosenseatall/mpod/

One nice thing about MPD's (and thus BPD's) client-server architecture is that
the client can just as easily on a different computer from the server as it can
be run locally. Control your music from your laptop (or phone!) while it plays
on your headless server box. Rad!

Configuration
-------------

To configure the plugin, make a ``bpd:`` section in your configuration file.
The available options are:

- **host**:
  Default: Bind to all interfaces.
- **port**:
  Default: 6600
- **password**:
  Default: No password.
- **volume**: Initial volume, as a percentage.
  Default: 100

Here's an example::

    bpd:
        host: 127.0.0.1
        port: 6600
        password: seekrit
        volume: 100

Implementation Notes
--------------------

In the real MPD, the user can browse a music directory as it appears on disk.
In beets, we like to abstract away from the directory structure. Therefore, BPD
creates a "virtual" directory structure (artist/album/track) to present to
clients. This is static for now and cannot be reconfigured like the real
on-disk directory structure can. (Note that an obvious solution to this is just
string matching on items' destination, but this requires examining the entire
library Python-side for every query.)

We don't currently support versioned playlists. Many clients, however, use
plchanges instead of playlistinfo to get the current playlist, so plchanges
contains a dummy implementation that just calls playlistinfo.

The ``stats`` command always send zero for ``playtime``, which is supposed to
indicate the amount of time the server has spent playing music. BPD doesn't
currently keep track of this.

The ``update`` command regenerates the directory tree from the beets database.

Unimplemented Commands
----------------------

These are the commands from `the MPD protocol`_ that have not yet been
implemented in BPD.

.. _the MPD protocol: http://www.musicpd.org/doc/protocol/

Saved playlists:

* playlistclear
* playlistdelete
* playlistmove
* playlistadd
* playlistsearch
* listplaylist
* listplaylistinfo
* playlistfind
* rm
* save
* load
* rename

Deprecated:

* playlist
* volume
