* Update playlist endpoints to modern format
Deprecate user_playlist_* in favor of the following replacements:
* user_playlist_change_details -> playlist_change_details
* user_playlist_unfollow -> current_user_unfollow_playlist
* user_playlist_add_tracks -> playlist_add_tracks
* user_playlist_replace_tracks -> playlist_replace_tracks
* user_playlist_reorder_tracks -> playlist_reorder_tracks
* user_playlist_remove_all_occurrences_of_tracks -> playlist_remove_all_occurrences_of_tracks
* user_playlist_remove_specific_occurrences_of_tracks -> playlist_remove_specific_occurrences_of_tracks
* user_playlist_follow_playlist -> current_user_follow_playlist
* user_playlist_is_following -> playlist_is_following
* Add current_user_following_artists and current_user_following_users
* Update tests and examples
Resolve TODO in test_user_endpoints.py > SpotifyFollowApiTests.test_user_follows_and_unfollows_user
Use modern playlist endpoints (no username required) in tests and examples.
* Update changelog
* Deprecate playlist_tracks in favor of playlist_items
* Link deprecated functions to new functions and change tracks to items
* Fix references to playlist_tracks
* Change test_playlist_add_items as requested
* resolve return object formatting issues referened in #526
* resolve comments from @ritiek
* create separate method to search multiple markets
* Use old description again
* market -> markets + fix test
* pep8
* Use break
Co-authored-by: Stephane Bruckert <contact@stephanebruckert.com>
* Add support to search multiple markets. Pass in a list or ALL to search all markets.
* pep8 formatting and verification with flake8
* work on comments from stephanebruckert
* pep8 formatting
* run autopep8 formatting
* fix typo
* allow tuple of markets to be passed. Add unit tests for this case
* Add SpotifyImplicitGrant with get_access_token and get_cached_token (and minimum related functions)
* Add some overlooked necessary methods/values in SpotifyImplicitGrant
* Remove unsuppported functionality and make SpotifyImplicitGrant public
* Allow/Expose integration of SpotifyImplicitGrant in client
* Add Implicit Grant tests and decrease abilities of prompt_for_user_token
Remove Implicit Grant and state support from prompt_for_user_token
* Add documentation and changelog entry
* Touch up PEP8 compliance
* Ignore long line with link for flake8
* Correct changelog
* Restore compatibility with Python 2.7
* Correct help(SpotifyImplicitGrant.get_access_token)
* Remove as_dict from SpotifyImplicitGrant.get_access_token
* Combine status check functionality with implicit grant support
In oauth2.py:
* Add state checking to SpotifyImplicitGrant
* Add dedicated SpotifyStateError as subclass of SpotifyOauthError
* Moved `_get_user_input` from SpotifyOAuth to superclass SpotifyAuthBase
* Renamed `parse_oauth_response_url` to `parse_auth_response_url`
* Moved error handling into `parse_auth_response_url`
Made minor changes in tests and client.py accordingly
* Update changelog
* Trim down tests for SpotifyImplicitGrant
* Fix trailing whitespace
* test_improvements - Add __init__.py files to tests dirs so you can run all tests
* test_improvements - added helpers file, restructured tests to work without previous data and to be grouped with api type
* http_retries - Implement Retry for all requests
* Readme - Update README with contributing info
* PR Feedback - Added CONTRIBUTING.md, fixed README, fixed test
* Auto-refresh AuthCode flow token.
* Reformatted.
* Reformatted.
* Removed invalid syntax.
* Removed abstract class SpotifyAuthManager.
* Fix typo on docstrings.
* Optionally try to fetch main input parameters from environment.
Implements the capability of trying to fetch the following parameters from the environment, when they're not directly passed to the authorization handler.
The affected parameters are: client_id, client_secret, redirect_uri.
An SpotifyOauthError is raised if no value gets found.
* Removed f-string for Python2 compatibility.
* Fix line-too-long.
* Remove useless import.
* Add username to docstring.
* Remove redundant return.
* Fix empty lines print statement for backward compatibility with Python2.
* Update simple4 example.
* Set optional 'as_dict' parameter on OAuth 'get_access_token'.
* Update changelog.
Co-authored-by: Stéphane Bruckert <stephane.bruckert@gmail.com>
* Linting of OAuth2 mod. + update tests to detect core package path
* Tweak imports in tests + update tox ini to ignore Flake8 E501 error
* Tweak tox ini - ignore examples
* Remove `f`-string from OAuth2 mod.
* More import tweaks in core package + tests
* Update flake8 config. in tox ini - set line length limit to 99 chars.
* auto-refresh user token
* example for a long-running user-request app
* wrap long lines
* combine duplicate code into _refresh_token_if_expired method
* add changelog entry
If this excess part isn't trimmed from the ID, it can cause unexpected
results when calling some API methods.
For example; this code now correctly returns all albums for an artist:
```
artist = 'https://open.spotify.com/artist/7oPftvlwr6VrsViSDV7fJY?si=M3PrzRC4TBOZu8YyLYc-tA'
artist_albums = sp.artist_albums(artist)
```
Previously, this code mimicked same behaviour as calling
`spotify.artist`, but now will return albums as expected
with this commit.
Fixes#365 and #323.