Giter Site home page Giter Site logo

groovebasin's Introduction

Groove Basin

Music player server with a web-based user interface.

Run it on a server connected to some speakers in your home or office. Guests can control the music player by connecting with a laptop, tablet, or smart phone. Further, you can stream your music library remotely.

Groove Basin works with your personal music library; not an external music service. Groove Basin will never support DRM content.

Feature Highlights

  • The web client feels like a desktop app, not a web app. It predicts what the server will do in order to hide network lag from the user.

  • Auto DJ which automatically queues random songs, favoring songs that have not been queued recently.

  • Drag and drop upload. Drag and drop playlist editing. Keyboard shortcuts for everything.

  • Lazy multi-core EBU R128 loudness scanning (tags compatible with ReplayGain) and automatic switching between track and album mode. "Loudness Zen"

  • Streaming support. You can listen to your music library - or share it with your friends - even when you are not physically near your home speakers.

  • Groove Basin protocol. Write your own client using the protocol specification, or check out gbremote, a simple command-line remote control.

  • MPD protocol support. This means you already have a selection of clients which integrate with Groove Basin. For example MPDroid.

  • Last.fm scrobbling.

  • File system monitoring. Add songs anywhere inside your music directory and they instantly appear in your library.

Installation on Ubuntu

For Ubuntu 17.04 Zesty:

  1. sudo apt-get install nodejs libgrooveloudness-dev libgroovefingerprinter-dev libgrooveplayer-dev libgroove-dev
  2. Clone this repo and cd to it.
  3. npm run build
  4. npm start

For Ubuntu 18.04 Bionic:

Configuration

When Groove Basin starts it will look for config.json in the current directory. If not found it creates one for you with default values.

Use this to set your music library location and other settings.

It is recommended that you generate a self-signed certificate and use that instead of using the public one bundled with this source code.

Screenshots

Search + drag/drop support Multi-select and context menu Keyboard shortcuts Settings Import Events

Developing

$ npm run dev

This will install dependencies, build generated files, and then start the sever. It is up to you to restart it when you modify assets or server files.

Community

Pull requests, feature requests, and bug reports are welcome! Live discussion in #libgroove on Freenode.

Articles

Roadmap

  1. Music library organization
  2. Accoustid Integration
  3. Finalize GrooveBasin protocol spec

groovebasin's People

Contributors

andrewrk avatar calebmorris avatar davidbanham avatar db48x avatar dwrensha avatar fsateler avatar gitter-badger avatar irskep avatar jeffrom avatar jepler avatar jprjr avatar michaelkoye avatar moshev avatar rbuch avatar seansaleh avatar shadowcat7 avatar sobeston avatar thejoshwolfe avatar toofar avatar yoasif avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

groovebasin's Issues

auto replaygain scanning

  • when a song is added to the library, automatically replaygain scan it
    and the album from whence it came. Do this for update as well.

Next and Previous while stopped causes chaos

First of all, while paused, if you Next or Previous, the specified track begins to actually play. It unpauses.

But while stopped, groovebasin assumes the same thing will happen, but in fact, mpd completely ignores the Next/Previous command, and stays stopped on the old track.

The symptoms are groovebasin showing the wrong track in nowplaying, and the slider bar moving when it's not really playing. No status update ever comes from mpd to correct groovebasin. Only the 1 client that tried to do this will see these symptoms.

We either need to sync our behavior to what's really going on (like by disabling the Next/Previous buttons while stopped), or accomplish what should be going on by giving mpd the right commands.

"You have no connection to mpd" is usually misleading

I can see that you get this warning in these cases (in order of most common to least common):

  1. Loading the page slowly (or loading a very large library). The message should say "loading...".
  2. When someone kills the groovebasin server. The message should say "Connection has been lost".
  3. When you're connected to groovebasin but mpd is not running. Then the current message makes sense.

Node.js server stops communicating with MPD after a period of idle time

output from telnet into mpd and running 'status'

$ telnet localhost 6600
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
OK MPD 0.15.0
status
volume: -1
repeat: 0
random: 0
single: 0
consume: 0
playlist: 2
playlistlength: 2
xfade: 0
state: stop
OK

error - unknown command subscribe

An issue on Fedora 16 with node v0.6.12

In the browser I get an alert with:

[5@0] {} unknown command "subscribe"

From the node server I get:

> [email protected] start /home/seth/code/groovebasin/node_modules/groovebasin
> node server.js

The "sys" module is now called "util". It should have a similar interface.
   info  - socket.io started
   info  - Serving at http://localhost:16242/
   warn  - httpd streaming not enabled in mpd conf
   warn  - sticker_file not set in mpd conf
   warn  - recommended to turn auto_update on in mpd conf
   warn  - recommended to turn gapless_mp3_playback on in mpd conf
   warn  - recommended to turn volume_normalization on in mpd conf
   warn  - recommended to set max_command_list_size to >= 16384 in mpd conf
   error -  [5@0] {} unknown command "subscribe"
   error -  [5@0] {sticker} sticker database is disabled
   info  - handshake authorized 5563762851790529285

Let me know what additional information I should be providing.

harmless lastfm error?

error - error from last.fm auth.getSession: Invalid authentication token supplied.

but everything seems to be working fine.

crash with unicode error

events.js:48
throw arguments[1]; // Unhandled 'error' event
^
Error: ENOENT, open './public/library/RebeccaDornburgMix/027 Azam Ali/001 Portals Of Grace/002 Sackpipsl�t (Instrumental, Sweden).mp3'

library management: "suggested library fixes"

Groove Basin should show a user interface with a list of "suggested fixes" to the user's library. The user could accept or reject these fixes. They would be things like this:

  • duplicate detection and elimination
    • if a song is byte for byte the same (check md5's) then ignore the new song
    • use heuristics to guess if songs are probably the same (using tags). if
      we are reasonably confident that the songs are the same, delete the one
      with the lower quality.
    • if we're not confident enough, there will be an
      api that lists possible duplicates and actions to resolve them.
  • update the duration metadata field with the exact correct duration
  • moving songs to their canonical file path as specified by the user
  • list files that cannot be played and offer to move or delete them. This includes DRM-protected files!
  • delete empty folders in music library
  • submit musicbrainz information for their tracks and feel good about it
  • replace their own tags with musicbrainz information when possible
  • write new song tags to disk
    • wrap audio streams in a container format in order to be able to write tags

track slider is too hard to see

i have to tilt my laptop screen at odd angles to see where the track slider is along the bar. The color doesn't stand out well enough.

playlist support

  • keyboard shortcuts
    • selecting the playlist pane
    • navigating the tree (ctrl, shift, alt, up, down, left, right)
    • adding selected songs to a playlist
    • re-ordering playlist items (alt+up/down)
  • shuffle playlist
  • client side prediction for removing items
  • remove from playlist menu does not remove the menu
  • protocol: ability to remove from multiple playlists at once
  • fix: adding to playlist adding in seemingly random order
  • uploaded songs added to incoming playlist
  • fix: selecting multiple tracks with shift broken
  • scrollbar when playlist is longer than pane size
  • figure out how permissions are going to work
    • per-playlist?
    • different permission name?
  • deleting from library should delete from playlist
  • do not collapse playlists when there are updates
  • down/up arrow key when the selection goes off the window scrolls
  • ability to rename playlists

SyntaxError: In src/server/server.coffee, reserved word "static" on line 5

Hi, trying to install groovebasin on Puppy Linux, I built node and npm from scratch on the system. Getting the error in the issue title when I try to install. I'm not sure if this is a legitimate bug or if I'm missing some key dependency.

Complete install log:

npm http GET https://registry.npmjs.org/groovebasin
npm http 304 https://registry.npmjs.org/groovebasin
npm http GET https://registry.npmjs.org/node-static
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/socket.io
npm http GET https://registry.npmjs.org/handlebars
npm http GET https://registry.npmjs.org/lastfm
npm http GET https://registry.npmjs.org/formidable
npm http GET https://registry.npmjs.org/mkdirp
npm http GET https://registry.npmjs.org/node.extend
npm http GET https://registry.npmjs.org/stylus
npm http 304 https://registry.npmjs.org/lastfm
npm http 304 https://registry.npmjs.org/node-static
npm http 304 https://registry.npmjs.org/coffee-script
npm http 304 https://registry.npmjs.org/socket.io
npm http 304 https://registry.npmjs.org/handlebars
npm http 304 https://registry.npmjs.org/formidable
npm http 304 https://registry.npmjs.org/mkdirp
npm http 304 https://registry.npmjs.org/node.extend
npm http 304 https://registry.npmjs.org/stylus
npm http GET https://registry.npmjs.org/uglify-js
npm http GET https://registry.npmjs.org/optimist
npm http GET https://registry.npmjs.org/underscore
npm http GET https://registry.npmjs.org/policyfile/0.0.4
npm http GET https://registry.npmjs.org/redis/0.6.7
npm http GET https://registry.npmjs.org/socket.io-client/0.9.6
npm http GET https://registry.npmjs.org/cssom
npm http GET https://registry.npmjs.org/debug
npm http 304 https://registry.npmjs.org/redis/0.6.7
npm http 304 https://registry.npmjs.org/policyfile/0.0.4
npm http 304 https://registry.npmjs.org/underscore
npm http 304 https://registry.npmjs.org/socket.io-client/0.9.6
npm http 304 https://registry.npmjs.org/debug
npm http 304 https://registry.npmjs.org/cssom
npm http GET https://registry.npmjs.org/uglify-js/1.2.5
npm http GET https://registry.npmjs.org/ws
npm http GET https://registry.npmjs.org/xmlhttprequest/1.2.2
npm http GET https://registry.npmjs.org/active-x-obfuscator/0.0.1
npm http 304 https://registry.npmjs.org/ws
npm http 304 https://registry.npmjs.org/uglify-js/1.2.5
npm http 304 https://registry.npmjs.org/active-x-obfuscator/0.0.1
npm http 304 https://registry.npmjs.org/uglify-js
npm http 304 https://registry.npmjs.org/xmlhttprequest/1.2.2
npm http GET https://registry.npmjs.org/zeparser/0.0.5

> [email protected] preinstall /root/node_modules/groovebasin/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws
> make

node-waf configure build
Checking for program g++ or c++          : /usr/bin/g++ 
Checking for program cpp                 : /usr/bin/cpp 
Checking for program ar                  : /usr/bin/ar 
Checking for program ranlib              : /usr/bin/ranlib 
Checking for g++                         : ok  
Checking for node path                   : ok /usr/bin/node 
Checking for node prefix                 : ok /usr 
'configure' finished successfully (0.031s)
Waf: Entering directory `/root/node_modules/groovebasin/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build'
[1/4] cxx: src/validation.cc -> build/Release/src/validation_1.o
[2/4] cxx: src/bufferutil.cc -> build/Release/src/bufferutil_2.o
[3/4] cxx_link: build/Release/src/validation_1.o -> build/Release/validation.node
[4/4] cxx_link: build/Release/src/bufferutil_2.o -> build/Release/bufferutil.node
Waf: Leaving directory `/root/node_modules/groovebasin/node_modules/socket.io/node_modules/socket.io-client/node_modules/ws/build'
'build' finished successfully (0.566s)
npm http GET https://registry.npmjs.org/commander
npm http GET https://registry.npmjs.org/options
npm http 304 https://registry.npmjs.org/zeparser/0.0.5
npm http 304 https://registry.npmjs.org/options
npm http 304 https://registry.npmjs.org/commander
npm http 304 https://registry.npmjs.org/optimist
npm http GET https://registry.npmjs.org/wordwrap
npm http 304 https://registry.npmjs.org/wordwrap

> [email protected] install /root/node_modules/groovebasin
> make

mkdir -p lib
node_modules/coffee-script/bin/coffee -p -c src/shared/mpd.coffee >lib/mpd.js.tmp
mv lib/mpd.js{.tmp,}
node_modules/coffee-script/bin/coffee -p -c src/server/mpdconf.coffee >lib/mpdconf.js.tmp
mv lib/mpdconf.js{.tmp,}
node_modules/coffee-script/bin/coffee -p -c src/server/plugin.coffee >lib/plugin.js.tmp
mv lib/plugin.js{.tmp,}
mkdir -p lib/plugins
node_modules/coffee-script/bin/coffee -p -c src/server/plugins/chat.coffee >lib/plugins/chat.js.tmp
mv lib/plugins/chat.js{.tmp,}
node_modules/coffee-script/bin/coffee -p -c src/server/plugins/download.coffee >lib/plugins/download.js.tmp
mv lib/plugins/download.js{.tmp,}
node_modules/coffee-script/bin/coffee -p -c src/server/plugins/dynamicmode.coffee >lib/plugins/dynamicmode.js.tmp
mv lib/plugins/dynamicmode.js{.tmp,}
node_modules/coffee-script/bin/coffee -p -c src/server/plugins/lastfm.coffee >lib/plugins/lastfm.js.tmp
mv lib/plugins/lastfm.js{.tmp,}
node_modules/coffee-script/bin/coffee -p -c src/server/plugins/stream.coffee >lib/plugins/stream.js.tmp
mv lib/plugins/stream.js{.tmp,}
node_modules/coffee-script/bin/coffee -p -c src/server/plugins/upload.coffee >lib/plugins/upload.js.tmp
mv lib/plugins/upload.js{.tmp,}
node_modules/coffee-script/bin/coffee -p -c src/server/server.coffee >server.js.tmp
SyntaxError: In src/server/server.coffee, reserved word "static" on line 5
    at SyntaxError (unknown source)
    at Lexer.error (/root/node_modules/groovebasin/node_modules/coffee-script/lib/coffee-script/lexer.js:686:13)
    at Lexer.identifierToken (/root/node_modules/groovebasin/node_modules/coffee-script/lib/coffee-script/lexer.js:88:16)
    at Lexer.tokenize (/root/node_modules/groovebasin/node_modules/coffee-script/lib/coffee-script/lexer.js:35:19)
    at Object.compile (/root/node_modules/groovebasin/node_modules/coffee-script/lib/coffee-script/coffee-script.js:43:32)
    at /root/node_modules/groovebasin/node_modules/coffee-script/lib/coffee-script/command.js:182:33
    at /root/node_modules/groovebasin/node_modules/coffee-script/lib/coffee-script/command.js:152:18
    at [object Object].<anonymous> (fs.js:123:5)
    at [object Object].emit (events.js:64:17)
    at Object.oncomplete (fs.js:1181:12)
make: *** [server.js] Error 1

npm ERR! [email protected] install: `make`
npm ERR! `sh "-c" "make"` failed with 2
npm ERR! 
npm ERR! Failed at the [email protected] install script.
npm ERR! This is most likely a problem with the groovebasin package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     make
npm ERR! You can get their info via:
npm ERR!     npm owner ls groovebasin
npm ERR! There is likely additional logging output above.
npm ERR! 
npm ERR! System Linux 2.6.39
npm ERR! command "node" "/usr/bin/npm" "install" "groovebasin"
npm ERR! cwd /root
npm ERR! node -v v0.6.15
npm ERR! npm -v 1.1.18
npm ERR! code ELIFECYCLE
npm ERR! message [email protected] install: `make`
npm ERR! message `sh "-c" "make"` failed with 2
npm ERR! errno {}
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /root/npm-debug.log
npm not ok

update to work with node 0.8.0

some minor changes in api need to be updated, but notably, node-static is no longer being maintained. we'll want to swap that out for a static file server which is compatible with recent versions of node.

/coffee: No such file or directory

Ok I've been trying to get this installed for 3 days now, I don't know if I'm using the correct version of node and npm or if I'm missing some modules. I've searched high and low but I cannot find the answers. I'm trying to get this installed on ubuntu 12.04 beta2, maybe thats the problem?

Here's the error I'm getting, any guidance is greatly appreciated

[email protected] install /home/devin/node_modules/groovebasin
make

mkdir -p lib
node_modules/coffee-script/bin/coffee -p -c src/shared/mpd.coffee >lib/mpd.js.tmp
bash: node_modules/coffee-script/bin/coffee: No such file or directory
make: *** [lib/mpd.js] Error 127

npm ERR! [email protected] install: make
npm ERR! sh "-c" "make" failed with 2
npm ERR!
npm ERR! Failed at the [email protected] install script.
npm ERR! This is most likely a problem with the groovebasin package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! make
npm ERR! You can get their info via:
npm ERR! npm owner ls groovebasin
npm ERR! There is likely additional logging output above.
npm ERR!
npm ERR! System Linux 3.2.0-23-generic-pae
npm ERR! command "node" "/usr/bin/npm" "install" "groovebasin"
npm ERR! cwd /home/devin
npm ERR! node -v v0.6.15
npm ERR! npm -v 1.1.16
npm ERR! code ELIFECYCLE
npm ERR! message [email protected] install: make
npm ERR! message sh "-c" "make" failed with 2
npm ERR! errno {}
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /home/devin/npm-debug.log
npm not ok

online user interaction

Events:

  • - user joins / user leaves
  • - user starts streaming / user stops streaming
  • - chat
  • - when the next song starts playing
  • - user presses pause, play, or seek
  • - user adds songs in the play queue
  • - user re-orders song in play queue
  • - chatted urls get surrounded with anchor tags with target=_blank -> #328
  • - user uploads or imports song
  • - user deletes songs from play queue
  • - show chat(2) when users chat and you haven't seen them yet
  • - 't' to switch to events tab and focus chat box
  • - when users join the events height is wrong
  • - scroll down on page load and when clicking around tabs
  • - MPD commands should make events too -> #329
  • - title bar should show the (2) notification thing too

server crash regarding queuing

commit 2cf72dd

.
.
.
   error -  [50@0] {deleteid} No such song
   error -  [50@0] {deleteid} No such song

/home/andy/dev/groovebasin/server.js:263
 _results.push(my_mpd.library.track_table[current_file].last_queued = new Date
                                                                    ^
TypeError: Cannot set property 'last_queued' of undefined
    at Object.cb (/home/andy/dev/groovebasin/server.js:263:78)
    at DirectMpd.<anonymous> (/home/andy/dev/groovebasin/lib/mpd.js:181:39)
    at DirectMpd.handleMessage (/home/andy/dev/groovebasin/lib/mpd.js:4:61)
    at DirectMpd.<anonymous> (/home/andy/dev/groovebasin/lib/mpd.js:206:16)
    at DirectMpd.receive (/home/andy/dev/groovebasin/lib/mpd.js:4:61)
    at Socket.<anonymous> (/home/andy/dev/groovebasin/server.js:365:22)
    at Socket.emit (events.js:67:17)
    at TCP.onread (net.js:347:14)

Ability to download multiple files as a zip

It looks like we can use one of these to create a zip file:
https://github.com/janjongboom/node-native-zip
https://github.com/Sage/streamline-zip
We shouldn't need any compression, since practically every music format is already compressed.

Ideally, we can stream files from the filesystem through a zip format in memory and pipe the result back to the client without ever placing a zip file on the filesystem. I'm not sure how predicting the total size will work yet.

It would be cool to respond to directory urls with a zip of the music files in the directory (probably not other files in the directory, such as album art). It would also be cool to support multi-select downloading, although we'd probably need to invent some api for that beyond a single url path.

You have no connection to mpd & [5@0] {} unknown command "subscribe"

I'm trying to run groovebasin on a OS X 10.7.3 Lion but it shows the alert [5@0] {} unknown command "subscribe on load.

After load, groovebasin show the music list and right after I select a music and hit play, it shows the message You have no connection to mpd everytime it send command to mpd. The music start playing, but the message is displayed anyway. If I reload, the music is playing and I can stop, but still see the message.

Do I need any other mpd configuration ?

Streaming music stops intermittently

When a track ends, the music stops: the new track information is showed and the slider moves but I have to press the stream button twice to hear something
After that, it starts playing where the slider is

This happened to me and to friends using firefox 15, 14 and 10

Problem setting volume

My volume slider is standard at 0. When I try to increase the volume, I get the following error in the browser:

[52@0] {setvol} problems setting volume

groovebasin's log looks clean, no errors there. I compiled mpd from source, and run Arch Linux w/ nodejs 0.6.12. Please let me know if you need anything else.

dynamicmode doesn't escape mpd commands properly

Calling "sendCommands" from outside the mpd class is a code smell.

    @mpd.sendCommands ("sticker set song \"#{file}\" \"#{LAST_QUEUED_STICKER}\" #{JSON.stringify new Date()}" for file in new_files)

file needs to be escaped here. but what really should happen is that mpd should have a "setSticker" method and it should handle the escaping for you.

Selection causes items to change size

A simple demonstration is to click on a playlist item and shift+click another playlist item 20 or so items lower down. Something about the style of selected items causes them to be 2 pixels taller than unselected items (21px vs 19px), causing a selection like the one described above to move the second selected item out from under the cursor.

Another issue is that the bold text style on selected items in the library window can cause items to occupy a different number of rows due to wordwrap. More generally, the bold text style causes text to move around when being selected and unselected, which I think is ugly behavior.

uploading UI issues

  • make the list of uploaded files go away after they're all done.
  • make the ui consistent with the rest of the app

Get Started section doesn't work

$ git clone https://github.com/superjoe30/groovebasin.git groovebasin2
Cloning into groovebasin2...
remote: Counting objects: 2243, done.
remote: Compressing objects: 100% (831/831), done.
remote: Total 2243 (delta 1425), reused 2206 (delta 1388)
Receiving objects: 100% (2243/2243), 858.65 KiB | 577 KiB/s, done.
Resolving deltas: 100% (1425/1425), done.
$ cd groovebasin2/
$ npm install groovebasin

$ npm start groovebasin

npm ERR! Error: ENOENT, no such file or directory '/home/josh/dev/groovebasin2/node_modules/groovebasin/package.json'
npm ERR! You may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <[email protected]>
npm ERR! 
npm ERR! System Linux 3.0.0-21-generic
npm ERR! command "node" "/usr/local/bin/npm" "start" "groovebasin"
npm ERR! cwd /home/josh/dev/groovebasin2
npm ERR! node -v v0.6.8
npm ERR! npm -v 1.1.0-2
npm ERR! path /home/josh/dev/groovebasin2/node_modules/groovebasin/package.json
npm ERR! code ENOENT
npm ERR! message ENOENT, no such file or directory '/home/josh/dev/groovebasin2/node_modules/groovebasin/package.json'
npm ERR! errno {}
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/josh/dev/groovebasin2/npm-debug.log
npm not ok

Furthermore, Get Started doesn't mention mpd at all.

mpd class doesn't do errors and callbacks correctly

  1. In the mpd protocol, an error message is associated with a command. In our mpd class, errors are emitted as separate events. Callbacks for commands should have the error that came back, if any.
  2. The convention for callbacks is callback(error, result1, ..., resultN), where error can be null. We should follow this convention.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.