spotifywebapiPython 1.0.289__py3-none-any.whl → 1.0.291__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. spotifywebapipython/const.py +1 -1
  2. spotifywebapipython/docs/__init__.html +15 -3
  3. spotifywebapipython/docs/index.html +2 -2
  4. spotifywebapipython/docs/search.js +1 -1
  5. spotifywebapipython/docs/spotifywebapipython/const.html +3 -3
  6. spotifywebapipython/docs/spotifywebapipython/saappmessages.html +2 -2
  7. spotifywebapipython/docs/spotifywebapipython/sautils.html +2 -2
  8. spotifywebapipython/docs/spotifywebapipython/spotifyapierror.html +2 -2
  9. spotifywebapipython/docs/spotifywebapipython/spotifyapimessage.html +2 -2
  10. spotifywebapipython/docs/spotifywebapipython/spotifyauthtoken.html +2 -2
  11. spotifywebapipython/docs/spotifywebapipython/spotifyclient.html +2 -2
  12. spotifywebapipython/docs/spotifywebapipython/spotifydiscovery.html +2 -2
  13. spotifywebapipython/docs/spotifywebapipython/spotifymediatypes.html +2 -2
  14. spotifywebapipython/docs/spotifywebapipython/spotifytypeprefixes.html +2 -2
  15. spotifywebapipython/docs/spotifywebapipython/spotifywebapiauthenticationerror.html +2 -2
  16. spotifywebapipython/docs/spotifywebapipython/spotifywebapierror.html +2 -2
  17. spotifywebapipython/docs/spotifywebapipython/spotifywebplayertoken.html +2 -2
  18. spotifywebapipython/spotifyclient.py +1 -1
  19. spotifywebapipython/spotifyconnect/spotifyconnectdirectorytask.py +10 -0
  20. spotifywebapipython/zeroconfapi/zeroconfconnect.py +164 -8
  21. {spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/METADATA +1 -1
  22. {spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/RECORD +25 -25
  23. {spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/LICENSE +0 -0
  24. {spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/WHEEL +0 -0
  25. {spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/top_level.txt +0 -0
@@ -586,7 +586,7 @@ class ZeroconfConnect:
586
586
  _logsi.LogMethodParmList(SILevel.Verbose, "Issuing Spotify Connect Zeroconf addUser request (ip=%s:%s)" % (self._HostIpAddress, self._HostIpPort), apiMethodParms)
587
587
 
588
588
  # set request endpoint.
589
- endpoint:str = self.GetEndpoint('addUser')
589
+ endpoint:str = self.GetEndpoint('addUser', info.Version)
590
590
 
591
591
  # set request headers.
592
592
  reqHeaders:dict = {
@@ -677,6 +677,35 @@ class ZeroconfConnect:
677
677
  # get authorization_code access token.
678
678
  blob:str = self._GetSpotifyConnectAuthorizationCodeToken(info, loginId=loginId)
679
679
 
680
+ # special processing for tokenType "accesstoken":
681
+ elif info.TokenType == 'accesstoken':
682
+
683
+ # trace.
684
+ _logsi.LogVerbose("Spotify Connect token type is '%s' - using Spotify Desktop Client OAuth2 token to connect: '%s' (ip=%s)" % (info.TokenType, info.RemoteName, self._HostIpAddress))
685
+
686
+ # validations.
687
+ if (loginId is None) or (not isinstance(loginId,str)):
688
+ raise SpotifyApiError(SAAppMessages.MSG_SPOTIFY_ACTIVATE_CREDENTIAL_REQUIRED % ("SpotifyConnectLoginId"), logsi=_logsi)
689
+ if (username is None) or (not isinstance(username,str)):
690
+ raise SpotifyApiError(SAAppMessages.MSG_SPOTIFY_ACTIVATE_CREDENTIAL_REQUIRED % ("SpotifyConnectUsername"), logsi=_logsi)
691
+ if (password is None) or (not isinstance(password,str)):
692
+ raise SpotifyApiError(SAAppMessages.MSG_SPOTIFY_ACTIVATE_CREDENTIAL_REQUIRED % ("SpotifyConnectPassword"), logsi=_logsi)
693
+
694
+ # create credentials and builder objects.
695
+ credentials:Credentials = Credentials(username, password, AuthenticationTypes.SPOTIFY_TOKEN)
696
+ builder = BlobBuilder(credentials, info.DeviceId, info.PublicKey)
697
+
698
+ # set defaults used by token type "accesstoken".
699
+ # - use clientKey from getInfo response.
700
+ # - exclude origin device information from the addUser request.
701
+ # - use tokenType from getInfo response.
702
+ clientKey = info.ClientId or ''
703
+ includeOriginDeviceInfo = False
704
+ tokenType = info.TokenType
705
+
706
+ # get access token.
707
+ blob:str = self._GetSpotifyConnectAccessToken(info, loginId=loginId)
708
+
680
709
  else:
681
710
 
682
711
  # trace.
@@ -713,7 +742,7 @@ class ZeroconfConnect:
713
742
  # set request parameters.
714
743
  reqData={
715
744
  "action": "addUser",
716
- "version": self.Version, # info.Version,
745
+ "version": info.Version or self.Version,
717
746
  "tokenType": tokenType,
718
747
  "clientKey": clientKey,
719
748
  "loginId": loginId or '', # canonical login id (e.g. "31l77fd87g8h9j00k89f07jf87ge")
@@ -740,7 +769,7 @@ class ZeroconfConnect:
740
769
 
741
770
  # trace.
742
771
  _logsi.LogDictionary(SILevel.Debug, "ZeroconfConnect http request: '%s' (headers)" % (endpoint), reqHeaders)
743
- _logsi.LogDictionary(SILevel.Verbose, "ZeroconfConnect http request: '%s' (data)" % (endpoint), reqData)
772
+ _logsi.LogDictionary(SILevel.Verbose, "ZeroconfConnect http request: '%s' (json dict)" % (endpoint), reqData, prettyPrint=True)
744
773
 
745
774
  # The 10 second connect timeout prevents the application from hanging when
746
775
  # attempting to connect to an unreachable IP address.
@@ -771,6 +800,129 @@ class ZeroconfConnect:
771
800
  _logsi.LeaveMethod(SILevel.Debug, apiMethodName)
772
801
 
773
802
 
803
+ def _GetSpotifyConnectAccessToken(
804
+ self,
805
+ info:ZeroconfGetInfo,
806
+ loginId:str,
807
+ ) -> str:
808
+ """
809
+ Get the Spotify OAuth2 access token value.
810
+ The resulting token will be used as the `blob` argument for the Spotify Connect Zeroconf `addUser` request.
811
+ """
812
+ apiMethodName:str = '_GetSpotifyConnectAccessToken'
813
+ apiMethodParms:SIMethodParmListContext = None
814
+ tracePrefix:str = 'SpotifyConnectAccessToken exchange'
815
+
816
+ # the access token is loaded from the token storage file (e.g. `spotifyplus_tokens.json`, etc).
817
+ # if not found, then an exception will be raised to indicate there is no access token stored.
818
+ # if found, the token is then checked to see if it has expired, and is automatically refreshed if so.
819
+ # the "access_token" value is then returned, and passed on the Spotify Connect Zeroconf "adduser"
820
+ # call as the "blob" parameter (e.g. `AuthenticationTypes.SPOTIFY_TOKEN`).
821
+
822
+ try:
823
+
824
+ # trace.
825
+ apiMethodParms = _logsi.EnterMethodParmList(SILevel.Debug, apiMethodName)
826
+ apiMethodParms.AppendKeyValue("loginId", loginId)
827
+ apiMethodParms.AppendKeyValue("info.DeviceId", info.DeviceId)
828
+ apiMethodParms.AppendKeyValue("info.RemoteName", info.RemoteName)
829
+ apiMethodParms.AppendKeyValue("info.BrandDisplayName", info.BrandDisplayName)
830
+ apiMethodParms.AppendKeyValue("info.ModelDisplayName", info.ModelDisplayName)
831
+ apiMethodParms.AppendKeyValue("self.TokenAuthInBrowser", self.TokenAuthInBrowser)
832
+ _logsi.LogMethodParmList(SILevel.Verbose, "Preparing to generate a new access token for Spotify Connect device: '%s' (%s)" % (info.RemoteName, info.DeviceId), apiMethodParms)
833
+
834
+ # set variables for spotify access token generation.
835
+ # the redirect uri variables were obtained via Fiddler trace using Spotify Desktop App to initiate Spotify Connect to device.
836
+ redirectUriHost:str = '127.0.0.1'
837
+ redirectUriPort:str = 4381
838
+ redirectUriPath:str = '/login'
839
+ authorizationType:str = 'Authorization Code PKCE'
840
+
841
+ # Spotify Desktop App scopes requested for Spotify Connect (streaming only as of 2024/08/13)
842
+ SPOTIFY_SCOPES:list = \
843
+ [
844
+ 'streaming',
845
+ ]
846
+
847
+ # create oauth provider for spotify authentication code with pkce.
848
+ _logsi.LogVerbose('creating OAuth2 provider for Spotify Authentication Code with PKCE')
849
+ authClient:AuthClient = AuthClient(
850
+ authorizationType=authorizationType,
851
+ authorizationUrl=SPOTIFY_API_AUTHORIZE_URL,
852
+ tokenUrl=SPOTIFY_API_TOKEN_URL,
853
+ scope=SPOTIFY_SCOPES,
854
+ clientId=SPOTIFY_DESKTOP_APP_CLIENT_ID,
855
+ tokenStorageDir=self.TokenStorageDir,
856
+ tokenStorageFile=self.TokenStorageFile,
857
+ tokenProviderId='SpotifyWebApiAuthCodePkce',
858
+ tokenProfileId=loginId,
859
+ )
860
+
861
+ # raise an exception if the authorization token is not present, or the scope has changed.
862
+ # the user must create the authorization token outside of this process, as the Spotify
863
+ # authorization token is driven by responding to a web request for access using OAuth.
864
+ # as this process is running on a server, there is no way for the user to respond to the
865
+ # request (e.g. via browser nor command-line).
866
+ isAuthorized = authClient.IsAuthorized
867
+ _logsi.LogVerbose('Checking OAuth2 authorization status: IsAuthorized=%s' % isAuthorized)
868
+
869
+ if (isAuthorized == False):
870
+
871
+ # can the user interact with a local default browser to authorize the request?
872
+ if self.TokenAuthInBrowser:
873
+
874
+ # at this point, we need a new authorization token.
875
+ # the user has up to 2 minutes to respond to the request by copying / pasting the
876
+ # message / auth approval url from the system log into a browser window that is
877
+ # running on the local machine.
878
+ _logsi.LogVerbose('Preparing to retrieve a new OAuth2 authorization access token')
879
+ authClient.AuthorizeWithServer(
880
+ host=redirectUriHost,
881
+ port=redirectUriPort,
882
+ redirect_uri_path=redirectUriPath,
883
+ open_browser=True,
884
+ timeout_seconds=120
885
+ )
886
+
887
+ else:
888
+
889
+ # user cannot approve the request - raise an exception.
890
+ raise SpotifyZeroconfApiError(401, 'Spotify Desktop Client Application access token was not authorized', apiMethodName, 'Token Not Authorized', _logsi)
891
+
892
+ else:
893
+
894
+ _logsi.LogVerbose('OAuth2 authorization token has previously been authorized')
895
+
896
+ # process results.
897
+ oauth2token:dict = authClient.Session.token
898
+ authToken = SpotifyAuthToken(authClient.AuthorizationType, authClient.TokenProfileId, root=oauth2token)
899
+
900
+ # does token need to be refreshed?
901
+ if authToken.IsExpired:
902
+
903
+ # refresh the token.
904
+ # this will also store the refreshed token to disk to be used later if required.
905
+ _logsi.LogVerbose('OAuth2 authorization token has expired, or is about to; token will be refreshed')
906
+ oauth2token:dict = authClient.RefreshToken()
907
+ authToken = SpotifyAuthToken(authClient.AuthorizationType, authClient.TokenProfileId, root=oauth2token)
908
+ _logsi.LogObject(SILevel.Verbose, TRACE_METHOD_RESULT % apiMethodName, authToken, excludeNonPublic=True)
909
+
910
+ else:
911
+
912
+ _logsi.LogVerbose('OAuth2 authorization token has not expired')
913
+
914
+ # get access token value.
915
+ result = oauth2token.get("access_token", None)
916
+
917
+ # return access token to caller.
918
+ return result
919
+
920
+ finally:
921
+
922
+ # trace.
923
+ _logsi.LeaveMethod(SILevel.Debug, apiMethodName)
924
+
925
+
774
926
  def _GetSpotifyConnectAuthorizationCodeToken(
775
927
  self,
776
928
  info:ZeroconfGetInfo,
@@ -803,7 +955,7 @@ class ZeroconfConnect:
803
955
  _logsi.LogMethodParmList(SILevel.Verbose, "Preparing to generate a new authorization_code access token for Spotify Connect device: '%s' (%s)" % (info.RemoteName, info.DeviceId), apiMethodParms)
804
956
 
805
957
  # set variables for spotify authorization_code token generation.
806
- # the redirecy uri variables were obtained via Fiddler trace using Spotify Desktop App to initiate Spotify Connect to device.
958
+ # the redirect uri variables were obtained via Fiddler trace using Spotify Desktop App to initiate Spotify Connect to device.
807
959
  redirectUriHost:str = '127.0.0.1'
808
960
  redirectUriPort:str = 4381
809
961
  redirectUriPath:str = '/login'
@@ -918,7 +1070,7 @@ class ZeroconfConnect:
918
1070
  # trace.
919
1071
  _logsi.LogVerbose('Exchanging OAuth2 authorization access token for an authorization_code access token')
920
1072
  _logsi.LogDictionary(SILevel.Debug, "%s http request: '%s' (headers)" % (tracePrefix, SPOTIFY_API_TOKEN_URL), tokHeaders)
921
- _logsi.LogDictionary(SILevel.Verbose, "%s http request: '%s' (data)" % (tracePrefix, SPOTIFY_API_TOKEN_URL), tokData)
1073
+ _logsi.LogDictionary(SILevel.Verbose, "%s http request: '%s' (json dict)" % (tracePrefix, SPOTIFY_API_TOKEN_URL), tokData, prettyPrint=True)
922
1074
 
923
1075
  # execute spotify access token request.
924
1076
  response = requests.post(
@@ -1109,7 +1261,7 @@ class ZeroconfConnect:
1109
1261
  "action": "resetUsers",
1110
1262
  "version": self.Version,
1111
1263
  }
1112
- _logsi.LogDictionary(SILevel.Verbose, "ZeroconfConnect http request: '%s' (data)" % (endpoint), reqData)
1264
+ _logsi.LogDictionary(SILevel.Verbose, "ZeroconfConnect http request: '%s' (json dict)" % (endpoint), reqData, prettyPrint=True)
1113
1265
 
1114
1266
  # execute spotify zeroconf api request.
1115
1267
  response = requests.post(
@@ -1202,7 +1354,8 @@ class ZeroconfConnect:
1202
1354
 
1203
1355
  def GetEndpoint(
1204
1356
  self,
1205
- action:str
1357
+ action:str,
1358
+ version:str|None=None,
1206
1359
  ) -> str:
1207
1360
  """
1208
1361
  Gets a Spotify Zeroconf API endpoint uri.
@@ -1210,6 +1363,9 @@ class ZeroconfConnect:
1210
1363
  Args:
1211
1364
  action (str):
1212
1365
  Action parameter value (e.g. "getInfo", "addUser", "resetUsers", etc).
1366
+ version (str):
1367
+ Version parameter value (e.g. "2.7.1", "2.9.0", etc).
1368
+ For some devices, this is important and must match what is returned on the getInfo request!
1213
1369
 
1214
1370
  Returns:
1215
1371
  A string containing the endpoint.
@@ -1217,7 +1373,7 @@ class ZeroconfConnect:
1217
1373
  return "{uri}?action={action}&version={version}".format(
1218
1374
  uri=self._Uri,
1219
1375
  action=action,
1220
- version=self.Version,
1376
+ version=version or self.Version,
1221
1377
  )
1222
1378
 
1223
1379
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spotifywebapipython
3
- Version: 1.0.289
3
+ Version: 1.0.291
4
4
  Summary: Spotify Web API Python3 Library
5
5
  Author: Todd Lucas
6
6
  Author-email: <thlucas@yahoo.com>
@@ -1,36 +1,36 @@
1
1
  spotifywebapipython/__init__.py,sha256=ka7F2AsT-UU7KSYKBnfgl5Trojcep5aQspLutg8D-2k,1306
2
- spotifywebapipython/const.py,sha256=6q8hXDRbRsFImRQZOMxSxpWHJ3qBzaO75oGsnIBnyvM,4100
2
+ spotifywebapipython/const.py,sha256=9rxbLXDJzw59PqLGMStvH0LkKUskUKJIzK6NZIPobv8,4100
3
3
  spotifywebapipython/saappmessages.py,sha256=mVprjpd5CdD8kYeAkLzRvMvIQPmaYtH4UCP5my3QhSk,5065
4
4
  spotifywebapipython/sautils.py,sha256=LZF3UvxaBK35WIg1hO37nbW8j1y-M-oOxRbi1dPR39w,8746
5
5
  spotifywebapipython/spotifyapierror.py,sha256=23_CYlxWN0BceYYCLpBpunl55vEwPr_wFf34l74xzeA,1855
6
6
  spotifywebapipython/spotifyapimessage.py,sha256=wCnW8jYMLS3x9kjyXPgXXZqaf1HeMTTXzU8u_Dm5pfA,8447
7
7
  spotifywebapipython/spotifyauthtoken.py,sha256=iVg2Pa5mfMqYe4qgc5H8td6JzJlaDqk4vMEhH5LmtfI,9289
8
- spotifywebapipython/spotifyclient.py,sha256=2ZNeq8Ts2BvBBCB1Ktnq74dMa_KUbMqSPUNrRHKJ5cQ,928610
8
+ spotifywebapipython/spotifyclient.py,sha256=jkC2ewbsamh_YNfc0rhWLDk3Z1eaw9rmspVkxmdhH_Y,928610
9
9
  spotifywebapipython/spotifydiscovery.py,sha256=cyysxl8PQj9yGHVbaqhSF3SStlrp-NvfGAudM-dDmg0,20290
10
10
  spotifywebapipython/spotifymediatypes.py,sha256=hMjkxhbfTtks0_P8BKmY7qg3EmB2zhH3RT0DbEpb_2s,1628
11
11
  spotifywebapipython/spotifytypeprefixes.py,sha256=3yfpxKF7jF694qBuo-PbKYvm70YwwdBoGj9enOpWsAg,1375
12
12
  spotifywebapipython/spotifywebapiauthenticationerror.py,sha256=5A0MKvYo3Ypv0ZeSSfLHuFLwzoUUu044bBoUgMfNXNw,3940
13
13
  spotifywebapipython/spotifywebapierror.py,sha256=ctYFvkBPlFFEoM_geP6hzwTyC2mPcrYR_zCCNvsmpwc,3870
14
14
  spotifywebapipython/spotifywebplayertoken.py,sha256=axj1j1lM7COiiZfpElkJRdnk4AmE6bAQcjKshUIz1Nk,35813
15
- spotifywebapipython/docs/__init__.html,sha256=OCHcyOCJnVMenwqoVwEOc6bTRipOvxXoeQbOgmcCO5w,198047
15
+ spotifywebapipython/docs/__init__.html,sha256=OX7Z3pRXsrJcE4dBZRfUTH7FlNbO2VQ0Q5s-rA6IhcY,198988
16
16
  spotifywebapipython/docs/codecopy.js,sha256=ryuoZwLIL03YitjjFzn49UO5ta7-OBos6LNA3qHhFzs,3120
17
- spotifywebapipython/docs/index.html,sha256=zLysGOx8QSypT1OVFGBPfVrRQmjZRV-a_sqhZQODmF4,48779
18
- spotifywebapipython/docs/search.js,sha256=St8jC3-blXEixZW1UGzamEP8KYD-IHTi1Cwsl-ufWYQ,9266834
17
+ spotifywebapipython/docs/index.html,sha256=9ZmFtMMTnfqR4NkitgtGJmsuW2l9GV1mJ6os-aYIoIw,48779
18
+ spotifywebapipython/docs/search.js,sha256=KcFmbSXBMAfALhzhRUwaTIRPxITkF2ivdOmvnHzARUY,9270564
19
19
  spotifywebapipython/docs/spotifywebapipython.ico,sha256=YImj39fqqSPSuB2-sMDlUYDd6YwRfQeJRtq4FjwWglg,16410
20
20
  spotifywebapipython/docs/spotifywebapipython_OLD.ico,sha256=YIv5LjcD4bTIJQSOr8jjwbWaeB3QkElRwkTOePiGbZo,14904
21
- spotifywebapipython/docs/spotifywebapipython/const.html,sha256=z8Pwbp4KAgRrczw7NiHvOgIuwOf6hQri-AjPRMwBW2E,60537
22
- spotifywebapipython/docs/spotifywebapipython/saappmessages.html,sha256=apkwmkh_GX0hed8VZ6YDhpbanxBTxQbQSgDa7yEUUhU,62358
23
- spotifywebapipython/docs/spotifywebapipython/sautils.html,sha256=PgwlvUCrO_170gLabuqhXYjBZB5g-cLd0FPyfLJOd_o,62031
24
- spotifywebapipython/docs/spotifywebapipython/spotifyapierror.html,sha256=bS1FNnjlkpnqwY-p_NeayY0JEncb248wiU1e9Hk37fg,48054
25
- spotifywebapipython/docs/spotifywebapipython/spotifyapimessage.html,sha256=JtSoDUt0UUs-Gkg7v_dmg1_rXhb1U-o44rTq_sh42x0,59210
26
- spotifywebapipython/docs/spotifywebapipython/spotifyauthtoken.html,sha256=hnQrfu_NqBqIb4giFxzBwPCxyg8LU_uX7w4_M-9z_go,59256
27
- spotifywebapipython/docs/spotifywebapipython/spotifyclient.html,sha256=66poT0FvYL_k2LESBFB1XQAcIpwnCFVh33lFdE4BkKQ,1677607
28
- spotifywebapipython/docs/spotifywebapipython/spotifydiscovery.html,sha256=YqRH3_f4lqUxf6hCyu8d8KJ5dKS6F-Jj-CVlz86X5gg,57662
29
- spotifywebapipython/docs/spotifywebapipython/spotifymediatypes.html,sha256=64rEBnefUE5ONGlm2Vv7nF_6GkYFauKOzWw9BXPamaI,51532
30
- spotifywebapipython/docs/spotifywebapipython/spotifytypeprefixes.html,sha256=MrX-XTuvo1McnRnLEFvhiFLSa6m1UkFW2I8n34eBgG0,52401
31
- spotifywebapipython/docs/spotifywebapipython/spotifywebapiauthenticationerror.html,sha256=J4KZZKdfs7XOKab4iPwwaz8YP2zKpX65ZCYWzYo-yUw,52174
32
- spotifywebapipython/docs/spotifywebapipython/spotifywebapierror.html,sha256=1MBsgUeuV6lq1DWketWRF4LOD9Fj-eLYVpk3qCr7ajw,51484
33
- spotifywebapipython/docs/spotifywebapipython/spotifywebplayertoken.html,sha256=ROdAbP5gfsKgsSmHSgT7o5Vw0phaagS3WowMAZoHlfg,62204
21
+ spotifywebapipython/docs/spotifywebapipython/const.html,sha256=PS0xTZ34rhZubp1VAaBjjv2Mjf3JGWAoum4lmiHv_hk,60537
22
+ spotifywebapipython/docs/spotifywebapipython/saappmessages.html,sha256=raoXyKvcqByUSpSvg5_pOMGMoOT98zcpftn-cmlemfY,62358
23
+ spotifywebapipython/docs/spotifywebapipython/sautils.html,sha256=Q5W9gw4WcY1XLUTPEgN56ECzAa_CBMMdC7qH785c2KQ,62031
24
+ spotifywebapipython/docs/spotifywebapipython/spotifyapierror.html,sha256=7z-HLVGR2P2fwkcbRa7Kz5r0eA-odNKuFckzeZ4uTyw,48054
25
+ spotifywebapipython/docs/spotifywebapipython/spotifyapimessage.html,sha256=uLgREDOLTsL6F_4FK9o4c7O2wObx4_alu1xkgt-h5zk,59210
26
+ spotifywebapipython/docs/spotifywebapipython/spotifyauthtoken.html,sha256=VfwPlgMxAySKKpvkp251sJNU2G4oB9PkhHiKktiB68U,59256
27
+ spotifywebapipython/docs/spotifywebapipython/spotifyclient.html,sha256=1nyFxawfaYQWnFaDSN_jz6qLSVZJVr-LfMnXbl1U36g,1677607
28
+ spotifywebapipython/docs/spotifywebapipython/spotifydiscovery.html,sha256=_vzsXcHeKt-EWYuh6lhzS8XSBjgK09hsSpxH_tAlyYY,57662
29
+ spotifywebapipython/docs/spotifywebapipython/spotifymediatypes.html,sha256=Ww9rwoFzo_fIOpFDRZRtjzwkDLu1pT6dCxdJMV6j83Y,51532
30
+ spotifywebapipython/docs/spotifywebapipython/spotifytypeprefixes.html,sha256=swnWdRAYQlg8LyF1c6mszS-lRGSoCkmF7U7PHxHTZ7A,52401
31
+ spotifywebapipython/docs/spotifywebapipython/spotifywebapiauthenticationerror.html,sha256=NzuEKI_dRNulmxcaIjCUl1XtVjR2kadYfRq7p7AijEs,52174
32
+ spotifywebapipython/docs/spotifywebapipython/spotifywebapierror.html,sha256=gYmQbrluxncvtp7burBIdyrCkOWgh6_C4YiUPZ-HirM,51484
33
+ spotifywebapipython/docs/spotifywebapipython/spotifywebplayertoken.html,sha256=7lUnYtwT-eXg7EYThoU0KZd1jHX7amol1JVmA-fRKf4,62204
34
34
  spotifywebapipython/models/__init__.py,sha256=RwRQhUX-6EUs8XvStVFpR8EPwoqIAz9K6ref-28qHKI,4423
35
35
  spotifywebapipython/models/album.py,sha256=U3Pdw0-EL33LdkeiN31fjZ23rlLk6DNGV8jRmZU7EyQ,5170
36
36
  spotifywebapipython/models/albumpagesaved.py,sha256=SBYMhkh5ZsMrRAXl-cm9zsxMDh8gO190ENq6Py2TyGY,2417
@@ -110,7 +110,7 @@ spotifywebapipython/oauthcli/__init__.py,sha256=K37XTxYAKT0n8otCNzWbjgJ10fAPN4WL
110
110
  spotifywebapipython/oauthcli/authclient.py,sha256=qGKa4FLBHHZQyP5ho1sIM_mNmyshQd720YwKcUFQJAw,56207
111
111
  spotifywebapipython/spotifyconnect/__init__.py,sha256=9Xl5KiJFvWLbsdb4YQ0xmF67i36ybpXCCXrWeNsKEvc,1108
112
112
  spotifywebapipython/spotifyconnect/spotifyconnectdeviceeventargs.py,sha256=35hKa0FAaPgy7W8D6MFXmga667pjwXITo8jSj1TDfE8,1988
113
- spotifywebapipython/spotifyconnect/spotifyconnectdirectorytask.py,sha256=QXNpJSqUGuOYxCzvDH63Ka9L9Yo7Bb5iVBRtDhc4ILE,153923
113
+ spotifywebapipython/spotifyconnect/spotifyconnectdirectorytask.py,sha256=Lfaek_fB2UgM1cYmDz8DNLUXcGHJywLYt7EG4ONzLoc,154671
114
114
  spotifywebapipython/spotifyconnect/spotifyconnectzeroconfcastapptask.py,sha256=tCjqU7ubtfzBENdvqwVB0pMDGHRY_0u6N5OYlI5hbj8,23368
115
115
  spotifywebapipython/spotifyconnect/spotifyconnectzeroconfcastcontroller.py,sha256=e2wLmFq4393IdVa51w8X5UQl4KfnHRh34DMlxZfl9-g,34218
116
116
  spotifywebapipython/spotifyconnect/spotifyconnectzeroconfcastlistener.py,sha256=k_Lw52CqNliCrfqMP6s_BHynqHYBOf_NwdrJru6qDFA,16707
@@ -132,13 +132,13 @@ spotifywebapipython/zeroconfapi/credentials.py,sha256=MIXqZvFNDjoICpZGNXPveHNl9G
132
132
  spotifywebapipython/zeroconfapi/cryptodiffiehellman.py,sha256=k-nMR68GtzODYsQrwCpvFE2XNxv-XUFbMemplldtwp4,3340
133
133
  spotifywebapipython/zeroconfapi/helpers.py,sha256=9lJFOuKYrk-e7SbU94WmFv5oiBq4k5gMS8wE1it4Wbc,1429
134
134
  spotifywebapipython/zeroconfapi/spotifyzeroconfapierror.py,sha256=rTwIrr1qV0UiQS_zBufboyZ3A3yGrdCsTAOiVA5dvzY,3031
135
- spotifywebapipython/zeroconfapi/zeroconfconnect.py,sha256=DDuVljjg_SF_YJWWQjmCSG-6-93YBSTCLhjr77DI5xI,70266
135
+ spotifywebapipython/zeroconfapi/zeroconfconnect.py,sha256=CypMdxMg2GxlXAnkjHh7kQHrtUUxt_RzIlHh9IOSj9A,79016
136
136
  spotifywebapipython/zeroconfapi/zeroconfgetinfo.py,sha256=APayso_F7lCsdzzrkescgd-nKukUah3Kjfs-5F2tnvU,21415
137
137
  spotifywebapipython/zeroconfapi/zeroconfgetinfoalias.py,sha256=FZJM23HIPJSfhXIC3-EuS1XhawheoG5maSp7__k4yBo,2932
138
138
  spotifywebapipython/zeroconfapi/zeroconfgetinfodrmmediaformat.py,sha256=c5uk8ljsIuBK3w2jahHKQuoWvm245LOjUBitetXx5Mo,2347
139
139
  spotifywebapipython/zeroconfapi/zeroconfresponse.py,sha256=mAPIDj5MG53x8peiScrp7OJblwy_o_Sto4wqE0rGujU,6445
140
- spotifywebapipython-1.0.289.dist-info/LICENSE,sha256=KGcc9g0zwqNLcWnSn_ezv1UtKyhMENFhvtixpxUPNsE,1177
141
- spotifywebapipython-1.0.289.dist-info/METADATA,sha256=rZ0Y-1PyNMsKsvXKjppoFUAnM8i58jBcBgnc5bxsOGA,11644
142
- spotifywebapipython-1.0.289.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
143
- spotifywebapipython-1.0.289.dist-info/top_level.txt,sha256=jTBLFlijKTesYh2dteAz4vb17qjaqWKeDjpnnwTcrjs,20
144
- spotifywebapipython-1.0.289.dist-info/RECORD,,
140
+ spotifywebapipython-1.0.291.dist-info/LICENSE,sha256=KGcc9g0zwqNLcWnSn_ezv1UtKyhMENFhvtixpxUPNsE,1177
141
+ spotifywebapipython-1.0.291.dist-info/METADATA,sha256=7JA6EKAqbQ6RKhUnyJ0w5nx5sJUdLcLa3Ooui-9egz8,11644
142
+ spotifywebapipython-1.0.291.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
143
+ spotifywebapipython-1.0.291.dist-info/top_level.txt,sha256=jTBLFlijKTesYh2dteAz4vb17qjaqWKeDjpnnwTcrjs,20
144
+ spotifywebapipython-1.0.291.dist-info/RECORD,,