I have 2 wonderful children and for Xmas they received a Toniebox [1]. There are many many incredbile Tonie's out there, but we were struggeling with what we can fill our Creative Tonies. After a while we found many wonderful stories for kids on Spotify [2] and we wondered why not having these stories on a Creative Tonie.
So this handy tool is to sync Spotify playlists with your Creative Tonies.
Remark: To use this tool you must have a Spotify premium abo!
My special thanks to:
- Geert Vandeweyer for stream_recorder.pl [3]
- Wander Nauta for SP [4]
Links:
[1]: https://www.tonies.com/
[2]: https://www.spotify.com/
[3]: https://bitbucket.org/geertvandeweyer/spotify_recorder/src
[4]: https://gist.github.com/wandernauta/6800547
To build a single package including all dependencies:
mvn clean package assembly:single installGenerate URI to accept all terms & conditions for your clientId at Spotify
java -jar spotify-toniebox-sync-[VERSION]-jar-with-dependencies.jar --apicodeGenerate your refreshToken based on the data parameter
java -jar spotify-toniebox-sync-[VERSION]-jar-with-dependencies.jar --code "[DATA PARAMETER]"Sync one playlist to a Tonie. No daemon which keeps syncing, just a one-shot
java -jar spotify-toniebox-sync-[VERSION]-jar-with-dependencies.jar --playlist "[PLAYLIST NAME ON SPOTIFY]" --tonie "[NAME OF TONIE]"Run Spotify Toniebox Sync as daemon which keeps polling & syncing
java -jar spotify-toniebox-sync-[VERSION]-jar-with-dependencies.jar --daemon &There are 3 properties-file you have to adapt for your personal needs.
This properties file contains everything which is necessary for the Spotify communication and caching audio files which are downloaded from Spotify.
# Setup to run with Spotify
spotify.clientId=<clientId>
spotify.clientSecret=<clientSecret>
spotify.redirectUri=<redirectUri>
spotify.refreshToken=<refreshToken>
spotify.cachePath=<pathForCaching>You have to setup a ClientId at https://developer.spotify.com for spotify.clientId, spotify.clientSecret and spotify.redirectUri.
spotify.redirectUri can be selected randomly by you, it must be a valid URI but nothing has to be hosted there. You have to use the same here as in the ClientId
To get the refreshToken
Fill out spotify.clientId, spotify.clientSecret and spotify.redirectUri.
Buid the software like described above.
Run:
java -jar spotify-toniebox-sync-[VERSION]-jar-with-dependencies.jar --apicodeThe call will result in some output like
URI: https://accounts.spotify.com:443/authorize?client_id=e26995898f9f4e4d9bf45b3001e6701d&response_type=code&redirect_uri=https%3A%2F%2Fmaximilian.voss.rocks%2Fspotify-redirect&state=x4xkmn9pu3j6ukrs8n&scope=playlist-read-private%2Cplaylist-read-collaborative%2Cplaylist-modify-private%2Cplaylist-modify-public&show_dialog=true
Open this URI in your web-browser, enter your credentials, agree and see that you are going to be redirected to spotify.redirectUri.
The URI has a parameter data appended. Take the value (after the data parameter is a state parameter, make sure you don't copy this as well).
Take the data parameter and execute:
java -jar spotify-toniebox-sync-[VERSION]-jar-with-dependencies.jar --code "[DATA-PARAMETER]"The call will result in some output like
Refresh Token: AQBStXZ6GhKpU-eGSN2GS13d0kITqUBgqeXWgMLlFOSacOpjSQ-nB9F-Y3KOT4dGRB_aAV5bX1T8hDoKQP04hGqJkhhiVonKZgWBFVuWSqoHDEm-eiKKg0nT3qY0nOxEX_zNXg
Take the refresh token and fill spotify.refreshToken in the properties file.
As for spotify.cachePath, select any temp directory where you want to cache the Spotify songs.
Insert your Toniebox credentials here:
# Toniebox credentials
toniebox.username=<username>
toniebox.password=<password>
toniebox.trackname="%d - %a - %n"If you want to name your toniebox users in a specific schema you have the possibility to set toniebox.trackname accordingly.
The available variables are:
| Variable | Meaning |
|---|---|
| %i | Spotify track Id |
| %a | Artist names |
| %n | Track name |
| %d | Disc number |
| %t | Track number |
The Trackname must always start with the Track Id. This will be used to determine if a track is already uploaded.
If you want to run Spotify Toniebox Sync as a daemon you have to fill this properties file.
Each mapping[X] is a set of Tonie Id;Spotify Playlist URI.
mapping[0]=3E141A0D500314E9;spotify:user:dummyuser:playlist:1mXl7MwD1BGILtZVW4af4f
mapping[1]=F969A20D500384E9;spotify:user:dummyuser:playlist:5A52aoIXdtWS20WmZ9FVGRTonieId can be found in the URL of your creative Tonie.
Spotify Playlist URI: context menu in Spotify -> Share -> Copy Spotify URI.
Installation based on vanilla Ubuntu 64-bit Server 18.04.1
apt-get install -y x11vnc xvfb sox lame qdbus ffmpeg pulseaudio dbus-x11 xinitecho deb http://repository.spotify.com stable non-free | sudo tee /etc/apt/sources.list.d/spotify.list
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 931FF8E79F0876134EDDBDCCA87FF9DF48BF1C90
sudo apt-get update
sudo apt-get install -y spotify-client git clone git@git.voss.rocks:toniebox/spotify-download-service.git
ln -sf $PWD/spotify-toniebox-sync/bin/sp /usr/local/bin
ln -sf $PWD/spotify-toniebox-sync/bin/stream_recorder.pl /usr/local/bin/To check if Spotify is really running and maybe to also adjust there some settings.
x11vnc -display :99 -bg -nopw -xkbEverything you need to make it run:
nohup Xvfb :99 -screen 0 800x600x16 &
DISPLAY=:99; export DISPLAY
nohup pulseaudio --start &
nohup spotify $SPOTIFY_OPTIONS &
nohup java -jar spotify-toniebox-sync-[VERSION]-SNAPSHOT-jar-with-dependencies.jar --daemon &