diff --git a/README.md b/README.md index 254c0f8c..624c0d97 100644 --- a/README.md +++ b/README.md @@ -4,17 +4,21 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker Pulls](https://img.shields.io/docker/pulls/foxxmd/multi-scrobbler)](https://hub.docker.com/r/foxxmd/multi-scrobbler) -A single-user, javascript app to scrobble your recent plays to [Maloja](https://github.com/krateng/maloja) (and other clients, eventually) +A javascript app to scrobble plays from multiple sources to [Maloja](https://github.com/krateng/maloja) (and other clients, eventually!) -* Displays running status and buffered log through web server -* Spotify - Authorize your app through the web server -* Spotify - Persists obtained credentials to file -* Spotify - Automatically refreshes authorization for unattended use -* Spotify - Implements back off behavior if no listening activity is detected after an interval (after 10 minutes of idle it will back off to a maximum of 5 minutes between checks) -* [Tautulli](https://tautulli.com) - Scrobble endpoint using notification agents -* [Plex](https://plex.tv) - Scrobble endpoint using [Webhooks](https://support.plex.tv/articles/115002267687-webhooks) +* Supports scrobbling from [Spotify](/docs/configuration.md#spotify), [Plex](/docs/configuration.md#plex), and [Tautulli](/docs/configuration.md#tautulli) +* Supports configuring for single or multiple users (scrobbling for your friends and family!) +* Web server interface for stats, basic control, and detailed logs +* Smart handling of credentials (persistent, authorization through app) +* Easy configuration through ENVs or JSON +* Built for Docker and unattended use! -## Installation And Running +**Why should I use this over a browser extension and/or mobile app scrobbler?** + +* **Platform independent** -- Because multi-scrobbler communicates directly with service APIs it will scrobble everything you play regardless of where you play it. No more need for apps on every platform you use! +* **Open-source** -- Get peace of mind knowing exactly how your personal data is being handled. + +## Installation ### Locally @@ -25,7 +29,6 @@ Clone this repository somewhere and then install from the working directory git clone https://github.com/FoxxMD/multi-scrobbler.git . cd multi-scrobbler npm install -node index.js ``` ### [Docker](https://hub.docker.com/r/foxxmd/multi-scrobbler) diff --git a/config/config.json.example b/config/config.json.example index 6dd8c687..17eb5a50 100644 --- a/config/config.json.example +++ b/config/config.json.example @@ -1,10 +1,10 @@ { "sources": [ { - "type": "spotify", // required, source type - "clients": ["myConfig"], // optional, a list of Client config names this Source should scrobble to. Using an empty list or not including this property will make this Source scrobble to all Clients. - "name": "mySpotifySource", // optional, friendly name for the log - "data": { // required, the data for your config + "type": "spotify", // required, source type + "clients": ["myConfig"], // optional, a list of Client config names this Source should scrobble to. Using an empty list or not including this property will make this Source scrobble to all Clients. + "name": "mySpotifySource", // optional, friendly name for the log + "data": { // required, the data for your config "clientId": "example", //... } @@ -12,9 +12,9 @@ ], "clients": [ { - "type": "maloja", // required, Client type - "name": "myConfig", // required, a name to identifier your Client - "data": { // required, the data for your config + "type": "maloja", // required, Client type + "name": "myConfig", // required, a name to identifier your Client + "data": { // required, the data for your config "url": "http://example.com", //... } diff --git a/config/maloja.json.example b/config/maloja.json.example index 031946ab..1245ecac 100644 --- a/config/maloja.json.example +++ b/config/maloja.json.example @@ -1,9 +1,9 @@ [ { - "name": "myMaloja", // required, a name to identify your Client + "name": "myMaloja", // required, a name to identify your Client "data": { - "url": "https://domain.tld", // the base url of your maloja installation - "apiKey": "string" // your maloja api key + "url": "https://domain.tld", // required, the base url of your maloja installation + "apiKey": "string" // required, your maloja api key } } ] diff --git a/config/plex.json.example b/config/plex.json.example index 7b891d2e..652eeb53 100644 --- a/config/plex.json.example +++ b/config/plex.json.example @@ -1,11 +1,11 @@ [ { - "name": "default", // optional, friendly name for logs - "clients": [], // optional, list of scrobble clients (by config name) that this source should scrobble to. Using an empty list or not including this property will make this source scrobble to all clients. + "name": "default", // optional, friendly name for logs + "clients": [], // optional, list of scrobble clients (by config name) that this source should scrobble to. Using an empty list or not including this property will make this source scrobble to all clients. "data": { "user": ["username@gmail.com","anotherUser@gmail.com"], // optional, list of users to scrobble tracks for - "libraries": ["music","my podcasts"], // optional, list of libraries to scrobble tracks from - "servers": ["myServer","anotherServer"] // optional, list of servers to scrobble tracks from + "libraries": ["music","my podcasts"], // optional, list of libraries to scrobble tracks from + "servers": ["myServer","anotherServer"] // optional, list of servers to scrobble tracks from } } ] diff --git a/config/spotify.json.example b/config/spotify.json.example index 1cd8c411..41a0cba2 100644 --- a/config/spotify.json.example +++ b/config/spotify.json.example @@ -1,14 +1,14 @@ [ { - "name": "default", // optional, friendly name for logs - "clients": [], // optional, list of scrobble clients (by config name) that this source should scrobble to. Using an empty list or not including this property will make this source scrobble to all clients. + "name": "default", // optional, friendly name for logs + "clients": [], // optional, list of scrobble clients (by config name) that this source should scrobble to. Using an empty list or not including this property will make this source scrobble to all clients. "data": { - "clientId": "string", // spotify client id -- required if not providing access token - "clientSecret": "string", // spotify client secret -- required if not providing access token - "accessToken": "string", // spotify access token -- required if not providing client id/secret - "refreshToken": "string", // spotify refresh token -- recommended to provide if not providing client id/secret - "redirectUri": "http://localhost:9078/callback", // spotify redirect URI -- required only if not the default shown here. URI must end in "callback" - "interval": 60 // optional, how long to wait before calling spotify for new tracks + "clientId": "string", // spotify client id -- required if not providing access token + "clientSecret": "string", // spotify client secret -- required if not providing access token + "accessToken": "string", // spotify access token -- required if not providing client id/secret + "refreshToken": "string", // spotify refresh token -- recommended to provide if not providing client id/secret + "redirectUri": "http://localhost:9078/callback",// spotify redirect URI -- required only if not the default shown here. URI must end in "callback" + "interval": 60 // optional, how long to wait before calling spotify for new tracks } } ] diff --git a/config/tautulli.json.example b/config/tautulli.json.example index 7b891d2e..652eeb53 100644 --- a/config/tautulli.json.example +++ b/config/tautulli.json.example @@ -1,11 +1,11 @@ [ { - "name": "default", // optional, friendly name for logs - "clients": [], // optional, list of scrobble clients (by config name) that this source should scrobble to. Using an empty list or not including this property will make this source scrobble to all clients. + "name": "default", // optional, friendly name for logs + "clients": [], // optional, list of scrobble clients (by config name) that this source should scrobble to. Using an empty list or not including this property will make this source scrobble to all clients. "data": { "user": ["username@gmail.com","anotherUser@gmail.com"], // optional, list of users to scrobble tracks for - "libraries": ["music","my podcasts"], // optional, list of libraries to scrobble tracks from - "servers": ["myServer","anotherServer"] // optional, list of servers to scrobble tracks from + "libraries": ["music","my podcasts"], // optional, list of libraries to scrobble tracks from + "servers": ["myServer","anotherServer"] // optional, list of servers to scrobble tracks from } } ] diff --git a/docs/configuration.md b/docs/configuration.md index e8dbb103..1fdd02cd 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -44,7 +44,7 @@ All configurations can be configured through: } ``` -See [config.json.example](../config/config.json.example) for a full example of this. +See [config.json.example](../config/config.json.example) for a short example of this or check out [the kitchen sink example](kitchensink.md). ### ENV-Based or JSON-Based? @@ -73,7 +73,7 @@ doing everything in ENV-based configurations.** # Sources -## Spotify +## [Spotify](https://www.spotify.com) To access your Spotify history you must [register an application](https://developer.spotify.com/dashboard) to get a Client ID/Secret. Make sure to also whitelist your redirect URI in the application settings.