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.
- spotifywebapipython/const.py +1 -1
- spotifywebapipython/docs/__init__.html +15 -3
- spotifywebapipython/docs/index.html +2 -2
- spotifywebapipython/docs/search.js +1 -1
- spotifywebapipython/docs/spotifywebapipython/const.html +3 -3
- spotifywebapipython/docs/spotifywebapipython/saappmessages.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/sautils.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifyapierror.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifyapimessage.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifyauthtoken.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifyclient.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifydiscovery.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifymediatypes.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifytypeprefixes.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifywebapiauthenticationerror.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifywebapierror.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifywebplayertoken.html +2 -2
- spotifywebapipython/spotifyclient.py +1 -1
- spotifywebapipython/spotifyconnect/spotifyconnectdirectorytask.py +10 -0
- spotifywebapipython/zeroconfapi/zeroconfconnect.py +164 -8
- {spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/METADATA +1 -1
- {spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/RECORD +25 -25
- {spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/LICENSE +0 -0
- {spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/WHEEL +0 -0
- {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":
|
|
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' (
|
|
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
|
|
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' (
|
|
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' (
|
|
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,36 +1,36 @@
|
|
|
1
1
|
spotifywebapipython/__init__.py,sha256=ka7F2AsT-UU7KSYKBnfgl5Trojcep5aQspLutg8D-2k,1306
|
|
2
|
-
spotifywebapipython/const.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
18
|
-
spotifywebapipython/docs/search.js,sha256=
|
|
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=
|
|
22
|
-
spotifywebapipython/docs/spotifywebapipython/saappmessages.html,sha256=
|
|
23
|
-
spotifywebapipython/docs/spotifywebapipython/sautils.html,sha256=
|
|
24
|
-
spotifywebapipython/docs/spotifywebapipython/spotifyapierror.html,sha256=
|
|
25
|
-
spotifywebapipython/docs/spotifywebapipython/spotifyapimessage.html,sha256=
|
|
26
|
-
spotifywebapipython/docs/spotifywebapipython/spotifyauthtoken.html,sha256=
|
|
27
|
-
spotifywebapipython/docs/spotifywebapipython/spotifyclient.html,sha256=
|
|
28
|
-
spotifywebapipython/docs/spotifywebapipython/spotifydiscovery.html,sha256=
|
|
29
|
-
spotifywebapipython/docs/spotifywebapipython/spotifymediatypes.html,sha256=
|
|
30
|
-
spotifywebapipython/docs/spotifywebapipython/spotifytypeprefixes.html,sha256=
|
|
31
|
-
spotifywebapipython/docs/spotifywebapipython/spotifywebapiauthenticationerror.html,sha256=
|
|
32
|
-
spotifywebapipython/docs/spotifywebapipython/spotifywebapierror.html,sha256=
|
|
33
|
-
spotifywebapipython/docs/spotifywebapipython/spotifywebplayertoken.html,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
141
|
-
spotifywebapipython-1.0.
|
|
142
|
-
spotifywebapipython-1.0.
|
|
143
|
-
spotifywebapipython-1.0.
|
|
144
|
-
spotifywebapipython-1.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
{spotifywebapipython-1.0.289.dist-info → spotifywebapipython-1.0.291.dist-info}/top_level.txt
RENAMED
|
File without changes
|