All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Add your changes below.
- Added unit tests for queue functions
- Added detailed function docstrings to 'util.py', including descriptions and special sections that lists arguments, returns, and raises.
- Updated order of instructions for Python and pip package manager installation in TUTORIAL.md
- Updated TUTORIAL.md instructions to match current layout of Spotify Developer Dashboard
- Added test_artist_id, test_artist_url, and test_artists_mixed_ids to non_user_endpoints test.py
- Added rate/request limit to FAQ
- Added custom
urllib3.Retry
class for printing a warning when a rate/request limit is reached. - Added
personalized_playlist.py
,track_recommendations.py
, andaudio_features_analysis.py
to/examples
. - Discord badge in README
- Added
SpotifyBaseException
and moved all exceptions toexceptions.py
- Audiobook integration tests
- Edited docstrings for certain functions in client.py for functions that are no longer in use and have been replaced.
current_user_unfollow_playlist()
now supports playlist IDs, URLs, and URIs rather than previously where it only supported playlist IDs.
mock
no longer listed as a test dependency. Only built-inunittest.mock
is actually used.
- Added
MemcacheCacheHandler
, a cache handler that stores the token info using pymemcache. - Added support for audiobook endpoints:
get_audiobook
,get_audiobooks
, andget_audiobook_chapters
. - Added integration tests for audiobook endpoints.
- Added
update
field tocurrent_user_follow_playlist
.
- Fixed error obfuscation when Spotify class is being inherited and an error is raised in the Child's
__init__
- Replaced
artist_albums(album_type=...)
withartist_albums(include_groups=...)
due to an API change. - Updated
_regex_spotify_url
to ignore/intl-<countrycode>
in Spotify links - Improved README, docs and examples
- Readthedocs build
- Split
test_current_user_save_and_usave_tracks
unit test
- Drop support for EOL Python 3.7
- Added optional
encoder_cls
argument toCacheFileHandler
, which overwrite default encoder for token before writing to disk - Integration tests for searching multiple types in multiple markets (non-user endpoints)
- Publish to PyPI action
- Fixed the regex for matching playlist URIs with the format spotify:user:USERNAME:playlist:PLAYLISTID.
search_markets
now factors the counts of all types in thetotal
rather than just the first type (#534)
- Add alternative module installation instruction to README
- Added Comment to README - Getting Started for user to add URI to app in Spotify Developer Dashboard.
- Added playlist_add_tracks.py to example folder
- Modified docstring for playlist_add_items() to accept "only URIs or URLs", with intended deprecation for IDs in v3
- Path traversal vulnerability that may lead to type confusion in URI handling code
- Update contributing.md
- Integration tests via GHA (non-user endpoints)
- Unit tests for new releases, passing limit parameter with minimum and maximum values of 1 and 50
- Unit tests for categories, omitting country code to test global releases
- Added
CODE_OF_CONDUCT.md
- Incorrect
category_id
input for test_category - Assertion value for
test_categories_limit_low
andtest_categories_limit_high
- Pin GitHub Actions Runner to Ubuntu 20 for Py27
- Fixed potential error where
found
variable intest_artist_related_artists
is undefined if for loop never evaluates to true - Fixed false positive test
test_new_releases
which looks up the wrong property of the JSON response object and always evaluates to true
- Added
market
parameter toalbum
andalbums
to address (#753 - Added
show_featured_artists.py
to/examples
. - Expanded contribution and license sections of the documentation.
- Added
FlaskSessionCacheHandler
, a cache handler that stores the token info in a flask session. - Added Python 3.10 in GitHub Actions
- Updated the documentation to specify ISO-639-1 language codes.
- Fix
AttributeError
fortext
attribute of theResponse
object - Require redis v3 if python2.7 (fixes readthedocs)
- Added
RedisCacheHandler
, a cache handler that stores the token info in Redis. - Changed URI handling in
client.Spotify._get_id()
to remove queries if provided by error. - Added a new parameter to
RedisCacheHandler
to allow custom keys (instead of the defaulttoken_info
key) - Simplify check for existing token in
RedisCacheHandler
- Removed Python 3.5 and added Python 3.9 in GitHub Action
- Added
MemoryCacheHandler
, a cache handler that simply stores the token info in memory as an instance attribute of this class. - If a network request returns an error status code but the response body cannot be decoded into JSON, then fall back on decoding the body into a string.
- Added
DjangoSessionCacheHandler
, a cache handler that stores the token in the session framework provided by Django. Web apps using spotipy with Django can directly use this for cache handling.
- Fixed a bug in
CacheFileHandler.__init__
: The documentation says that the username will be retrieved from the environment, but it wasn't. - Fixed a bug in the initializers for the auth managers that produced a spurious warning message if you provide a cache handler, and you set a value for the "SPOTIPY_CLIENT_USERNAME" environment variable.
- Use generated MIT license and fix license type in
pip show
- Enabled using both short and long IDs for playlist_change_details
- Added a cache handler to
SpotifyClientCredentials
- Added the following endpoints
Spotify.current_user_saved_episodes
Spotify.current_user_saved_episodes_add
Spotify.current_user_saved_episodes_delete
Spotify.current_user_saved_episodes_contains
Spotify.available_markets
- Add support for a list of scopes rather than just a comma separated string of scopes
- Fixed the bugs in
SpotifyOAuth.refresh_access_token
andSpotifyPKCE.refresh_access_token
which raised the incorrect exception upon receiving an error response from the server. This addresses #645. - Fixed a bug in
RequestHandler.do_GET
in which the non-existentstate
attribute ofSpotifyOauthError
is accessed. This bug occurs when the user clicks "cancel" in the permissions dialog that opens in the browser. - Cleaned up the documentation for
SpotifyClientCredentials.__init__
,SpotifyOAuth.__init__
, andSpotifyPKCE.__init__
.
allowed_methods
requires urllib3>=1.26.0
- moved os.remove(session_cache_path()) inside try block to avoid TypeError on app.py example file
- A warning will no longer be emitted when the cache file does not exist at the specified path
- The docs for the
auth
parameter ofSpotify.init
use the term "access token" instead of "authorization token" - Changed docs for
search
to mention that you can provide multiple types to search for - The query parameters of requests are now logged
- Deprecate specifying
cache_path
orusername
directly toSpotifyOAuth
,SpotifyPKCE
, andSpotifyImplicitGrant
constructors, instead directing users to use theCacheFileHandler
cache handler - Removed requirement for examples/app.py to specify port multiple times (only SPOTIPY_REDIRECT_URI needs to contain the port)
- Added log messages for when the access and refresh tokens are retrieved and when they are refreshed
- Support
market
optional parameter intrack
- Added CacheHandler abstraction to allow users to cache tokens in any way they see fit
- Fixed Spotify.user_playlist_reorder_tracks calling Spotify.playlist_reorder_tracks with an incorrect parameter order
- Fixed deprecated Urllib3
Retry(method_whitelist=...)
in favor ofRetry(allowed_methods=...)
- playlist_tracks example code no longer prints extra characters on final loop iteration
- SpotifyException now thrown when a request fails & has no response (#571, #581)
- Added scope,
playlist-read-private
, to examples that access user playlists using the spotipy api: current_user_playlists() (#591) - Enable retries for POST, DELETE, PUT (#577)
- both inline and starting import lists are sorted using
isort
module - changed Max Retries exception code from 599 to 429
open_browser
can be passed to the constructors ofSpotifyOAuth
andSpotifyPKCE
to make it easier to authorize in browserless environments
SpotifyPKCE.parse_auth_response_url
, mirroring that method inSpotifyOAuth
- Specifying a cache_path or username is now optional
- Using
SpotifyPKCE.get_authorization_url
will now generate a code challenge if needed
- (experimental) Support to search multiple/all markets at once.
- Support to test whether the current user is following certain users or artists
- Proper replacements for all deprecated playlist endpoints (See https://developer.spotify.com/community/news/2018/06/12/changes-to-playlist-uris/ and below)
- Allow for OAuth 2.0 authorization by instructing the user to open the URL in a browser instead of opening the browser.
- Reason for 403 error in SpotifyException
- Support for the PKCE Auth Flow
- Support to advertise different language to Spotify
- Added 'collaborative' parameter to user_playlist_create method.
- Enforce CHANGELOG update on PR
- Adds
additional_types
parameter to retrieve currently playing podcast episode - Support to get info about a single category
user_playlist_change_details
in favor ofplaylist_change_details
user_playlist_unfollow
in favor ofcurrent_user_unfollow_playlist
user_playlist_add_tracks
in favor ofplaylist_add_items
user_playlist_replace_tracks
in favor ofplaylist_replace_items
user_playlist_reorder_tracks
in favor ofplaylist_reorder_items
user_playlist_remove_all_occurrences_of_tracks
in favor ofplaylist_remove_all_occurrences_of_items
user_playlist_remove_specific_occurrences_of_tracks
in favor ofplaylist_remove_specific_occurrences_of_items
user_playlist_follow_playlist
in favor ofcurrent_user_follow_playlist
user_playlist_is_following
in favor ofplaylist_is_following
playlist_tracks
in favor ofplaylist_items
- fixed issue where episode URIs were being converted to track URIs in playlist calls
- Added
SpotifyImplicitGrant
as an auth manager option. It provides user authentication without a client secret but sacrifices the ability to refresh the token without user input. (However, read the class docstring for security advisory.) - Added built-in verification of the
state
query parameter - Added two new attributes: error and error_description to
SpotifyOauthError
exception class to show authorization/authentication web api errors details. - Added
SpotifyStateError
subclass ofSpotifyOauthError
- Allow extending
SpotifyClientCredentials
andSpotifyOAuth
- Added the market parameter to
album_tracks
- Deprecated
util.prompt_for_user_token
in favor ofspotipy.Spotify(auth_manager=SpotifyOAuth())
- Added a method to update the auth token.
- Logging regression due to the addition of
logging.basicConfig()
which was unneeded.
-
Updated the documentation to give more details on the authorization process and reflect 2020 Spotify Application jargon and practices.
-
The local webserver is only started for localhost redirect_uri which specify a port, i.e. it is started for
http://localhost:8080
orhttp://127.0.0.1:8080
, not forhttp://localhost
.
- Issue where using
http://localhost
as redirect_uri would cause the authorization process to hang.
- Fixed miscellaneous issues with parsing of callback URL
- Support for shows/podcasts and episodes
- Added CONTRIBUTING.md
- Client retry logic has changed as it now uses urllib3's
Retry
in conjunction with requestsSession
- The session is customizable as it allows for:
- status_forcelist
- retries
- status_retries
- backoff_factor
- Spin up a local webserver to autofill authentication URL
- Use session in SpotifyAuthBase
- Logging used instead of print statements
- Close session when Spotipy object is unloaded
- Propagate refresh token error
- Support for
add_to_queue
- Parameters:
- track uri, id, or url
- device id. If None, then the active device is used.
- Parameters:
- Add CHANGELOG and LICENSE to released package
- Support
position_ms
optional parameter instart_playback
- Add
requests_timeout
parameter to authentication methods - Make cache optional in
get_access_token
- Support for
playlist_cover_image
- Support
after
andbefore
parameter incurrent_user_recently_played
- CI for unit tests
- Automatic
token
refresh auth_manager
andoauth_manager
optional parameters added toSpotify
's init.- Optional
username
parameter to be passed toSpotifyOAuth
, to infer acache_path
automatically - Optional
as_dict
parameter to controlSpotifyOAuth
'sget_access_token
output type. However, this is going to be deprecated in the future, and the method will always return a token string - Optional
show_dialog
parameter to be passed toSpotifyOAuth
- Both
SpotifyClientCredentials
andSpotifyOAuth
inherit from a commonSpotifyAuthBase
which handles common parameters and logics.
- PyPi release mistake without pulling last merge first
- Support for
playlist_tracks
- Support for
playlist_upload_cover_image
user_playlist_tracks
doesn't require a user anymore (acceptsNone
)
- Deprecated
user_playlist
anduser_playlist_tracks
- Fixed broken doc in 2.6.2
- Fixed broken examples in README, examples and doc
- Allow session keepalive
- Bump requests to 2.20.0
- Fixed inconsistent behaviour with some API methods when a full HTTP URL is passed.
- Fixed invalid calls to logging warn method
mock
no longer needed for install. Only used intox
.
- Support for
playlist
to get a playlist without specifying a user - Support for
current_user_saved_albums_delete
- Support for
current_user_saved_albums_contains
- Support for
user_unfollow_artists
- Support for
user_unfollow_users
- Lint with flake8 using GitHub action
- Fix typos in doc
- Start following SemVer properly
- Made instructions in the CONTRIBUTING.md file more clear such that it is easier to onboard and there are no conflicts with TUTORIAL.md
Added follow and player endpoints
Python 3 fix
Fixed proxy issue in standard auth flow
Support getting audio features for a single track
Incorporated proxy support
Incorporated a number of PRs
Added recs, audio features, user top lists
Added current_user_followed_artists
Support for offset/limit with album_tracks API
Fixed bug in auto retry logic
Added client credential flow
Added auto retry logic
Added session support added by akx.
Added support for user_playlist_tracks
Added support for new_releases and featured_playlists
Moved to spotipy at pypi
Upgraded APIs and docs to make it be a real library
Added playlist replace and remove methods. Added auth tests. Improved API docs
Upgraded version number to take precedence over previously botched release (sigh)
Refactored util out of examples and into the main package
Support for "Your Music" tracks (add, delete, get), with examples
Support for related artists' endpoint. Don't use cache auth codes when scope changes
Added show tracks.py example
Fixed JSON handling issue
Removed dependency on simplejson
Initial public release.
Added support for retrieving starred playlists
Updates to match released API
Repackaged for saner imports
Initial release