def recomendations(self, token, tracksFullList, shuffleTime):
        # get user
        spotifyObject = Spotify(auth=token)
        spotifyUser = spotifyObject.current_user()
        username = spotifyUser['id']

        tracks = []

        tracksDict = {}


        songsAdded = 0
        numSongsToAdd = int(int(shuffleTime) / 2)

        while songsAdded < numSongsToAdd:
            for i in range(0, 4):
                tracks.append(random.choice(tracksFullList))

            recs = spotifyObject.recommendations(seed_tracks=tracks)

            tracks = []

            for i in range (0, 4):
                track = random.choice(recs['tracks'])
                if track['id'] not in tracksDict.keys():
                    spotifyObject.add_to_queue(track['id'])
                    tracksDict[track['id']] = "added"
                    songsAdded = songsAdded + 1
    def randomShuffle(self, token, playlistId, shuffleTime):
        # get user
        spotifyObject = Spotify(auth=token)
        spotifyUser = spotifyObject.current_user()
        username = spotifyUser['id']

        tracks = []

        songsAdded = 0
        numSongsToAdd = int(int(shuffleTime) / 2)
        playlist = spotifyObject.user_playlist_tracks(user=username, playlist_id=playlistId)
        numberOfSongs = int(playlist['total'])

        if numberOfSongs < numSongsToAdd:
            numSongsToAdd = numberOfSongs
        while songsAdded < numSongsToAdd:
            for i in range (0, 5):
                offsetNum = random.randint(0, numberOfSongs-1)
                playlist = spotifyObject.user_playlist_tracks(user=username, playlist_id=playlistId, offset=offsetNum)
                song = random.choice(playlist['items'])
                if song['track']['id'] not in tracks:
                    spotifyObject.add_to_queue(song['track']['id'])
                    tracks.append(song['track']['id'])
                    songsAdded = songsAdded + 1
예제 #3
0
class SpotifySearchProvider(dbus.service.Object):
    """The Spotify Search daemon."""

    bus_name = "org.gnome.Spotify.SearchProvider"
    _object_path = "/" + bus_name.replace(".", "/")

    def __init__(self):
        self.results = []
        self.session_bus = dbus.SessionBus()
        self.command = None
        bus_name = dbus.service.BusName(self.bus_name, bus=self.session_bus)
        dbus.service.Object.__init__(self, bus_name, self._object_path)
        os.makedirs(ALBUMART_DIR, exist_ok=True)

        self.auth_manager = SpotifyPKCE(
            client_id=CLIENT_ID,
            cache_path=CACHE_FILE,
            redirect_uri=REDIRECT_URI,
            scope=ACCESS_SCOPE,
        )

        self.spotify = Spotify(auth_manager=self.auth_manager)

    @dbus.service.method(in_signature="sasu", **sbn)
    def ActivateResult(self, id, terms, timestamp):
        debug(terms)
        cmd = terms[0][1:]
        if cmd == "":  # queue by default
            cmd = "queue"
        debug(cmd)
        msg = None
        if cmd == "play":
            self.spotify.start_playback(uris=[id])
            msg = "Now playing"
        elif cmd == "queue" or cmd == "q":
            self.spotify.add_to_queue(uri=id)
            msg = "Added to queue"
        else:
            self.notify("Unknown Command", body=cmd)
            return

        self.notify(
            msg,
            body=self.results[id]["artist"] + " - " +
            self.results[id]["title"],
            icon=self.results[id]["icon"],
        )

    @dbus.service.method(in_signature="as", out_signature="as", **sbn)
    def GetInitialResultSet(self, terms):
        # only parse queries that start with $ and contain 2 or more terms
        if not terms[0].startswith("$"):
            return []
        if len(terms) < 2:
            return []
        qs = ""
        for q in terms[1:]:
            qs += q + " "
        qs.strip()
        if len(qs) < 2:
            return []

        out = []
        self.results = {}
        tracks = parse_tracks(self.spotify.search(qs, limit=5))
        for track in tracks:
            self.results[track["uri"]] = {
                "title": track["title"],
                "artist": track["artist"],
                "album": track["album"],
                "albumart_url": track["albumart_url"],
            }
            out.append(track["uri"])
        return out

    @dbus.service.method(in_signature="asas", out_signature="as", **sbn)
    def GetSubsearchResultSet(self, previous_results, new_terms):
        return self.GetInitialResultSet(new_terms)

    @dbus.service.method(in_signature="as", out_signature="aa{sv}", **sbn)
    def GetResultMetas(self, ids):
        out = []
        for uri in ids:
            if uri in self.results:
                entry = {}
                entry["id"] = uri
                entry["name"] = self.results[uri]["title"]
                entry["description"] = (self.results[uri]["artist"] + " - " +
                                        self.results[uri]["album"])
                basename = os.path.basename(self.results[uri]["albumart_url"])
                albumart_path = os.path.join(ALBUMART_DIR, basename)
                if not os.path.exists(albumart_path):
                    with open(albumart_path, "wb") as f:
                        with urlopen(self.results[uri]["albumart_url"]) as r:
                            f.write(r.read())
                self.results[uri]["icon"] = albumart_path
                entry["gicon"] = albumart_path
                out.append(entry)
        return out

    @dbus.service.method(in_signature="asu", terms="as", timestamp="u", **sbn)
    def LaunchSearch(self, terms, timestamp):
        pass

    def notify(self, message, body="", icon="spotify-client", error=False):
        try:
            self.session_bus.get_object(
                "org.freedesktop.Notifications",
                "/org/freedesktop/Notifications").Notify(
                    "Spotify",
                    0,
                    icon,
                    message,
                    body,
                    "",
                    {"transient": False if error else True},
                    0 if error else 3000,
                    dbus_interface="org.freedesktop.Notifications",
                )
        except dbus.DBusException as err:
            print(f"Error {err} while trying to display {message}.")
예제 #4
0
def queue_song(uri: str, sp: spotipy.Spotify):
    sp.add_to_queue(uri=uri)
    def shuffle(self, playlistName, clustersAndError, token, shuffleTime, genreDict):
        # get user
        spotifyObject = Spotify(auth=token)
        spotifyUser = spotifyObject.current_user()
        username = spotifyUser['id']

        # find playlist
        playlistID = playlistName

        #vibe Genres
        vibeGenresTest = genreDict
        vibeGenres = []
        for vibe in vibeGenresTest:
            vibeGenres.append(str(vibe))

        songGenreDict = {}

        # get songs
        playlist = spotifyObject.user_playlist_tracks(user=username, playlist_id=playlistID)
        numberOfSongs = int(playlist['total'])
        totalAdded = int(0)
        songsToAdd = []
        while (numberOfSongs > totalAdded):
            playlist = spotifyObject.user_playlist_tracks(user=username, playlist_id=playlistID, offset=totalAdded)
            for i in range(0, len(playlist['items'])):
                try:
                    songURI = playlist['items'][i]['track']['uri']
                    songId = playlist['items'][i]['track']['id']
                    songFeatures = spotifyObject.audio_features(songURI)

                    if (self.songGenreInVibe(spotifyObject=spotifyObject, songId=songId, songGenreDict=songGenreDict,
                                             vibeGenreDict=vibeGenres) == True):

                        song = [[songFeatures[0]['acousticness'],
                                   songFeatures[0]['danceability'], songFeatures[0]['energy'],
                                   songFeatures[0]['instrumentalness'], songFeatures[0]['liveness'],
                                songFeatures[0]['speechiness'], round(songFeatures[0]['tempo'] / 180, 6),
                                songFeatures[0]['valence']]]
                        distArray = cdist(song, clustersAndError[0], 'euclidean')
                        dist = min(distArray[0])
                        if float(dist) < float(clustersAndError[1]):
                            if len(songsToAdd) < 2:
                                songsToAdd.append(songURI)
                                spotifyObject.add_to_queue(songURI)

                            else:
                                songsToAdd.append(songURI)

                except:
                    print("spotify does not have this song anymore. Sorry")
            totalAdded = totalAdded + 100

        numSongsToAdd = int(int(shuffleTime) / 2)
        songsAdded = 0
        while songsAdded < numSongsToAdd or len(songsToAdd) == 0:
            try:
                addSong = random.choice(songsToAdd)
                spotifyObject.add_to_queue(addSong)
                songsToAdd.remove(addSong)
                songsAdded = songsAdded + 1
                time.sleep(int(5))
            except:
                print("song not added")