gmusicapi allows control of Google Music with Python.
from gmusicapi import Mobileclient
api = Mobileclient()
# after running api.perform_oauth() once:
api.oauth_login('<a previously-registered device id>')
# => True
library = api.get_all_songs()
sweet_track_ids = [track['id'] for track in library
if track['artist'] == 'The Cat Empire']
playlist_id = api.create_playlist('Rad muzak')
api.add_songs_to_playlist(playlist_id, sweet_track_ids)
gmusicapi is not supported nor endorsed by Google.
That said, it's actively maintained, and powers a bunch of cool projects:
- alternate clients, including one designed for the visually impaired, a web-based jukebox which ships with its own server, command line clients, a FUSE filesystem, and an Alexa skill
- library management tools for syncing tracks, syncing playlists, and migrating to a different account
- proxies for media players, such as gmusicproxy and gmusicprocurator, as well as plugins for Mopidy, Squeezebox and Tizonia.
- enhancements like autoplaylists / smart playlists
Start with the usage docs, which will guide you through installation and the available apis.
Once you're up and running, you can explore the rest of the docs at http://unofficial-google-music-api.readthedocs.io.
If the documentation doesn't answer your questions, or you just want to get in touch, either drop by #gmusicapi on Freenode or shoot me an email.
- January 2020: Python 2 support dropped.
- November 2018: proper OAuth support for the mobileclient.
- February 2016: Python 3 support!
- September 2015: Google switched to a new music uploading endpoint, breaking uploading for outdated versions of gmusicapi.
- June 2015: Full mobileclient and webclient functionality was restored.
- May 2015: Limited mobileclient functionality was restored.
- April 2015: Google deprecated clientlogin, breaking both the webclient and mobileclient.
- November 2013: I started working fulltime at Venmo, meaning this project is back to night and weekend development.
For fine-grained development updates, follow me on Twitter: @simonmweber.