Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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)