mpd-api
mpd-api copied to clipboard
Node mpd client API
node mpd client api
Api implementation for Music Player Daemon (GIT) protocol.
Wraps the MPD client from mpd2 module with api methods exposed as client.api.x
Usage
npm i / yarn add mpd-api
const mpdapi = require('mpd-api')
// config is passed to net.connect()
const config = {
host: 'localhost',
port: 6600,
// if connecting to a local socket rather than
// host and port; trailing `~` is replaced by
// `os.homedir()`
// path: '~/.config/mpd/socket'
// if MPD requires a password, pass
// it within the config as well:
//password: 'password'
}
const client = await mpdapi.connect(config)
const songs = await client.api.db.search('(artist contains "Empire")')
// [{
// file: 'mpd/music/path//Sleep Wont Sleep - The Cat Empire (2013).m4a',
// last_modified: '2019-04-05T14:59:00Z',
// format: '44100:f:2',
// time: 284,
// duration: 284.375,
// artist: 'The Cat Empire',
// album: 'Steal the Light',
// title: "Sleep Won't Sleep",
// track: 10,
// date: '2013-05-17',
// disc: 1,
// label: 'EMI',
// albumartist: 'The Cat Empire',
// musicbrainz_artistid: 'a530492f-8806-4bd7-9c14-80c237eb92fe',
// musicbrainz_albumid: 'aa62c3b7-2576-4375-9301-ed8824966752',
// musicbrainz_albumartistid: 'a530492f-8806-4bd7-9c14-80c237eb92fe',
// musicbrainz_trackid: 'b0261a37-8a91-4581-8eab-4c5069d057ea',
// musicbrainz_releasetrackid: '56f73f38-c224-4827-a7a2-4552990c5da9'
// }, {
// file: ...
// }, ...]
const status = await client.api.status.get()
// { volume: 63,
// repeat: false,
// random: false,
// single: false,
// consume: false,
// playlist: 312,
// playlistlength: 12,
// mixrampdb: 0,
// state: 'play',
// song: 7,
// songid: 116,
// time: { elapsed: 10562, total: 0 },
// elapsed: 10561.648,
// bitrate: '96',
// audio:
// { sampleRate: 44100,
// bits: 24,
// channels: 2,
// sample_rate_short: { value: 44.1, unit: 'kHz' } },
// nextsong: 8,
// nextsongid: 117 }
All methods return already parsed results.
Reference to mpd2 module is exposed as well, if needed:
const { mpd } = mpdapi
const { cmd, MPDError } = mpd
try {
client = await mpdapi.connect()
} catch (e) {
if (e.errno === MPDError.CODES.PERMISSION) {
console.log('no permission to connect, probably invalid/missing password')
}
}
// or disable parsing of values
mpd.autoparseValues(false)
// and do not convert object keys to snake_case
mpd.normalizeKeys(false)
typescript
// typings included
import api, { MPDApi } from 'mpd-api'
type Status = {
volume: number
repeat: boolean
playlist: number
state: 'play' | 'stop' | 'pause'
// ...
}
type ListAllInfo = {
directory: string
last_modified: string
file?: File[]
}
type File = {
file: string
last_modified: string
format: string
time: number
artist: string
title: string
// ...
}
const client: MPDApi.ClientAPI = await api.connect()
const status = await client.api.status.get<Status>()
console.log('state:', status.state)
const lsAll = await client.api.db.listallinfo<ListAllInfo>()
console.log('first directory: %s, files: %o', lsAll[0].directory, lsAll[0].file)
// reference to mpd2 module:
api.mpd.normalizeKeys(false)
API
Client to client communication MPD documentation
async c2c.list(...args) --> channels ...args
async c2c.subscribe(...args) --> subscribe ...args
method ignores EXIST, expect undefined in this case
async c2c.unsubscribe(...args) --> unsubscribe ...args
method ignores NO_EXIST, expect undefined in this case
async c2c.sendMessage(...args) --> sendmessage ...args
async c2c.readMessages(...args) --> readmessages ...args
Connection settings MPD documentation
async connection.close(...args) --> close ...args
async connection.kill(...args) --> kill ...args
async connection.ping(...args) --> ping ...args
async connection.getTagTypes(...args) --> tagtypes ...args
async connection.enableTagTypes(...args) --> tagtypes enable, ...args
method binds arguments which can not be changed
async connection.disableTagTypes(...args) --> tagtypes disable, ...args
method binds arguments which can not be changed
async connection.clearTagTypes(...args) --> tagtypes clear, ...args
method binds arguments which can not be changed
async connection.enableAllTagTypes(...args) --> tagtypes all, ...args
method binds arguments which can not be changed
async connection.binarylimit(...args) --> binarylimit ...args
The music database MPD documentation
async db.listall(...args) --> listall ...args
async db.listallinfo(...args) --> listallinfo ...args
async db.list(...args) --> list ...args
method reorderes or augments passed arguments, see dbList
async db.count(...args) --> count ...args
async db.find(...args) --> find ...args
async db.findadd(...args) --> findadd ...args
async db.search(...args) --> search ...args
async db.searchadd(...args) --> searchadd ...args
async db.searchaddpl(...args) --> searchaddpl ...args
async db.lsinfo(...args) --> lsinfo ...args
async db.songinfo(...args) --> lsinfo ...args
async db.listfiles(...args) --> listfiles ...args
async db.readcomments(...args) --> readcomments ...args
async db.rescan(...args) --> rescan ...args
async db.update(...args) --> update ...args
async db.getfingerprint(...args) --> getfingerprint ...args
async db.albumart(...args) --> albumart
method ignores NO_EXIST, expect undefined in this case
async db.albumartWhole(...args) --> albumartWhole
method ignores NO_EXIST, expect undefined in this case
async db.readpicture(...args) --> readpicture
method ignores NO_EXIST, expect undefined in this case
async db.readpictureWhole(...args) --> readpictureWhole
method ignores NO_EXIST, expect undefined in this case
Mounts and neighbors MPD documentation
async mounts.list(...args) --> listmounts ...args
async mounts.listNeighbors(...args) --> listneighbors ...args
async mounts.mount(...args) --> mount ...args
async mounts.unmount(...args) --> unmount ...args
Audio output devices MPD documentation
async outputs.list(...args) --> outputs ...args
async outputs.enable(...args) --> enableoutput ...args
async outputs.disable(...args) --> disableoutput ...args
async outputs.toggle(...args) --> toggleoutput ...args
async outputs.set(...args) --> outputset ...args
Partition commands MPD documentation
async partition.list(...args) --> listpartitions ...args
async partition.create(...args) --> newpartition ...args
method ignores EXIST, expect undefined in this case
async partition.switchTo(...args) --> partition ...args
async partition.delete(...args) --> delpartition ...args
method ignores NO_EXIST, expect undefined in this case
async partition.moveOutputToCurrentPartition(...args) --> moveoutput ...args
method ignores NO_EXIST, expect undefined in this case
Playback options and controls MPD documentation
async playback.next(...args) --> next ...args
async playback.prev(...args) --> previous ...args
async playback.pause(...args) --> pause 1, ...args
method binds arguments which can not be changed
async playback.resume(...args) --> pause 0, ...args
method binds arguments which can not be changed
async playback.toggle(...args) --> pause ...args
async playback.play(...args) --> play ...args
async playback.playid(...args) --> playid ...args
async playback.stop(...args) --> stop ...args
async playback.seekcur(...args) --> seekcur ...args
async playback.seek(...args) --> seek ...args
async playback.seekid(...args) --> seekid ...args
async playback.getvol(...args) --> getvol ...args
async playback.consume(...args) --> consume ...args
method reorderes or augments passed arguments, see boolAt
async playback.crossfade(...args) --> crossfade ...args
async playback.mixrampdb(...args) --> mixrampdb ...args
async playback.mixrampdelay(...args) --> mixrampdelay ...args
method reorderes or augments passed arguments, see mixrampdelay
async playback.random(...args) --> random ...args
method reorderes or augments passed arguments, see boolAt
async playback.repeat(...args) --> repeat ...args
method reorderes or augments passed arguments, see boolAt
async playback.single(...args) --> single ...args
method reorderes or augments passed arguments, see single
async playback.setvol(...args) --> setvol ...args
async playback.setReplayGain(...args) --> replay_gain_mode ...args
method reorderes or augments passed arguments, see replaygain
async playback.getReplayGain(...args) --> replay_gain_status ...args
Stored playlists MPD documentation
async playlists.get(...args) --> listplaylists ...args
async playlists.list(...args) --> listplaylist ...args
async playlists.listinfo(...args) --> listplaylistinfo ...args
async playlists.load(...args) --> load ...args
async playlists.add(...args) --> playlistadd ...args
async playlists.clear(...args) --> playlistclear ...args
async playlists.deleteAt(...args) --> playlistdelete ...args
async playlists.move(...args) --> playlistmove ...args
async playlists.rename(...args) --> rename ...args
async playlists.remove(...args) --> rm ...args
async playlists.save(...args) --> save ...args
The Queue MPD documentation
async queue.add(...args) --> add ...args
async queue.addid(...args) --> addid ...args
async queue.clear(...args) --> clear ...args
async queue.info(...args) --> playlistinfo ...args
async queue.id(...args) --> playlistid ...args
async queue.delete(...args) --> delete ...args
async queue.deleteid(...args) --> deleteid ...args
async queue.move(...args) --> move ...args
async queue.moveid(...args) --> moveid ...args
async queue.find(...args) --> playlistfind ...args
async queue.search(...args) --> playlistsearch ...args
async queue.prio(...args) --> prio ...args
async queue.prioid(...args) --> prioid ...args
async queue.shuffle(...args) --> shuffle ...args
async queue.swap(...args) --> swap ...args
async queue.swapid(...args) --> swapid ...args
async queue.addtagid(...args) --> addtagid ...args
async queue.cleartagid(...args) --> cleartagid ...args
async queue.getChanges(...args) --> plchanges ...args
async queue.getChangesPosId(...args) --> plchangesposid ...args
async queue.rangeid(...args) --> rangeid ...args
Reflection MPD documentation
async reflection.config(...args) --> config ...args
async reflection.commands(...args) --> commands ...args
async reflection.notcommands(...args) --> notcommands ...args
async reflection.urlhandlers(...args) --> urlhandlers ...args
async reflection.decoders(...args) --> decoders ...args
Querying MPD’s status MPD documentation
async status.get(...args) --> status ...args
async status.clearerror(...args) --> clearerror ...args
async status.currentsong(...args) --> currentsong ...args
async status.stats(...args) --> stats ...args
Stickers MPD documentation
async sticker.list(...args) --> sticker list, song, ...args
method binds arguments which can not be changed
async sticker.set(...args) --> sticker set, song, ...args
method binds arguments which can not be changed
method reorderes or augments passed arguments, see stickerSet
async sticker.get(...args) --> sticker get, song, ...args
method binds arguments which can not be changed
method ignores NO_EXIST, expect undefined in this case
async sticker.delete(...args) --> sticker delete, song, ...args
method binds arguments which can not be changed
method reorderes or augments passed arguments, see stickerDel
method ignores NO_EXIST, expect undefined in this case
async sticker.deleteAll(...args) --> sticker delete, song, ...args
method binds arguments which can not be changed
method ignores NO_EXIST, expect undefined in this case
async sticker.find(...args) --> sticker find, song, ...args
method binds arguments which can not be changed
method reorderes or augments passed arguments, see stickerFind
async sticker.search(...args) --> sticker find, song, ...args
method binds arguments which can not be changed
method reorderes or augments passed arguments, see stickerSearch