Manages track ratings between local iTunes and Google Play Music
- Python 3.6 (I think? because it's my first-ish time with python)
- ConfigParser
- A Google Music API: gmusicapi
- A passion for rating things. Including a Greasemonkey/Tampermonkey script to restore 1-5 star ratings in Google Music web client: google-play-music-star-ratings
- iTunes 11.1.3.8 (because that's what I currently have installed, and I don't want to get into iTunes library format specs just yet)
So you like Google Music, but you have a decade of star ratings in iTunes. Let's scan your iTunes music library and synchronize the ratings over to Google Music.
I suppose I could build something that goes the other way too but who wants that.
My first plan for this is going to be super-slow, and involve a single thread doing a search for artist/title/album, then updating the synced results. Some optimization ideas that I may or may not get to are:
- Multi-threading
- Searching by album instead of track (more precise, but higher likelyhood of false negatives)
- Grouping by album to fetch all results for specific albums (will save on additional searches for tracks in the same album)
- Cleverly ignoring suffixes like "(Deluxe edition)" or "(Collectors edition") to do better fuzzy matching
- Incorporating track length (with some tiny fuzzing) to make sure that covers/remixes/extended editions aren't ranked inaccurately
-
syncStoreRatings: Default ==
false
, meaning only ratings for user uploaded music (to "My Library") will be synced. Change totrue
to also sync "store" tracks not in the library -
maxResults: Default ==
10
. Set as low as1
or as high as100
-
syncAllFoundResults: Default ==
false
, meaning only the top found track's rating will be synced. Change totrue
to sync all found tracks. -
considerPlayCount: Default ==
true
, meaning higher play count is considered in sort decision -
matchOnAlbum: Default ==
true
, meaning only tracks found with the same album will have their ratings synced. Change tofalse
to set all results for artist/track (ie compilations, alternate editions, etc) -
aggressiveMode: Default ==
false
;true
means set syncStoreRatings=true
, maxResults=10
, syncAllFoundResults=true
, matchOnAlbum=false
-
cautiousMode: Default ==
false
;true
means set syncStoreRatings=false
, maxResults=2
, syncAllFoundResults=false
, matchOnAlbum=true
- cautiousMode will override aggressiveMode