async def run(): # https://developer.spotify.com/web-api/console/get-playlists/ oauth_token = pathlib.Path(pathlib.Path.home(), "secrets/spotify_access_token.txt") with ClientSession() as session: c = SpotifyClient(session, oauth_token) logged_in = await c.loggedin() if not logged_in: print("not logged in") return print("Logged in") # playlists = await c.fetch_spotify_playlists() # sp_playlist = playlists[0] sp_playlist_uri = 'spotify:user:22ujgyiomxbgggsb7mvnorh7q:playlist:3OVXBy5QDsx1jdSHrkAu1L' # noqa pl = await c.fetch_playlist(sp_playlist_uri) tracks = pl['tracks']['items'] for i, sp_track in enumerate(tracks): query = SpotifyQuery(i, sp_playlist_uri, sp_track, len(tracks)) query.search_query()
def transfer_playlists(request, s, g, sp_playlist_uris): for sp_playlist_uri in sp_playlist_uris: sp_playlist = yield from s.fetch_playlist(sp_playlist_uri) sp_playlist_tracks = yield from s.fetch_playlist_tracks( sp_playlist_uri) track_count = len(sp_playlist_tracks) uprint( "Gathering tracks for playlist %s (%s)" % (sp_playlist['name'], track_count) ) playlist_json = { "playlist": { "uri": sp_playlist_uri, "name": sp_playlist['name'], }, "name": sp_playlist['name'], } yield from emit_playlist_length(request, track_count) yield from emit_playlist_started(request, playlist_json) if not sp_playlist_tracks: yield from emit_playlist_ended(request, playlist_json) return tasks = [] for i, sp_track in enumerate(sp_playlist_tracks): query = SpotifyQuery(i, sp_playlist_uri, sp_track, track_count) future = search_gm_track(request, g, query) tasks.append(future) done = yield from asyncio.gather(*tasks) gm_track_ids = [i for i in done if i is not None] # Once we have all the gm_trackids, add them if len(gm_track_ids) > 0: uprint("Creating in Google Music... ", end='') sys.stdout.flush() gm_track_ids_without_duplicated = list(OrderedDict.fromkeys(gm_track_ids)) tracks_lists = list(chunks(gm_track_ids_without_duplicated, 999)) # Creates a playlist for each 999 tracks (GM has a 1000 tracks playlist limit) for key, track_list in enumerate(tracks_lists): playlist_title = sp_playlist['name'] if len(tracks_lists) > 1: playlist_title = '{0} {1}/{2}'.format(playlist_title, str(key+1), str(len(tracks_lists))) playlist_id = yield from g.create_playlist(playlist_title) created = yield from g.add_songs_to_playlist(playlist_id, track_list) uprint("Done") yield from emit_playlist_ended(request, playlist_json) yield from emit_all_done(request)
async def transfer_playlists(request, s, g, sp_playlist_uris): for sp_playlist_uri in sp_playlist_uris: sp_playlist = await s.fetch_playlist(sp_playlist_uri) sp_playlist_tracks = await s.fetch_playlist_tracks(sp_playlist_uri) track_count = len(sp_playlist_tracks) if track_count == 0: uprint("Skipping empty playlist %s" % (sp_playlist['name'])) continue uprint("Gathering tracks for playlist %s (%s)" % (sp_playlist['name'], track_count)) playlist_json = { "playlist": { "uri": sp_playlist_uri, "name": sp_playlist['name'] }, "name": sp_playlist['name'], } await emit_playlist_length(request, track_count) await emit_playlist_started(request, playlist_json) if not sp_playlist_tracks: await emit_playlist_ended(request, playlist_json) return tasks = [] for i, sp_track in enumerate(sp_playlist_tracks): query = SpotifyQuery(i, sp_playlist_uri, sp_track, track_count) future = search_gm_track(request, g, query) tasks.append(future) done = await asyncio.gather(*tasks) gm_track_ids = [i for i in done if i is not None] # Once we have all the gm_trackids, add them if len(gm_track_ids) > 0: uprint("Creating in Google Music... ", end='') sys.stdout.flush() for i, sub_gm_track_ids in enumerate(grouper(gm_track_ids, 1000)): name = sp_playlist['name'] if i > 0: name = "{} ({})".format(name, i + 1) playlist_id = await g.create_playlist(name) await \ g.add_songs_to_playlist(playlist_id, sub_gm_track_ids) uprint("Done") await emit_playlist_ended(request, playlist_json) await emit_all_done(request)
def transfer_playlists(request, s, g, playlist, content_type, sp_playlist_uris): for sp_playlist_uri in sp_playlist_uris: sp_playlist = yield from s.fetch_playlist(sp_playlist_uri['uri']) if sp_playlist['name'] != playlist: continue sp_playlist_tracks = yield from s.fetch_playlist_tracks( sp_playlist_uri['uri']) track_count = len(sp_playlist_tracks) uprint("Gathering tracks for playlist %s (%s)" % (sp_playlist['name'], track_count)) playlist_json = { "playlist": { "uri": sp_playlist_uri['uri'], "name": sp_playlist['name'], }, "name": sp_playlist['name'], } yield from emit_playlist_length(request, track_count) yield from emit_playlist_started(request, playlist_json) if not sp_playlist_tracks: yield from emit_playlist_ended(request, playlist_json) return tasks = [] for i, sp_track in enumerate(sp_playlist_tracks): query = SpotifyQuery(i, sp_playlist_uri['uri'], sp_track, track_count) future = search_gm_track(request, g, query, content_type) tasks.append(future) done, _ = yield from asyncio.wait(tasks) track_ids = [i.result() for i in done if i.result() is not None] gm_track_ids = [x[1] for x in sorted(track_ids)] # Once we have all the gm_trackids, add them if len(gm_track_ids) > 0: uprint("Creating in Google Music...", end='') sys.stdout.flush() playlist_id = yield from g.create_playlist(sp_playlist['name']) yield from g.add_songs_to_playlist(playlist_id, gm_track_ids) uprint("Done") yield from emit_playlist_ended(request, playlist_json) yield from emit_all_done(request)
def transfer_playlist(request, s, g, sp_playlist): log.info("[%s] Fetching tracks for playlist", sp_playlist['name']) sp_playlist_tracks = yield from s.fetch_playlist_tracks(sp_playlist['uri']) track_count = len(sp_playlist_tracks) playlist_json = { "playlist": { "uri": sp_playlist['uri'], "name": sp_playlist['name'], }, "name": sp_playlist['name'], } yield from emit_playlist_length(request, track_count) yield from emit_playlist_started(request, playlist_json) if not sp_playlist_tracks: yield from emit_playlist_ended(request, playlist_json) return log.info("[%s] Mapping tracks for playlist (%d)", sp_playlist['name'], track_count) tasks = [] for i, sp_track in enumerate(sp_playlist_tracks): query = SpotifyQuery(i, sp_playlist['uri'], sp_track, track_count) fut = search_gm_track(request, g, query) tasks.append(fut) gm_track_map = yield from asyncio.gather(*tasks) gm_track_ids = set((t for t in gm_track_map if t)) log.info("[%s] Mapped tracks for playlist (%d out of %d)", sp_playlist['name'], len(gm_track_ids), track_count) missing_track_ids = [ sp_playlist_tracks[x].get( 'name', sp_playlist_tracks[x].get('id', sp_playlist_tracks[x])) for x, val in enumerate(gm_track_map) if val is None ] if missing_track_ids: log.error( "[%s] Missing %d tracks on Google, these will NOT be added for obvious reasons: %s", sp_playlist['name'], len(missing_track_ids), missing_track_ids) split_count = int(len(gm_track_map) / 1000) + 1 if split_count > 1: log.warning( '[%s] There is a 1000 track limit per playlist on Google, splitting into %d playlists', sp_playlist['name'], split_count) for split_id in range(1, split_count + 1): playlist_name = sp_playlist['name'] if split_count > 1: playlist_name += ' %d' % split_id try: gpl = yield from g.get_cached_playlist(name=playlist_name) playlist_id = gpl['id'] log.info("[%s] Playlist already exists on Google id=%s", playlist_name, playlist_id) except KeyError: playlist_id = yield from g.create_playlist(playlist_name) log.info("[%s] Created playlist on Google id=%s", playlist_name, playlist_id) log.info( "[%s] Ensuring tracks (%d out of %d) are in playlist on Google.", playlist_name, len(gm_track_ids), track_count) added_track_ids = yield from g.ensure_songs_in_playlist( playlist_id, gm_track_ids) log.info('[%s] Added %d tracks to Google', playlist_name, len(added_track_ids)) log.info("[%s] Done syncing playlist to Google.", sp_playlist['name']) yield from emit_playlist_ended(request, playlist_json)