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
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}.")
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")