subsonicjs v0.6.0
subsonicjs
NOTE: Alpha release; Will have basic functionality working soon.
An abstraction of the subsonic API as a node package. This package attempts to line up API methods and their parameters as close to 1:1 with the original documentation Official Subsonic API Docs.
Changelog
Changelog is available here: Changelog
Installation
npm install --save subsonicjs
Usage
The package needs to be configured with your subsonic username, a password token, and the salt used to generate the password token. To create a password token perform an md5 encryption of the password and salt. (e.g. salt = 'secret'; token = md5('password'+'secret');)
var subsonic = require("subsonicjs")(username, token, salt, url);
var pingServer = await subsonic.system.ping();Initialize with config object
The package can also be configured with several options. The only required option is host all other options are optional.
var subsonic = require("subsonicjs")(username, token, salt, {
protocol: 'http',
host: 'www.subsonic.org',
port: 80,
timeout: 30,
client: 'subsonicjs',
version: '1.16.1'
});| Option | Default | Description |
|---|---|---|
protocol | http | Protocol to connect to server. (e.g. http,https, etc ) |
host | null | Required. Host subsonic server which requests are made to. |
port | 80 | Port on subsonic server which requests are made to. |
timeout | 30 | Request timeout in seconds. |
client | subsonicjs | A unique string identifying the client application. |
version | 1.16.1 | Subsonic server API version to be used. |
Using Promises
Nearly every method returns a chainable promise which can be used.
subsonic.browsing
.getIndexes()
.then((indexes) => {
let firstIndexedArtist = indexes.index[0].artist[0];
return subsonic.browsing().getArtist(firstIndexedArtist.id);
})
.then((artist) => {
//First artist details according to index order
}).catch((err) => {
// Handle error
})Promise Exceptions
A select few methods don't return promises as the end data object is not JSON but rather Binary. In these instances, the method will return a uri for the end client to consume.
subsonic.media.stream(id); //Will return stream uri for media player to consume
subsonic.media.getCoverArt(id); //Will return cover art uri for image components to consumeOptional Parameters
If a call has optional parameters, you can add them to the end of the method as an object.
subsonic.playlists
.updatePlaylist(playlistId, {
name: 'My Playlist',
comment: 'My playlist description'
})
.then((response) => {
//Handle response
})API Layout
The package has broken api calls out into different buckets for organization purposes. The following table contains the buckets and methods. Access methods through the following: subsonic.{bucket}.{method}(). Largely follows organization from official API docs, but some methods were moved to other areas.
| Bucket | Methods |
|---|---|
bookmarks | getBookmarks, createBookmark, deleteBookmark |
browsing | getMusicFolders, getIndexes, getMusicDirectory, getGenres, getArtists, getArtist, getAlbum, getSong, getVideos, getVideoInfo, getArtistInfo, getArtistInfo2, getAlbumInfo, getAlbumInfo2, getSimilarSongs, getSimilarSongs2, getTopSongs, getAlbumList, getAlbumList2, getRandomSongs, getSongsByGenre, getNowPlaying, getStarred |
chat | getChatMessages, addChatMessage |
internetRadio | getInternetRadioStations, createInternetRadioStation, updateInternetRadioStation, deleteInternetRadioStation |
jukeboxControl | jukeboxControl |
media | stream, download, getCaptions, getCoverArt, getLyrics, getAvatar, star, unstar, setRating, scrobble |
playlists | getPlaylists, getPlaylist, createPlaylist, updatePlaylist, deletePlaylist |
playQueue | getPlayQueue, savePlayQueue |
podcasts | getPodcasts, getNewestPodcasts, refreshPodcasts, createPodcastChannel, deletePodcastChannel, deletePodcastEpisode, downloadPodcastEpisode |
searching | search2, search3 |
sharing | getShares, createShare, updateShare, deleteShare |
system | ping, getLicense, getScanStatus, startScan |