class SpotifyTest(unittest.TestCase): def setUp(self): self.spotify = Spotify(USERNAME, PASSWORD) if not self.spotify.logged_in(): print "Login failed" def tearDown(self): self.spotify.logout() def test_get_track_by_uri(self): test_uris = { "spotify:track:4DoiEk7AaubTkIkYencvx7": { "title": "Figure 8", "artist": "Ellie Goulding", "album": "Halcyon" }, "spotify:track:6Qmmzzo9Sdk0QZp0dfLpGk": { "title": "Commander", "artist": "Kelly Rowland, David Guetta", "album": "Commander" } } for uri, reference in test_uris.items(): track = self.spotify.objectFromURI(uri) self.assertEqual(reference["title"], track.getName()) self.assertEqual(reference["artist"], track.getArtists(nameOnly=True)) self.assertEqual(reference["album"], track.getAlbum(nameOnly=True)) def test_playlist_add_delete(self): playlist_name = "unittests" before = len(self.spotify.getPlaylists()) new_playlist = self.spotify.newPlaylist(playlist_name) time.sleep(2) playlist_names = [playlist.getName() for playlist in self.spotify.getPlaylists()] self.assertIn(playlist_name, playlist_names) self.assertEqual(before+1, len(self.spotify.getPlaylists())) self.spotify.removePlaylist(new_playlist) time.sleep(2) playlist_names = [playlist.getName() for playlist in self.spotify.getPlaylists()] self.assertNotIn(playlist_name, playlist_names) self.assertEqual(before, len(self.spotify.getPlaylists()))
def get_or_create_session(username, password, force_create = False): if username in sessions: # Avoid hammering with invalid login attempts (results in temporary lock out) if sessions[username]['current'] == False and sessions[username]['password'] == password: print time.strftime("%d.%m.%Y %H:%M:%S") + " [" + username + "] Login failed (cached)" return False if force_create or sessions[username]['current'] and not sessions[username]['current'].logged_in(): print time.strftime("%d.%m.%Y %H:%M:%S") + " [" + username + "] Session destroyed" if sessions[username]['current']: sessions[username]['current'].logout() sessions[username]['current'] = None if username not in sessions or sessions[username]['current'] == None: spotify = Spotify(username, password) if not spotify.logged_in(): print time.strftime("%d.%m.%Y %H:%M:%S") + " [" + username + "] Login failed" sessions[username] = { 'current':False, 'password':password } return False print time.strftime("%d.%m.%Y %H:%M:%S") + " [" + username + "] Session created" sessions[username] = { 'current':spotify, 'password':password } return sessions[username]['current']
if __name__ == '__main__': parser = argparse.ArgumentParser(description='Command line Spotify client') parser.add_argument('username', help='Your spotify username') parser.add_argument('password', nargs='?', default=None, help='<Optional> your spotify password') args = parser.parse_args() if args.password is None: args.password = getpass.getpass("Please enter your Spotify password") spotify = Spotify(args.username, args.password) if spotify.logged_in(): os.system("kill `pgrep -f respotify-helper` &> /dev/null") uri_resolver = subprocess.Popen([sys.executable, "respotify-helper.py", args.username, args.password]) with client: client.connect(host="localhost", port="6600") Thread(target=heartbeat_handler).start() command_loop() os.system("clear") with client: client.clear() client.disconnect() client = None heartbeat_marker.set() uri_resolver.kill() else:
class SpotifyClient(object): audio_buffer_size = 50 user_agent = PLUGIN_ID def __init__(self, username, password): """ Initializer :param username: The username to connect to spotify with. :param password: The password to authenticate with. """ # Hook logging Logging.hook(3, Log.Debug) Logging.hook(2, Log.Info) Logging.hook(1, Log.Warn) Logging.hook(0, Log.Error) self.username = username self.spotify = Spotify(username, password, log_level=3) # # Public methods # def is_logged_in(self): return self.spotify.logged_in() def restart(self, username, password): return self.spotify.restart(username, password) def shutdown(self): self.spotify.shutdown() def search(self, query, query_type="all", max_results=50, offset=0): """ Execute a search :param query: A query string. """ return self.spotify.search(query, query_type, max_results, offset) # # Media # def get(self, uri): return self.spotify.objectFromURI(uri) def is_album_playable(self, album): """ Check if an album can be played by a client or not """ return True def is_track_playable(self, track): """ Check if a track can be played by a client or not """ return True # # Explore # def get_featured_playlists(self): return self.spotify.getFeaturedPlaylists() def get_top_playlists(self): return self.spotify.getTopPlaylists() def get_new_releases(self): return self.spotify.getNewReleases() def get_genres(self): return self.spotify.getGenres() def get_playlists_by_genre(self, genre_name): return self.spotify.getPlaylistsByGenre(genre_name) # # Discover # def discover(self): """ Return the user's stories """ return self.spotify.discover() # # Radio # def get_radio_genres(self): return self.spotify.getRadioGenres() def get_radio_stations(self): return self.spotify.getRadioStations() def get_radio(self, radio_uri): radios = [] if "spotify:genre:" in radio_uri: radios = self.spotify.getRadioGenres() else: radios = self.spotify.getRadioStations() for radio in radios: if radio.getURI() == radio_uri: return radio return self.spotify.newRadioStation(radio_uri) # # Playlists # def get_playlists(self): """ Return the user's playlists""" return self.spotify.getPlaylists() def get_starred(self): """ Return the user's starred tracks""" return self.get("spotify:user:%s:starred" % self.username) # # My Music # def get_my_albums(self): """ Return the user's albums""" return self.spotify.getMyMusic(type="albums") def get_my_artists(self): """ Return the user's artists""" return self.spotify.getMyMusic(type="artists") # # Uri validation # def is_track_uri_valid(self, track_uri): return self.spotify.is_track_uri_valid(track_uri)
global aodev curl_obj = pycurl.Curl() curl_obj.setopt(pycurl.WRITEFUNCTION, play_stream) curl_obj.setopt(pycurl.URL, str(uri)) curl_obj.perform() curl_obj.close() mpg123.mpg123_close(ctypes.c_void_p(mh)) mpg123.mpg123_delete(ctypes.c_void_p(mh)) mpg123.mpg123_exit() ao.ao_close(ctypes.c_void_p(aodev)) ao.ao_shutdown() if len(sys.argv) < 3: print "Usage: "+sys.argv[0]+" <username> <password> [URI]" else: sp = Spotify(sys.argv[1], sys.argv[2]) if sp.logged_in() == False: print "Login failed" else: uri = sys.argv[3] if len(sys.argv) > 3 else "spotify:track:6NwbeybX6TDtXlpXvnUOZC" obj = sp.objectFromURI(uri) if obj.uri_type == "track": print obj.getName(), obj.getDuration()/1000.0, "seconds" play_track(obj.getFileURL()) else: print "No support for yet for", obj.uri_type sp.logout()
class SpotifyClient(object): audio_buffer_size = 50 user_agent = PLUGIN_ID def __init__(self, username, password): """ Initializer :param username: The username to connect to spotify with. :param password: The password to authenticate with. """ # Hook logging Logging.hook(3, Log.Debug) Logging.hook(2, Log.Info) Logging.hook(1, Log.Warn) Logging.hook(0, Log.Error) self.username = username self.spotify = Spotify(username, password, log_level=3) # # Public methods # def is_logged_in(self): return self.spotify.logged_in() def restart(self, username, password): return self.spotify.restart(username, password) def shutdown(self): self.spotify.shutdown() def search(self, query, query_type='all', max_results=50, offset=0): """ Execute a search :param query: A query string. """ return self.spotify.search(query, query_type, max_results, offset) # # Media # def get(self, uri): return self.spotify.objectFromURI(uri) def is_album_playable(self, album): """ Check if an album can be played by a client or not """ return True def is_track_playable(self, track): """ Check if a track can be played by a client or not """ return True # # Explore # def get_featured_playlists(self): return self.spotify.getFeaturedPlaylists() def get_top_playlists(self): return self.spotify.getTopPlaylists() def get_new_releases(self): return self.spotify.getNewReleases() def get_genres(self): return self.spotify.getGenres() def get_playlists_by_genre(self, genre_name): return self.spotify.getPlaylistsByGenre(genre_name) # # Discover # def discover(self): """ Return the user's stories """ return self.spotify.discover() # # Radio # def get_radio_genres(self): return self.spotify.getRadioGenres() def get_radio_stations(self): return self.spotify.getRadioStations() def get_radio(self, radio_uri): radios = [] if "spotify:genre:" in radio_uri: radios = self.spotify.getRadioGenres() else: radios = self.spotify.getRadioStations() for radio in radios: if radio.getURI() == radio_uri: return radio return self.spotify.newRadioStation(radio_uri) # # Playlists # def get_playlists(self): """ Return the user's playlists""" return self.spotify.getPlaylists() def get_starred(self): """ Return the user's starred tracks""" return self.get('spotify:user:%s:starred' % self.username) # # My Music # def get_my_albums(self): """ Return the user's albums""" return self.spotify.getMyMusic(type="albums") def get_my_artists(self): """ Return the user's artists""" return self.spotify.getMyMusic(type="artists") # # Uri validation # def is_track_uri_valid(self, track_uri): return self.spotify.is_track_uri_valid(track_uri)
curl_obj.setopt(pycurl.WRITEFUNCTION, play_stream) curl_obj.setopt(pycurl.URL, str(uri)) curl_obj.perform() curl_obj.close() mpg123.mpg123_close(ctypes.c_void_p(mh)) mpg123.mpg123_delete(ctypes.c_void_p(mh)) mpg123.mpg123_exit() ao.ao_close(ctypes.c_void_p(aodev)) ao.ao_shutdown() if len(sys.argv) < 3: print "Usage: "+sys.argv[0]+" <username> <password> [URI]" else: sp = Spotify(sys.argv[1], sys.argv[2]) if not sp.logged_in(): print "Login failed" else: uri = sys.argv[3] if len(sys.argv) > 3 else "spotify:track:6NwbeybX6TDtXlpXvnUOZC" obj = sp.objectFromURI(uri) if obj is not None: if obj.uri_type == "track": print obj.getName(), obj.getDuration()/1000.0, "seconds" play_track(obj.getFileURL()) else: print "No support for yet for", obj.uri_type else: print "Request for %s failed" % uri sp.logout()