Beispiel #1
0
    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)
Beispiel #2
0
def get_or_create_session(username, password):
    if username not in sessions:
        spotify = Spotify(username, password)

        if not spotify:
            return False
        else:
            sessions[username] = spotify

    return sessions[username]
Beispiel #3
0
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']
Beispiel #4
0
    def default(self, uri=None):
        if uri is None:
            raise cherrypy.HTTPError(
                400, "A paramater was expected but not supplied.")

        spotify = Spotify(sys.argv[1], sys.argv[2])
        track = spotify.objectFromURI(uri)
        if track is None:
            spotify.logout()
            raise cherrypy.HTTPError(404,
                                     "Could not find a track with that URI.")

        url = track.getFileURL()
        if not url:
            spotify.logout()
            raise cherrypy.HTTPError(
                404, "Could not find a track URL for that URI.")

        spotify.logout()
        raise cherrypy.HTTPRedirect(url)
  def default(self, uri = None):
    if uri == None:
      raise cherrypy.HTTPError(400, "A paramater was expected but not supplied.")

    spotify = Spotify(sys.argv[1], sys.argv[2])
    track = spotify.objectFromURI(uri)
    if track == None:
      spotify.logout()
      raise cherrypy.HTTPError(404, "Could not find a track with that URI.")

    url = track.getFileURL()
    if url == False:
      spotify.logout()
      raise cherrypy.HTTPError(404, "Could not find a track URL for that URI.")

    spotify.logout()
    raise cherrypy.HTTPRedirect(url)
Beispiel #6
0
    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)
        heartbeat_marker.get(timeout=15)


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()
Beispiel #8
0
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)
Beispiel #9
0
        heartbeat_marker.wait(timeout=15)


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()
	global mainloop
	mainloop.quit()

def player_message(bus, msg, player, mainloop):
	if msg.type == gst.MESSAGE_EOS:
		player.set_state(gst.STATE_NULL)
		mainloop.quit()
	elif msg.type == gst.MESSAGE_ERROR:
		player.set_state(gst.STATE_NULL)
		print msg.parse_error()

if len(sys.argv) < 3:
	print "Usage: "+sys.argv[0]+" <username> <password> [track URI]"
else:

	sp = Spotify(sys.argv[1], sys.argv[2])
	mainloop = gobject.MainLoop()
	
	player = gst.parse_launch('uridecodebin name=uridecode ! autoaudiosink')

	bus = player.get_bus()
	bus.add_signal_watch()
	bus.connect('message', player_message, player, mainloop)

	uri = sys.argv[3] if len(sys.argv) > 3 else "spotify:track:6NwbeybX6TDtXlpXvnUOZC"
	track = sp.objectFromURI(uri)

	print ','.join([a.getName() for a in track.getArtists()])+' - '+track.getName()

	mp3_uri = track.getFileURL()
	player.get_by_name('uridecode').set_property('uri', mp3_uri)
    mainloop.quit()


def player_message(bus, msg, player, mainloop):
    if msg.type == gst.MESSAGE_EOS:
        player.set_state(gst.STATE_NULL)
        mainloop.quit()
    elif msg.type == gst.MESSAGE_ERROR:
        player.set_state(gst.STATE_NULL)
        print msg.parse_error()

if len(sys.argv) < 3:
    print "Usage: " + sys.argv[0] + " <username> <password> [track URI]"
else:

    sp = Spotify(sys.argv[1], sys.argv[2])
    mainloop = gobject.MainLoop()

    player = gst.parse_launch('uridecodebin name=uridecode ! autoaudiosink')

    bus = player.get_bus()
    bus.add_signal_watch()
    bus.connect('message', player_message, player, mainloop)

    uri = sys.argv[3] if len(sys.argv) > 3 else "spotify:track:6NwbeybX6TDtXlpXvnUOZC"
    track = sp.objectFromURI(uri)

    print ','.join([a.getName() for a in track.getArtists()]) + ' - ' + track.getName()

    mp3_uri = track.getFileURL()
    player.get_by_name('uridecode').set_property('uri', mp3_uri)
Beispiel #12
0
	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()
Beispiel #13
0
 def setUp(self):
     self.spotify = Spotify(USERNAME, PASSWORD)
     if not self.spotify.logged_in():
         print "Login failed"
Beispiel #14
0
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()))
Beispiel #15
0
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)
Beispiel #16
0
    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()