mpc-js
Version:
A javascript client library for the Music Player Daemon
216 lines (176 loc) • 6.49 kB
Markdown
# mpc.js
mpc.js is a javascript client library for the [Music Player Daemon](https://www.musicpd.org/).
It features a Promise-based API for all [mpd commands](https://www.musicpd.org/doc/protocol/command_reference.html),
type definitions for [Typescript](https://www.typescriptlang.org/) and works in both
[node.js](https://nodejs.org/) and current browsers (connecting to mpd through a WebSocket bridge
like [websockify](https://github.com/novnc/websockify)).
## Documentation
### Using in node.js
#### ESM
```
import { MPC } from 'mpc-js';
const mpc = new MPC();
await mpc.connectTCP('localhost', 6600);
...
```
#### CommonJS
```
const { MPC } = require('mpc-js');
const mpc = new MPC();
mpc.connectTCP('localhost', 6600).then(async () => {
...
});
```
### Using in the browser
To use mpc-js in the browser, you first need to set up a WebSocket bridge through which the browser can connect to mpd:
```
npx github:endpointservices/websockify-js 8000 localhost:6600
```
If you use a bundler, you can `import { MPC } from 'mpc-js'` just as in node.
Otherwise you can copy one of the bundles that can be used directly in the browser into your web folder:
#### ESM
Import [`dist/mpc.min.mjs`](https://unpkg.com/mpc-js@latest/dist/mpc.min.mjs) in your module:
```
<script type="module">
import { MPC } from './mpc.min.mjs';
const mpc = new MPC();
await mpc.connectWebSocket('ws://localhost:8000/');
...
</script>
```
#### UMD
Use [`dist/mpc.umd.min.js`](https://unpkg.com/mpc-js@latest/dist/mpc.umd.min.js), which defines the global variable `MPC`:
```
<script src="./mpc.umd.min.js"></script>
<script>
const mpc = new MPC();
mpc.connectWebSocket('ws://localhost:8000/').then(async () => {
...
});
</script>
```
### API
[Typedoc](https://typedoc.org/)-generated API documentation is available [here](https://hbenl.github.io/mpc-js/typedoc/classes/MPC.html).
### Events
The following events are emitted by the client:
* `ready` - The connection to mpd has been initialized
* `socket-error` - An error event from the underlying socket implementation, the error is passed
to the event listeners
* `socket-end` - The socket was closed by mpd
* `changed` - There was a change in one or more of mpd's subsystems, the list of changed subsystems
is passed to the event listeners. This list may contain:
* `database` - the song database has been modified after `update`
* `update` - a database update has started or finished; if the database was modified during the update, the `database` event is also emitted
* `stored_playlist` - a stored playlist has been modified, renamed, created or deleted
* `playlist` - the current playlist has been modified
* `player` - the player has been started, stopped or seeked
* `mixer` - the volume has been changed
* `output` - an audio output has been enabled or disabled
* `options` - options like `repeat`, `random`, `crossfade`, replay gain
* `sticker` - the sticker database has been modified
* `subscription`: a client has subscribed or unsubscribed to a channel
* `message`: a message was received on a channel this client is subscribed to; this event is only emitted when the queue is empty
* `changed-<subsystem>` - There was a change in `<subsystem>`
## Examples
Create a client and connect to mpd
```
const mpc = new MPC();
// connect via TCP (when running in node.js)
mpc.connectTCP('localhost', 6600);
// ... or a Unix socket (when running in node.js)
mpc.connectUnixSocket('/run/mpd/socket');
// ... or a WebSocket (when running in a browser)
mpc.connectWebSocket('ws://localhost:8000/');
```
The `connect` methods will return a Promise that is resolved when the connection to mpd has been established or rejected when the connection attempt fails.
### Controlling playback
```
mpc.playback.play();
mpc.playback.next();
mpc.playback.stop();
```
### Changing the current playlist
Clear the playlist and add a directory
```
mpc.currentPlaylist.clear();
mpc.currentPlaylist.add('ambient/Loscil/2010 - Endless Falls');
```
Search the playlist for songs whose title contains 'dub' and delete them
```
mpc.currentPlaylist.playlistSearch('Title', 'dub').then(
items => items.forEach(item => mpc.currentPlaylist.deleteId(item.id)));
```
### Observing state changes
```
mpc.on('changed-player', () => {
mpc.status.status().then(status => {
if (status.state == 'play') {
mpc.status.currentSong().then(song => console.log(`Playing '${song.title}'`));
} else {
console.log('Stopped playback');
}
});
});
mpc.playback.play();
Playing 'Lake Orchard'
mpc.playback.stop();
Stopped playback
```
### Exploring the mpd database
List the contents of a directory
```
mpc.database.listFiles('ambient/Loscil/2010 - Endless Falls').then(console.log);
[ File {
entryType: 'file',
path: '01. Endless Falls.mp3',
lastModified: 2014-07-03T18:28:07.000Z,
size: 19280819 },
File {
entryType: 'file',
path: '02. Estuarine.mp3',
lastModified: 2014-07-03T18:29:15.000Z,
size: 20292272 },
(...)
]
```
List metadata for the contents of a directory
```
mpc.database.listInfo('ambient/Loscil/2010 - Endless Falls').then(console.log);
[ Song {
entryType: 'song',
path: 'ambient/Loscil/2010 - Endless Falls/01. Endless Falls.mp3',
lastModified: 2014-07-03T18:28:07.000Z,
title: 'Endless Falls',
name: undefined,
artist: 'Loscil',
artistSort: undefined,
composer: undefined,
performer: undefined,
album: 'Endless Falls',
albumSort: undefined,
albumArtist: 'Loscil',
albumArtistSort: undefined,
track: '01/08',
disc: undefined,
date: '2010',
genre: 'Experimental, Ambient',
comment: undefined,
musicBrainzArtistId: undefined,
musicBrainzAlbumId: undefined,
musicBrainzAlbumArtistId: undefined,
musicBrainzTrackId: undefined,
musicBrainzReleaseTrackId: undefined,
duration: 475 },
(...)
]
```
List song titles from Loscil in 2006, grouped by album
```
mpc.database.list('Title', [['Artist', 'Loscil'], ['Date', '2006']], ['Album']).then(console.log);
Map {
[ 'Stases' ] => [ 'B15-A', 'Biced', 'Cotom', 'Faint Liquid', 'Micro Hydro', 'Nautical2',
'Resurgence', 'Sous-marin', 'Still Upon The Ocean Floor', 'Stratus', 'Subaquatic', 'Windless' ],
[ 'Plume' ] => [ 'Bellows', 'Charlie', 'Chinook', 'Halcyon',
'Mistral', 'Motoc', 'Rorschach', 'Steam', 'Zephyr' ],
[ 'Idol Tryouts Two: Ghostly International Vol. Two' ] => [ 'Umbra' ] }
```