mpc.js is a javascript client library for the Music Player Daemon.
It features a Promise-based API for all mpd commands, type definitions for Typescript and works in both node.js and current browsers (connecting to mpd through a WebSocket bridge like websockify).
import { MPC } from 'mpc-js';
const mpc = new MPC();
await mpc.connectTCP('localhost', 6600);
...
const { MPC } = require('mpc-js');
const mpc = new MPC();
mpc.connectTCP('localhost', 6600).then(async () => {
...
});
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:
Import dist/browser/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>
Use dist/browser/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>
Typedoc-generated API documentation is available here.
The following events are emitted by the client:
ready
- The connection to mpd has been initializedsocket-error
- An error event from the underlying socket implementation, the error is passed to the event listenerssocket-end
- The socket was closed by mpdchanged
- 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 afterupdate
update
- a database update has started or finished; if the database was modified during the update, thedatabase
event is also emittedstored_playlist
- a stored playlist has been modified, renamed, created or deletedplaylist
- the current playlist has been modifiedplayer
- the player has been started, stopped or seekedmixer
- the volume has been changedoutput
- an audio output has been enabled or disabledoptions
- options likerepeat
,random
,crossfade
, replay gainsticker
- the sticker database has been modifiedsubscription
: a client has subscribed or unsubscribed to a channelmessage
: 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>
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.
mpc.playback.play();
mpc.playback.next();
mpc.playback.stop();
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)));
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
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' ] }