{ "info": { "author": "Omar Ryhan", "author_email": "omarryhan@gmail.com", "bugtrack_url": null, "classifiers": [ "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "

\n \"Logo\"\n

\n \"Build\n \"Software\n \"Code\n \"Downloads\"\n \"Monthly\n

\n

\n\n# Welcome \ud83d\udc4b\n\nPyfy is a Sync + Async Pythonic Spotify Client that focuses on ease of use in personal projects and API stability and security for production grade codebases.\n\n## Setup \u2699\ufe0f\n\n```bash\n$ pip install pyfy\n```\n\n## Quick Start \ud83c\udf9b\ufe0f\n\n**Sync:**\n\n```python 3.7\nfrom pyfy import Spotify\n\nspt = Spotify('your_access_token')\n\nspt.play()\nspt.volume(85)\nspt.next()\nspt.pause()\n```\n\n**Async:**\n\n```python 3.7\nimport asyncio\nfrom pyfy import AsyncSpotify\n\nspt = AsyncSpotify('your_access_token')\n\nasync def search():\n return await spt.search('A tout le monde')\n\nsearch_result = asyncio.run(search())\n```\n\n## Getting Started \ud83d\udc69\n\nYou should start by creating client credentials from Spotify's [Developers console](https://developer.spotify.com/dashboard/applications)\n\nNext edit your application's settings and set a Redirect URL. If it's for personal use then set it as:\n\n http://localhost:9000 *Port can be any port of choice, not necessarily 9000*\n\nNext, copy your:\n\n1. Client ID\n2. Client Secret\n3. Redirect URL (That you just set)\n\nNext, figure out the scopes that you think you'll need from here: https://developer.spotify.com/documentation/general/guides/scopes/\n\ne.g. `[\"user-library-modify\", \"app-remote-control\"]`\n\nNext, follow the first authentication scheme from below (it's the one you'll most likely need, unless you're sure otherwise)\n\n## Authentication Schemes \ud83d\udc69\u200d\ud83c\udfa4\n\n### 1. Authorization Code Flow (OAuth2) (recommended)\n\nSuitable if you want to access user-related resources. e.g. user-playlists, user-tracks etc.\n\n[Click here for full working examples with Sanic(async) and Flask(sync)](https://github.com/omarryhan/Pyfy/tree/master/examples)\n\n```python 3\nfrom pyfy import Spotify, ClientCreds, UserCreds, AuthError, ApiError\n\nclient = ClientCreds(\n client_id='clientid',\n client_secret='client_secret',\n redirect_uri='https://localhost:9000\",\n scopes=[\"user-library-modify\", \"app-remote-control\"]\n)\nspt = Spotify(client_creds=client)\n\ndef authorize():\n # Fist step of OAuth, Redirect user to spotify's authorization endpoint\n if spt.is_oauth_ready:\n return redirect(spt.auth_uri())\n\n# Authorization callback\ndef callback(grant):\n try:\n user_creds = spt.build_credentials(grant=grant)\n except AuthError as e:\n abort(401)\n logging.info(e.msg)\n logging.info(e.http_response)\n else:\n db.insert(user_creds)\n return redirect(url_for_home)\n\ndef get_user_tracks():\n try:\n return json.dumps(spt.user_tracks())\n except ApiError:\n abort(500)\n```\n\n### 2. User's Access Token [get from here](https://beta.developer.spotify.com/console/get-current-user/)\n\nSame as the Authorization Code Flow above but without a refresh token. Suitable for quick runs.\n\n```python\nfrom pyfy import Spotify\nspt = Spotify('your access token')\n```\n\n### 3. Client Credentials Flow (OAauth2):\n\nSuitable for when you want to access public information quickly. (Accessing user information is porhibited using this method)\n\n``` python\nfrom pyfy import ClientCreds, Spotify\n\nclient = ClientCreds(client_id=client_id, client_secret=client_secret)\nspt = Spotify(client_creds=client)\nspt.authorize_client_creds()\n```\n\n## API endpoints \ud83c\udf10\n\n**Albums:**\n\n- Get an album\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.albums\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/albums/get-album/\n\n- Get an album's tracks\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.album_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/albums/get-albums-tracks/\n\n- Get several albums\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.albums\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/albums/get-several-albums/\n\n**Artists:**\n\n- Get an artist\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.artists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/artists/get-artist/\n\n- Artist albums\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.artist_albums\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/artists/get-artists-albums/\n\n- Artist top tracks\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.artist_top_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/artists/get-artists-top-tracks/\n\n- Artist related artists\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.artist_related_artists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/artists/get-related-artists/\n\n- Get several artists\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.artists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/artists/get-several-artists/\n\n**Browse:**\n\n- Get a category\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.category\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/browse/get-category/\n\n- Get a category's playlists\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.category_playlist\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/browse/get-categorys-playlists/\n\n- Get list of categories\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.categories\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/browse/get-list-categories/\n\n- Get a list of featured playlists\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.featured_playlists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/browse/get-list-featured-playlists/\n\n- Get a list of new releases\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.new_releases\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/browse/get-list-new-releases/\n\n- Get recommendations based on seeds\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.recommendations\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/browse/get-recommendations/\n\n**Episodes:**\n\n- Get an episode\n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/episodes/get-an-episode/\n\n- Get several episodes\n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/episodes/get-several-episodes/ \n\n**Follow:**\n\n- Check if Current User Follows Artists or Users \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.follows_users\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/follow/check-current-user-follows/\n\n- Check if Users Follow a Playlist \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.follows_playlist\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/follow/check-user-following-playlist/\n\n- Follow Artists\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.follow_artists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/follow/follow-artists-users/\n\n- Follow Users \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.follow_artists\n - Web API reference: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.follow_users\n\n- Follow a playlist\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.follow_playlist\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/follow/follow-playlist/\n\n- Get User's Followed Artists \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.followed_artists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/follow/get-followed/\n\n- Unfollow Artists\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.unfollow_artists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/follow/unfollow-artists-users/\n\n- Unfollow Users\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.unfollow_users\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/follow/unfollow-artists-users/\n\n- Unfollow Playlist\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.unfollow_playlist\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/follow/unfollow-playlist/\n\n**User Library:**\n\n- Check User's Saved Albums \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.owns_albums\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/check-users-saved-albums/\n\n- Check User's Saved Shows \n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/check-users-saved-shows/\n\n- Check User's Saved Tracks \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.owns_tracks\n - Web API reference: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.owns_tracks\n\n- Get Current User's Saved Albums \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.user_albums\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/get-users-saved-albums/\n\n- Get User's Saved Shows\n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/get-users-saved-shows/\n\n- Get a User's Saved Tracks\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.user_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/get-users-saved-tracks/\n\n- Remove Albums for Current User\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.delete_albums\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/remove-albums-user/\n\n- Remove User's Saved Shows \n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/remove-shows-user/\n\n- Remove User's Saved Tracks \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.delete_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/remove-tracks-user/\n\n- Save Albums for Current User \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.save_albums\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/save-albums-user/\n\n- Save Shows for Current User \n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/save-shows-user/\n\n- Save Tracks for User \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.save_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/library/save-tracks-user/\n\n**Personalization:**\n\n- Get a User's Top Artists\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.user_top_artists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/personalization/get-users-top-artists-and-tracks/\n\n- Get a User's Top Tracks\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.artist_top_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/personalization/get-users-top-artists-and-tracks/\n\n**Player:**\n\n- Add an Item to the User's Playback Queue\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.queue\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/add-to-queue/\n\n- Get a User's Available Devices\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.devices\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/get-a-users-available-devices/\n\n- Get Information About The User's Current Playback\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.currently_playing_info\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/get-information-about-the-users-current-playback/\n\n- Get Current User's Recently Played Tracks \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.recently_played_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/get-recently-played/\n\n- Get the User's Currently Playing Track\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.currently_playing\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/get-the-users-currently-playing-track/\n\n- Pause a User's Playback \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.pause\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/pause-a-users-playback/\n\n- Seek To Position In Currently Playing Track \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.seek\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/seek-to-position-in-currently-playing-track/\n\n- Set Repeat Mode On User\u2019s Playback \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.repeat\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/set-repeat-mode-on-users-playback/\n\n- Set Volume For User's Playback\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.volume\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/set-volume-for-users-playback/\n\n- Skip User\u2019s Playback To Next Track\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.next\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/skip-users-playback-to-next-track/\n\n- Skip User\u2019s Playback To Previous Track\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.previous\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/skip-users-playback-to-previous-track/\n\n- Start/Resume a User's Playback\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.play\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/start-a-users-playback/\n\n- Toggle Shuffle For User\u2019s Playback\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.shuffle\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/toggle-shuffle-for-users-playback/\n\n- Transfer a User's Playback\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.playback_transfer\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/player/transfer-a-users-playback/\n\n**Playlists:**\n- Add playlist items:\n - Docs: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.add_playlist_tracks\n - Web API Reference: https://developer.spotify.com/documentation/web-api/reference/playlists/add-tracks-to-playlist/ \n\n- Edit playlist:\n - Pyfy: https://developer.spotify.com/documentation/web-api/reference/playlists/change-playlist-details/\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/change-playlist-details/\n\n- Create playlist:\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.create_playlist\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/create-playlist/\n\n- List a user's playlists:\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.user_playlists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/get-a-list-of-current-users-playlists/\n\n- Playlist cover:\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.playlist_cover\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/get-playlist-cover/\n\n- List a playlist:\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.playlist\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/get-playlist/\n\n- List a playlist items:\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.playlist_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/get-playlists-tracks/\n\n- Remove playlist items:\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.delete_playlist_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/remove-tracks-playlist/\n\n- Reorder playlist items:\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.reorder_playlist_track\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/reorder-playlists-tracks/\n\n- Replace playlist items:\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.replace_playlist_tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/replace-playlists-tracks/\n\n- Upload custom playlist cover image:\n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/upload-custom-playlist-cover/\n\n- List current user playlists:\n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.user_playlists\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/playlists/get-a-list-of-current-users-playlists/\n\n**Search:**\n\n- Search for an item\n - Pyfy: https://developer.spotify.com/documentation/web-api/reference/search/search/\n - Web API reference: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.search\n\n**Shows:**\n\n- Get a Show \n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/shows/get-a-show/\n\n- Get Several Shows \n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/shows/get-several-shows/\n\n- Get a Show's Episodes\n - Pyfy: **TODO**\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/shows/get-shows-episodes/\n\n**Tracks:**\n\n- Get Audio Analysis for a Track \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.track_audio_analysis\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-analysis/\n\n- Get Audio Features for a Track \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.tracks_audio_features\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-features/\n\n- Get Audio Features for Several Tracks \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.tracks_audio_features\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/tracks/get-several-audio-features/\n\n- Get Several Tracks \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/tracks/get-several-tracks/\n\n- Get a Track \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.tracks\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/tracks/get-track/\n\n**Users Profile:**\n\n- Get Current User's Profile \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.user_profile\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/users-profile/get-current-users-profile/\n\n- Get a User's Profile \n - Pyfy: https://pyfy.readthedocs.io/en/latest/#pyfy.sync_client.Spotify.user_profile\n - Web API reference: https://developer.spotify.com/documentation/web-api/reference/users-profile/get-users-profile/\n\n## Pagination \ud83d\udcd6\n\n```python 3\nfrom pyfy import Spotify\n\nuser_creds = {'access_token': '...', 'refresh_token': '....'}\n\nspt = Spotify(user_creds=user_creds)\n\nuser_top_tracks = spt.user_top_tracks(limit=5)\n\nnext_page_1 = spt.next_page(user_top_tracks)\nnext_page_2 = spt.next_page(next_page_1)\n\nprevious_page_1 = spt.previous_page(next_page_2)\nprevious_page_1 === next_page_1 # True\n```\n\n## Documentation \ud83d\udcd1\n\nFor a detailed documentation of Pyfy's API, please visit: https://pyfy.readthedocs.io/en/latest where you'll find:\n\n- Sync client API \ud83c\udfb8: https://pyfy.readthedocs.io/en/latest/#sync-client-api\n\n- Async client API \ud83c\udfbc: https://pyfy.readthedocs.io/en/latest/#async-client-api\n\n- Exceptions API \u26a0\ufe0f: https://pyfy.readthedocs.io/en/latest/#module-pyfy.excs\n\n- Credentials API \ud83d\udcc7: https://pyfy.readthedocs.io/en/latest/#module-pyfy.creds\n\n## Backward Incompatibility Notices\n\n**V2:**\n\n1. Removed `Spotify.oauth_uri` property in favor of `Spotify.auth_uri` method.\n\n2. `Spotify.play()` now accepts, `track_ids`, `artist_ids` etc. instead of `resource_ids` + `resource_names`\n\n3. Oauth2 state handling:\n\n - Removed deprecated `enforce_state_check` functionality\n\n - Removed state attribute from `user_creds`\n\n - Oauth2 state checking is no longer done by Pyfy's client and should be handled manually\n\n## Testing \ud83d\udc69\u200d\ud83d\udd2c:\n\nPlease visit: https://pyfy.readthedocs.io/en/latest/#testing\n\n## Contributors\n\nBig thank you to our amazing contributors:\n\n- [St\u0251rry Shiv\u0251m](https://github.com/starry69)\n- [exofeel](https://github.com/exofeel)\n- [Schiism](https://github.com/Schiism)\n- [kevinhynes](https://github.com/kevinhynes)\n- [haykkh](https://github.com/haykkh)\n- [ykelle](https://github.com/ykelle)\n- [Patrick Arminio](https://github.com/patrick91)\n- [Mustafa](https://github.com/ms7m)\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/omarryhan/pyfy", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "pyfy", "package_url": "https://pypi.org/project/pyfy/", "platform": "", "project_url": "https://pypi.org/project/pyfy/", "project_urls": { "Homepage": "https://github.com/omarryhan/pyfy" }, "release_url": "https://pypi.org/project/pyfy/2.2.0/", "requires_dist": [ "requests", "requests[socks]", "cachecontrol", "aiohttp", "backoff" ], "requires_python": "", "summary": "Sync/Async API wrapper for Spotify's web API", "version": "2.2.0", "yanked": false, "yanked_reason": null }, "last_serial": 11814978, "releases": { "1.1.2": [ { "comment_text": "", "digests": { "md5": "64702bea5881cbf16a3ae6602dd12063", "sha256": "8723fe04ab0028ee5a67c798229ea6299b2eb8e3ca2a32cece48f4045c3cf85b" }, "downloads": -1, "filename": "pyfy-1.1.2.tar.gz", "has_sig": false, "md5_digest": "64702bea5881cbf16a3ae6602dd12063", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40986, "upload_time": "2018-11-12T05:07:40", "upload_time_iso_8601": "2018-11-12T05:07:40.948959Z", "url": "https://files.pythonhosted.org/packages/8c/44/53e560784d5d2d24ed7daf9c6627e1066e7054e84891955a6bd1b3543170/pyfy-1.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "3559e790de497187b0fa17e7345c9027", "sha256": "905c274a66ba23c231553dee1ef8097ea5c83e3019c20520d60ab89d11a3d6c9" }, "downloads": -1, "filename": "pyfy-1.1.3.tar.gz", "has_sig": false, "md5_digest": "3559e790de497187b0fa17e7345c9027", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41056, "upload_time": "2018-11-25T22:35:58", "upload_time_iso_8601": "2018-11-25T22:35:58.699882Z", "url": "https://files.pythonhosted.org/packages/74/42/ac2f30d07771d70eca69cf1bfb9e691c4f8849ef36b602c9bd7fb38fa0be/pyfy-1.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "0a4c145bbc716a4c3d416c134f7c1bbc", "sha256": "eee7d5a078ac81314736355262ccb1bea8f2fff28005c0cf922dc72b99278c27" }, "downloads": -1, "filename": "pyfy-1.2.0.tar.gz", "has_sig": false, "md5_digest": "0a4c145bbc716a4c3d416c134f7c1bbc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41581, "upload_time": "2019-01-21T05:18:28", "upload_time_iso_8601": "2019-01-21T05:18:28.861546Z", "url": "https://files.pythonhosted.org/packages/f8/f6/a7d05de706c3c7114895a39e2888a7ed518385e4f6dfd92ac58254a05090/pyfy-1.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "32c92fbb101e13e975199767aebaa59c", "sha256": "91c852becf46e6fc767d911af6a650d0b59c1ebd40952c0da3ba68af1e9e6713" }, "downloads": -1, "filename": "pyfy-1.2.1.tar.gz", "has_sig": false, "md5_digest": "32c92fbb101e13e975199767aebaa59c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41546, "upload_time": "2019-03-07T22:56:57", "upload_time_iso_8601": "2019-03-07T22:56:57.111507Z", "url": "https://files.pythonhosted.org/packages/9c/3f/710aa5ae3c956fb792384b9407c81b7a5d2cdbdc22e7961b38389c9f9163/pyfy-1.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "b80793abf0cbb92e79d76b931ef4547e", "sha256": "04d3665fbfb1bdff99f25bd1d89b3db47c95ce8edb5f2a2e7293fc4c0b65092a" }, "downloads": -1, "filename": "pyfy-1.2.2.tar.gz", "has_sig": false, "md5_digest": "b80793abf0cbb92e79d76b931ef4547e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41536, "upload_time": "2019-04-01T16:26:09", "upload_time_iso_8601": "2019-04-01T16:26:09.571637Z", "url": "https://files.pythonhosted.org/packages/c4/2e/f672287bec7b1d0900b7086b30ef3bd4139b27b7e7f86376964d86224ba3/pyfy-1.2.2.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "b6fbd3a6fc5bf530b9a1c4e8104c1485", "sha256": "8d246086f0868a564f957e94ed1deb3d385f3d7642768f216c4c5c7f1c4577c5" }, "downloads": -1, "filename": "pyfy-1.2.3.tar.gz", "has_sig": false, "md5_digest": "b6fbd3a6fc5bf530b9a1c4e8104c1485", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40347, "upload_time": "2019-05-22T00:15:08", "upload_time_iso_8601": "2019-05-22T00:15:08.494870Z", "url": "https://files.pythonhosted.org/packages/bf/1b/4062513b1bd3596a71c612f62f93813b77da66e32325877318b102c3778d/pyfy-1.2.3.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "e384fa77682f4de353b1e13a277e1a23", "sha256": "71ce325daede75ccef0c2ace17253d4148f11e34ed541f260af4b6d5b15a297e" }, "downloads": -1, "filename": "pyfy-2.0.0.tar.gz", "has_sig": false, "md5_digest": "e384fa77682f4de353b1e13a277e1a23", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40469, "upload_time": "2019-05-26T08:29:23", "upload_time_iso_8601": "2019-05-26T08:29:23.967811Z", "url": "https://files.pythonhosted.org/packages/4d/f3/484a3a61d7497a8f1bba986a134493932a6bbe5770bda90414216f04a86d/pyfy-2.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "793950011d9889feddbfe0fc6c0afc47", "sha256": "7c3c772ccf4791e2f115165e59ab046e3180e442504e635ea65dde53a7962efd" }, "downloads": -1, "filename": "pyfy-2.0.1.tar.gz", "has_sig": false, "md5_digest": "793950011d9889feddbfe0fc6c0afc47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40488, "upload_time": "2019-05-26T11:45:50", "upload_time_iso_8601": "2019-05-26T11:45:50.506915Z", "url": "https://files.pythonhosted.org/packages/90/8a/ab08a92910854073de4498fd237f26ab49f42b8764a1de5c87db56ca14d8/pyfy-2.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "70ed1c73389c00d0f7494596a4381e4b", "sha256": "5e3c4390bf1c714d172989fd8e842c5008e7938c85d3ea24d8234332c7288cfe" }, "downloads": -1, "filename": "pyfy-2.0.2.tar.gz", "has_sig": false, "md5_digest": "70ed1c73389c00d0f7494596a4381e4b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40301, "upload_time": "2019-06-13T12:58:14", "upload_time_iso_8601": "2019-06-13T12:58:14.499308Z", "url": "https://files.pythonhosted.org/packages/66/09/725e1d068bf5c8193254035d4321447b85ab5c72c14c2d8ab3eedd94e94c/pyfy-2.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "26e06caf8549ee2a3e3fc0e7c6a85858", "sha256": "8d9a883a583c9ebb2f5c4facb30f9466df7efd54db38ea326ea29521aaea2750" }, "downloads": -1, "filename": "pyfy-2.0.3.tar.gz", "has_sig": false, "md5_digest": "26e06caf8549ee2a3e3fc0e7c6a85858", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40600, "upload_time": "2019-10-29T17:43:24", "upload_time_iso_8601": "2019-10-29T17:43:24.243232Z", "url": "https://files.pythonhosted.org/packages/2d/a8/4887536bb56e3a4059ee95d780ba85497b5570be896ebe29f9c75db6438b/pyfy-2.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.4": [ { "comment_text": "", "digests": { "md5": "eb18741dcc4079370ff44bede8834718", "sha256": "9c9d64c42d961f672b8703532fe0ad6edae2bfac2a85232116a8071b24fea26a" }, "downloads": -1, "filename": "pyfy-2.0.4.tar.gz", "has_sig": false, "md5_digest": "eb18741dcc4079370ff44bede8834718", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40702, "upload_time": "2019-10-30T19:31:10", "upload_time_iso_8601": "2019-10-30T19:31:10.016253Z", "url": "https://files.pythonhosted.org/packages/9a/2a/7717bf86ebf2dd4fcd2b53d4e8fd50be0737e717ce220f020808cebb4c38/pyfy-2.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.5": [ { "comment_text": "", "digests": { "md5": "d71d30435340ccadbbe16168cff2bcb8", "sha256": "7962b4f0746e36684edf3b69d3b06a03de64a8da7b53de60c79a76939e88ab39" }, "downloads": -1, "filename": "pyfy-2.0.5.tar.gz", "has_sig": false, "md5_digest": "d71d30435340ccadbbe16168cff2bcb8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40497, "upload_time": "2020-03-15T21:24:23", "upload_time_iso_8601": "2020-03-15T21:24:23.908413Z", "url": "https://files.pythonhosted.org/packages/fd/ad/ff0b42275353dc12850eaefc0c6f50ea09de7696d47ed5d47ed9d2f40ffc/pyfy-2.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.6": [ { "comment_text": "", "digests": { "md5": "1eb1d78dcf634245e1181392906f6bec", "sha256": "e77e1c674025af591f6b17e894a311597adf3110a8938b841ac11a17cdd2e998" }, "downloads": -1, "filename": "pyfy-2.0.6.tar.gz", "has_sig": false, "md5_digest": "1eb1d78dcf634245e1181392906f6bec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40516, "upload_time": "2020-03-16T15:07:51", "upload_time_iso_8601": "2020-03-16T15:07:51.696730Z", "url": "https://files.pythonhosted.org/packages/15/57/3b6afa3d93213934d597bce9a9b1946e6ae0907b725eeb2b17541db0747b/pyfy-2.0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.7": [ { "comment_text": "", "digests": { "md5": "d37a9a043501f084ec81117045983f94", "sha256": "4d96d456e9d79c70b85e703ebbc75d917658b4aee9c277fe1783711c8a549f94" }, "downloads": -1, "filename": "pyfy-2.0.7.tar.gz", "has_sig": false, "md5_digest": "d37a9a043501f084ec81117045983f94", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40683, "upload_time": "2020-03-17T17:02:04", "upload_time_iso_8601": "2020-03-17T17:02:04.673526Z", "url": "https://files.pythonhosted.org/packages/37/4d/46b20bb1a03c5cc933e66d35a074ef1cc942d8662fbf927515a0224a09fb/pyfy-2.0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.8": [ { "comment_text": "", "digests": { "md5": "c5bf3f8cacabed89215476a2ecc44aac", "sha256": "e31e6adf1cffc0b32d6cd0542c7b616a1cd18b1e08ab904998d6b894bf0edaf9" }, "downloads": -1, "filename": "pyfy-2.0.8.tar.gz", "has_sig": false, "md5_digest": "c5bf3f8cacabed89215476a2ecc44aac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49961, "upload_time": "2020-11-10T16:01:01", "upload_time_iso_8601": "2020-11-10T16:01:01.040975Z", "url": "https://files.pythonhosted.org/packages/c4/65/0c776d2c713a2888c57b99ee1632f75ebad005d5d58365720dae05f8a990/pyfy-2.0.8.tar.gz", "yanked": false, "yanked_reason": null } ], "2.0.9": [ { "comment_text": "", "digests": { "md5": "8c788f1a511df8c50ecbb8c76dd74d53", "sha256": "3757517cb3576709cdefc311c25df8bcd377a92bf8d86ac8d6f7ab30f20e82c9" }, "downloads": -1, "filename": "pyfy-2.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "8c788f1a511df8c50ecbb8c76dd74d53", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 57465, "upload_time": "2021-08-01T17:27:52", "upload_time_iso_8601": "2021-08-01T17:27:52.265361Z", "url": "https://files.pythonhosted.org/packages/91/4c/7c308aecd11f319b0ce36da44bbfedb71e7e7d040881b8262580535f118b/pyfy-2.0.9-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "422dfd54d36ea2a28c7a57969c1582f4", "sha256": "8fcb710b43cea3db46ec23065b210a52e7eebbf87b0f0dff7e5db7bc46239cd4" }, "downloads": -1, "filename": "pyfy-2.0.9.tar.gz", "has_sig": false, "md5_digest": "422dfd54d36ea2a28c7a57969c1582f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50752, "upload_time": "2021-08-01T17:27:54", "upload_time_iso_8601": "2021-08-01T17:27:54.112202Z", "url": "https://files.pythonhosted.org/packages/e9/a2/553939540348d9950444dfe4d526c587a4ca9dfcfeb4bce79a6844bff33f/pyfy-2.0.9.tar.gz", "yanked": false, "yanked_reason": null } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "5d9001879a7c0a6e2ae79690845f31cd", "sha256": "50a382bca252e579060a038027ac146d89a41ecc3e2d43538b225dd02781027f" }, "downloads": -1, "filename": "pyfy-2.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5d9001879a7c0a6e2ae79690845f31cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 57475, "upload_time": "2021-08-15T12:41:44", "upload_time_iso_8601": "2021-08-15T12:41:44.339304Z", "url": "https://files.pythonhosted.org/packages/b8/66/74cc81ef255ebc366841e5e99ba6afdd2e63889ca5e2cbed4d70e3f0436f/pyfy-2.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "5cf55dc115ffb2773e4f3919280f5606", "sha256": "f39b22f30c4e9f58e04f94c4c93fec352ff552b1398c54b2fdf0db72cb1a8aa8" }, "downloads": -1, "filename": "pyfy-2.1.0.tar.gz", "has_sig": false, "md5_digest": "5cf55dc115ffb2773e4f3919280f5606", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50771, "upload_time": "2021-08-15T12:41:45", "upload_time_iso_8601": "2021-08-15T12:41:45.804263Z", "url": "https://files.pythonhosted.org/packages/9a/ca/c4364a45f005ab9dacabe78b08339cd4e8d0a612e6965e244928c8b73c7e/pyfy-2.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "2.2.0": [ { "comment_text": "", "digests": { "md5": "53a788ba3d1ff88e8ba14abfe40b5e61", "sha256": "e1ebdf3aaef20169e2520da1ac8e42cb013e14afbba846dc44ecca21e2e52299" }, "downloads": -1, "filename": "pyfy-2.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "53a788ba3d1ff88e8ba14abfe40b5e61", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 57522, "upload_time": "2021-10-24T09:42:49", "upload_time_iso_8601": "2021-10-24T09:42:49.716598Z", "url": "https://files.pythonhosted.org/packages/a5/30/dd50f42f61a1ac00c30806c2a5fab80c1b162eefa5423e8b924d1f93ac4d/pyfy-2.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4076bf3bdc3730785bdcf88955ac9e36", "sha256": "d61c7426c76a458179b01ed2d4a905dc7c26c07afb67dd2a656057eea7dd6e59" }, "downloads": -1, "filename": "pyfy-2.2.0.tar.gz", "has_sig": false, "md5_digest": "4076bf3bdc3730785bdcf88955ac9e36", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49637, "upload_time": "2021-10-24T09:42:51", "upload_time_iso_8601": "2021-10-24T09:42:51.460884Z", "url": "https://files.pythonhosted.org/packages/9c/db/b1e5647faecd5943d78b5db9a1d4e9e0103c3f025f46e2d539ea11c1609b/pyfy-2.2.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "53a788ba3d1ff88e8ba14abfe40b5e61", "sha256": "e1ebdf3aaef20169e2520da1ac8e42cb013e14afbba846dc44ecca21e2e52299" }, "downloads": -1, "filename": "pyfy-2.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "53a788ba3d1ff88e8ba14abfe40b5e61", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 57522, "upload_time": "2021-10-24T09:42:49", "upload_time_iso_8601": "2021-10-24T09:42:49.716598Z", "url": "https://files.pythonhosted.org/packages/a5/30/dd50f42f61a1ac00c30806c2a5fab80c1b162eefa5423e8b924d1f93ac4d/pyfy-2.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4076bf3bdc3730785bdcf88955ac9e36", "sha256": "d61c7426c76a458179b01ed2d4a905dc7c26c07afb67dd2a656057eea7dd6e59" }, "downloads": -1, "filename": "pyfy-2.2.0.tar.gz", "has_sig": false, "md5_digest": "4076bf3bdc3730785bdcf88955ac9e36", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 49637, "upload_time": "2021-10-24T09:42:51", "upload_time_iso_8601": "2021-10-24T09:42:51.460884Z", "url": "https://files.pythonhosted.org/packages/9c/db/b1e5647faecd5943d78b5db9a1d4e9e0103c3f025f46e2d539ea11c1609b/pyfy-2.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }