README.md

# Mpdex

Elixir client for Music Player Daemon.

Library does not implement complete
[MPD protocol](https://mpd.readthedocs.io/en/latest/protocol.html "MPD protocol documentation").
Only essential parts for manipulating playback, music database, play
lists and play queue are implemented.

Through `Elixir.Registry` Mpdex allows client process to subscribe to
notifications and receive MPD status and play queue changes.

## Installation

Package can be installed by adding `mpdex` to your list of
dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:mpdex, "~> 1.0.0"}
  ]
end
```
## Usage

For details see `Mpdex` documentation.

### Manipulating play queue

```elixir
{:ok, mpd} = Mpdex.start_link(host: "localhost", port: 6600)

# Clear the play queue
Mpdex.clear(mpd)

# Add stream to queue
Mpdex.add_to_queue(mpd, "https://naxidigital-cafe128ssl.streaming.rs:8022#Naxi Cafe Radio")

# Add file to queue
Mpdex.add_to_queue(mpd, "Klasika/radetzky-march.mp3")
```

Mpdex will broadcast each queue change in the following format (with
all unrecognized metadata, if any, returned as a list):

```elixir
[
  %{
    file: "https://naxidigital-cafe128ssl.streaming.rs:8022#Naxi Cafe Radio",
    metadata: %{
      album: "Unknown",
      artist: "Unknown",
      id: "10",
      name: "NAXI CAFE RADIO (NAXI,Belgrade,Serbia, NAXI,Beograd,Srbija) - 128k",
      position: 0,
      time: 0,
      title: "https://naxidigital-cafe128ssl.streaming.rs:8022#Naxi Cafe Radio",
      undefined: ""
    }
  },
  %{
    file: "Klasika/radetzky-march.mp3",
    metadata: %{
      album: "The Wedding Collection 1",
      artist: "Various",
      duration: 178.04,
      genre: "Blues",
      id: "11",
      last_modified: ~U[2012-01-29 12:56:50Z],
      position: 1,
      time: 178,
      title: "Radetzky March op. 228/Johann",
      undefined: ["OK", ""]
    }
  }
]
```

### Playback

```elixir
Mpdex.play(mpd, :position, 0)
Mpdex.stop(mpd)
```

Mpdex broadcasts status as a hash of values:

```elixir
  %{
    audio: [samplerate: "44100", bits: "24", channels: "2"],
    bitrate: "128",
    consume: "0",
    elapsed: "0.878",
    mixrampdb: "0.000000",
    nextsong: "1",
    nextsongid: "11",
    playlist: "20",
    playlistlength: "2",
    random: "0",
    repeat: "0",
    single: "0",
    song: "0",
    songid: "10",
    state: "play",
    time: "1:0",
    volume: "0"
  }

```