Hello community, here is the log from the commit of package python-spotipy for openSUSE:Factory checked in at 2020-03-26 23:35:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-spotipy (Old) and /work/SRC/openSUSE:Factory/.python-spotipy.new.3160 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-spotipy" Thu Mar 26 23:35:07 2020 rev:4 rq:788591 version:2.10.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-spotipy/python-spotipy.changes 2020-03-18 12:45:35.888962486 +0100 +++ /work/SRC/openSUSE:Factory/.python-spotipy.new.3160/python-spotipy.changes 2020-03-26 23:35:24.302821206 +0100 @@ -1,0 +2,7 @@ +Thu Mar 26 14:45:02 UTC 2020 - Marketa Calabkova <mcalabk...@suse.com> + +- update to 2.10.0 + * Support for add_to_queue + * Add CHANGELOG and LICENSE to released package + +------------------------------------------------------------------- Old: ---- 2.9.0.tar.gz New: ---- 2.10.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-spotipy.spec ++++++ --- /var/tmp/diff_new_pack.lK3SJp/_old 2020-03-26 23:35:25.006821460 +0100 +++ /var/tmp/diff_new_pack.lK3SJp/_new 2020-03-26 23:35:25.010821461 +0100 @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-spotipy -Version: 2.9.0 +Version: 2.10.0 Release: 0 Summary: Client for the Spotify Web API License: MIT ++++++ 2.9.0.tar.gz -> 2.10.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/.github/workflows/pythonapp.yml new/spotipy-2.10.0/.github/workflows/pythonapp.yml --- old/spotipy-2.9.0/.github/workflows/pythonapp.yml 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/.github/workflows/pythonapp.yml 2020-03-18 21:39:26.000000000 +0100 @@ -22,6 +22,7 @@ pip install -r requirements.txt - name: Lint with flake8 run: | + pip install -Iv enum34==1.1.6 # https://bitbucket.org/stoneleaf/enum34/issues/27/enum34-118-broken pip install flake8 flake8 . --count --show-source --statistics - name: Run unit tests diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/.gitignore new/spotipy-2.10.0/.gitignore --- old/spotipy-2.9.0/.gitignore 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/.gitignore 2020-03-18 21:39:26.000000000 +0100 @@ -30,7 +30,6 @@ htmlcov/ .tox/ .coverage -.cache nosetests.xml coverage.xml @@ -52,5 +51,8 @@ # Sphinx documentation docs/_build/ +# Spotipy tokens +.cache + .* archive \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/CHANGELOG.md new/spotipy-2.10.0/CHANGELOG.md --- old/spotipy-2.9.0/CHANGELOG.md 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/CHANGELOG.md 2020-03-18 21:39:26.000000000 +0100 @@ -6,6 +6,17 @@ ## [Unreleased] +## [2.10.0] - 2020-03-18 + +### Added + + - Support for `add_to_queue` + - **Parameters:** + - track uri, id, or url + - device id. If None, then the active device is used. + - Add CHANGELOG and LICENSE to released package + + ## [2.9.0] - 2020-02-15 ### Added @@ -180,4 +191,4 @@ Repackaged for saner imports ## [1.0.0] - 2017-04-05 -Initial release \ No newline at end of file +Initial release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/MANIFEST.in new/spotipy-2.10.0/MANIFEST.in --- old/spotipy-2.9.0/MANIFEST.in 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/MANIFEST.in 2020-03-18 21:39:26.000000000 +0100 @@ -1,2 +1,2 @@ -include *.txt +include *.txt *.md recursive-include docs *.txt diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/README.md new/spotipy-2.10.0/README.md --- old/spotipy-2.9.0/README.md 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/README.md 2020-03-18 21:39:26.000000000 +0100 @@ -2,7 +2,7 @@ ##### A light weight Python library for the Spotify Web API -![Tests](https://github.com/plamere/spotipy/workflows/Tests/badge.svg) [![Documentation Status](https://readthedocs.org/projects/spotipy/badge/?version=latest)](https://spotipy.readthedocs.io/en/latest/?badge=latest) +![Tests](https://github.com/plamere/spotipy/workflows/Tests/badge.svg?branch=master) [![Documentation Status](https://readthedocs.org/projects/spotipy/badge/?version=latest)](https://spotipy.readthedocs.io/en/latest/?badge=latest) ## Documentation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/examples/multiple_accounts.py new/spotipy-2.10.0/examples/multiple_accounts.py --- old/spotipy-2.9.0/examples/multiple_accounts.py 1970-01-01 01:00:00.000000000 +0100 +++ new/spotipy-2.10.0/examples/multiple_accounts.py 2020-03-18 21:39:26.000000000 +0100 @@ -0,0 +1,10 @@ +import spotipy +import spotipy.util as util + +from pprint import pprint + +while True: + username = input("Type the Spotify user ID to use: ") + token = util.prompt_for_user_token(username, show_dialog=True) + sp = spotipy.Spotify(token) + pprint(sp.me()) \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/examples/player.py new/spotipy-2.10.0/examples/player.py --- old/spotipy-2.9.0/examples/player.py 1970-01-01 01:00:00.000000000 +0100 +++ new/spotipy-2.10.0/examples/player.py 2020-03-18 21:39:26.000000000 +0100 @@ -0,0 +1,21 @@ +import spotipy +from spotipy.oauth2 import SpotifyOAuth +from pprint import pprint +from time import sleep + +scope = "user-read-playback-state,user-modify-playback-state" +sp = spotipy.Spotify(client_credentials_manager=SpotifyOAuth(scope=scope)) + +# Shows playing devices +res = sp.devices() +pprint(res) + +# Change track +sp.start_playback(uris=['spotify:track:6gdLoMygLsgktydTQ71b15']) + +# Change volume +sp.volume(100) +sleep(2) +sp.volume(50) +sleep(2) +sp.volume(100) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/examples/simple4.py new/spotipy-2.10.0/examples/simple4.py --- old/spotipy-2.9.0/examples/simple4.py 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/examples/simple4.py 2020-03-18 21:39:26.000000000 +0100 @@ -1,7 +1,7 @@ import spotipy -import os from pprint import pprint + def main(): spotify = spotipy.Spotify(auth_manager=spotipy.SpotifyOAuth()) me = spotify.me() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/setup.py new/spotipy-2.10.0/setup.py --- old/spotipy-2.9.0/setup.py 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/setup.py 2020-03-18 21:39:26.000000000 +0100 @@ -5,7 +5,7 @@ setup( name='spotipy', - version='2.9.0', + version='2.10.0', description='A light weight Python library for the Spotify Web API', long_description=long_description, long_description_content_type="text/markdown", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/spotipy/client.py new/spotipy-2.10.0/spotipy/client.py --- old/spotipy-2.9.0/spotipy/client.py 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/spotipy/client.py 2020-03-18 21:39:26.000000000 +0100 @@ -81,7 +81,8 @@ :param auth_manager: SpotifyOauth object or SpotifyClientCredentials object :param proxies: - Definition of proxies (optional) + Definition of proxies (optional). + See Requests doc https://2.python-requests.org/en/master/user/advanced/#proxies :param requests_timeout: Tell Requests to stop waiting for a response after a given number of seconds @@ -187,39 +188,22 @@ if args: kwargs.update(args) retries = self.max_get_retries - delay = 1 + delay = 0 while retries > 0: try: return self._internal_call("GET", url, payload, kwargs) except SpotifyException as e: retries -= 1 + delay += 1 status = e.http_status - # 429 means we hit a rate limit, backoff - if status == 429 or (status >= 500 and status < 600): - if retries < 0: - raise - else: - sleep_seconds = int( - e.headers.get("Retry-After", delay) - ) - print("retrying ..." + str(sleep_seconds) + "secs") - time.sleep(sleep_seconds + 1) - delay += 1 - else: - raise - except Exception as e: - raise - print("exception", str(e)) - # some other exception. Requests have - # been know to throw a BadStatusLine exception - retries -= 1 - if retries >= 0: - sleep_seconds = int(e.headers.get("Retry-After", delay)) - print("retrying ..." + str(delay) + "secs") - time.sleep(sleep_seconds + 1) - delay += 1 - else: + # 429 means we hit a rate limit, back-off + if not (status == 429 or status >= 500 and status < 600): raise + sleep_seconds = int( + e.headers.get("Retry-After", delay) + ) + print("retrying after..." + str(sleep_seconds) + "secs") + time.sleep(sleep_seconds + 1) def _post(self, url, args=None, payload=None, **kwargs): if args: @@ -278,7 +262,7 @@ """ returns a list of tracks given a list of track IDs, URIs, or URLs Parameters: - - tracks - a list of spotify URIs, URLs or IDs + - tracks - a list of spotify URIs, URLs or IDs. Maximum: 50 IDs. - market - an ISO 3166-1 alpha-2 country code. """ @@ -1048,12 +1032,12 @@ **kwargs ): """ Get a list of recommended tracks for one to five seeds. + (at least one of `seed_artists`, `seed_tracks` and `seed_genres` + are needed) Parameters: - seed_artists - a list of artist IDs, URIs or URLs - - seed_tracks - a list of track IDs, URIs or URLs - - seed_genres - a list of genre names. Available genres for recommendations can be found by calling recommendation_genre_seeds @@ -1307,6 +1291,30 @@ ) ) + def add_to_queue(self, uri, device_id=None): + """ Adds a song to the end of a user's queue + + If device A is currently playing music and you try to add to the queue + and pass in the id for device B, you will get a + 'Player command failed: Restriction violated' error + I therefore reccomend leaving device_id as None so that the active device is targeted + + :param uri: song uri, id, or url + :param device_id: + the id of a Spotify device. + If None, then the active device is used. + + """ + + uri = self._get_uri("track", uri) + + endpoint = "me/player/queue?uri=%s" % uri + + if device_id is not None: + endpoint += "&device_id=%s" % device_id + + return self._post(endpoint) + def _append_device_id(self, path, device_id): """ Append device ID to API path. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/spotipy/oauth2.py new/spotipy-2.10.0/spotipy/oauth2.py --- old/spotipy-2.9.0/spotipy/oauth2.py 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/spotipy/oauth2.py 2020-03-18 21:39:26.000000000 +0100 @@ -105,7 +105,6 @@ as a string. """ if as_dict: - print("") warnings.warn( "You're using 'as_dict = True'." "get_access_token will return the token string directly in future " @@ -114,7 +113,6 @@ DeprecationWarning, stacklevel=2, ) - print("") if self.token_info and not self.is_token_expired(self.token_info): return self.token_info if as_dict else self.token_info["access_token"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spotipy-2.9.0/tests/integration/test_user_endpoints.py new/spotipy-2.10.0/tests/integration/test_user_endpoints.py --- old/spotipy-2.9.0/tests/integration/test_user_endpoints.py 2020-02-15 20:48:21.000000000 +0100 +++ new/spotipy-2.10.0/tests/integration/test_user_endpoints.py 2020-03-18 21:39:26.000000000 +0100 @@ -387,3 +387,8 @@ pl = self.spotify.user_playlist_tracks(None, self.playlist, limit=2) self.assertTrue(len(pl["items"]) == 2) self.assertTrue(pl["total"] > 0) + + def test_devices(self): + # No devices playing by default + res = self.spotify.devices() + self.assertEqual(len(res["devices"]), 0)