Portify is a little tool (written using NodeJS, AngularJS and app.js) that transfers your Spotify Playlists to the new Google Music: All Access service.
UPDATE: Added Packaged version for MacOS X
UPDATE #2: Added version 0.2, this should fix crashes related to “special” characters. The first upload of 0.2 was corrupted, so you may want to dl it again. Sorry.
UPDATE #3: 0.3 fixes another round of errors users all over the world had.
UPDATE #4: 0.4: Some Playlists are unavailable for unknown reasons. This version fixes crashes related to those playlists (ie. they will be skipped)
It does so by accessing unofficial APIs on both sides, this is why the app asks for both your Google and Spotify passwords. This is also the reason I am not releasing this as something that runs on a public server but instead as a packaged ready-to-run app (app.js is basically just NodeJS packaged with an embedded version of Chrome). This way you can check the code for yourself and easily run Portify on Localhost.
Disclaimer By using Portify you may violate both Spotify’s and Google’s Terms of Service. You agree that you are using Portify on your own risk. The author does not accept liability (as far as permitted by law) for any loss arising from any use of this tool. If you choose not to agree to these terms, then you may not use this tool.
The pre-compiled binaries have been removed because they didn’t work for most users. Please build portify yourself using the instructions provided
Since this is my first app created using Angular.js I’d really appreciate if you report any bugs you encounter here: GitHub – Issues
Maybe both companies take this as a hint to offer a proper Playlist API and start tagging their music with unique MusicBrainz Identifiers. I just hope to not get sued over this. If any of the two companies wants me to take this down, just drop me an email.
More advanced users are invited to run this on your own NodeJS installation without using the app.js wrapper. You can get the code on GitHub:
If you want to run portify without the app.js wrapper (ie. if you have problems running the packaged version) you might do the following: