spotifywebapiPython 1.0.129__py3-none-any.whl → 1.0.130__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.
Potentially problematic release.
This version of spotifywebapiPython might be problematic. Click here for more details.
- {spotifywebapiPython-1.0.129.dist-info → spotifywebapiPython-1.0.130.dist-info}/METADATA +1 -1
- {spotifywebapiPython-1.0.129.dist-info → spotifywebapiPython-1.0.130.dist-info}/RECORD +22 -22
- spotifywebapipython/const.py +4 -1
- spotifywebapipython/docs/__init__.html +8 -2
- spotifywebapipython/docs/index.html +2 -2
- spotifywebapipython/docs/search.js +1 -1
- spotifywebapipython/docs/spotifywebapipython/const.html +20 -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 +51 -51
- spotifywebapipython/docs/spotifywebapipython/spotifydiscovery.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifywebapiauthenticationerror.html +2 -2
- spotifywebapipython/docs/spotifywebapipython/spotifywebapierror.html +2 -2
- spotifywebapipython/models/playerplaystate.py +19 -0
- spotifywebapipython/spotifyclient.py +135 -135
- spotifywebapipython/zeroconfapi/zeroconfconnect.py +1 -1
- {spotifywebapiPython-1.0.129.dist-info → spotifywebapiPython-1.0.130.dist-info}/LICENSE +0 -0
- {spotifywebapiPython-1.0.129.dist-info → spotifywebapiPython-1.0.130.dist-info}/WHEEL +0 -0
- {spotifywebapiPython-1.0.129.dist-info → spotifywebapiPython-1.0.130.dist-info}/top_level.txt +0 -0
|
@@ -2391,141 +2391,6 @@ class SpotifyClient:
|
|
|
2391
2391
|
_logsi.LeaveMethod(SILevel.Debug, apiMethodName)
|
|
2392
2392
|
|
|
2393
2393
|
|
|
2394
|
-
def GetCoverImageFile(
|
|
2395
|
-
self,
|
|
2396
|
-
imageUrl:Union[str,list],
|
|
2397
|
-
outputPath:str,
|
|
2398
|
-
desiredWidth:int=None,
|
|
2399
|
-
) -> None:
|
|
2400
|
-
"""
|
|
2401
|
-
Gets the contents of an image url and transfers the contents to the local file system.
|
|
2402
|
-
|
|
2403
|
-
Args:
|
|
2404
|
-
imageUrl (str | list[ImageObject]):
|
|
2405
|
-
The cover image to retrieve - can be one of the following:
|
|
2406
|
-
- a url string that points to the exact cover image to transfer.
|
|
2407
|
-
- a list of `ImageObject` items that contain the cover art for the media in
|
|
2408
|
-
various sizes, usually widest first.
|
|
2409
|
-
outputPath (str):
|
|
2410
|
-
Fully-qualified path to store the downloaded image to.
|
|
2411
|
-
desiredWidth (int):
|
|
2412
|
-
A desired resolution width to return (if found); if not found, then the
|
|
2413
|
-
highest resolution is returned.
|
|
2414
|
-
This argument is ignored if the `images` argument is not an `ImageObject` list.
|
|
2415
|
-
|
|
2416
|
-
The output path supports the replacement of the following keyword parameters:
|
|
2417
|
-
- `{dotfileextn}` - a "." followed by the file extension based on response content
|
|
2418
|
-
type (for known types: JPG,PNG,APNG,BMP,GIF).
|
|
2419
|
-
- `{imagewidth}` - the resolved width value, if `imageUrl` argument is of type list[ImageObject].
|
|
2420
|
-
|
|
2421
|
-
The Spotify Web API normally returns a list of `ImageObject` items in its various
|
|
2422
|
-
endpoints. The highest resolution image is usually the first list item, but the
|
|
2423
|
-
order is not guarenteed (e.g. `GetShowFavorites`).
|
|
2424
|
-
|
|
2425
|
-
This method should only be used to download images for playlists that contain
|
|
2426
|
-
public domain images. It should not be used to download copyright protected images,
|
|
2427
|
-
as that would violate the Spotify Web API Terms of Service.
|
|
2428
|
-
"""
|
|
2429
|
-
apiMethodName:str = 'GetCoverImageFile'
|
|
2430
|
-
apiMethodParms:SIMethodParmListContext = None
|
|
2431
|
-
response:HTTPResponse = None
|
|
2432
|
-
url:str = None
|
|
2433
|
-
imageWidth:int = 0
|
|
2434
|
-
|
|
2435
|
-
try:
|
|
2436
|
-
|
|
2437
|
-
# trace.
|
|
2438
|
-
apiMethodParms = _logsi.EnterMethodParmList(SILevel.Debug, apiMethodName)
|
|
2439
|
-
apiMethodParms.AppendKeyValue("imageUrl", imageUrl)
|
|
2440
|
-
apiMethodParms.AppendKeyValue("outputPath", outputPath)
|
|
2441
|
-
apiMethodParms.AppendKeyValue("desiredWidth", desiredWidth)
|
|
2442
|
-
_logsi.LogMethodParmList(SILevel.Verbose, "Downloading cover image url content", apiMethodParms)
|
|
2443
|
-
|
|
2444
|
-
# validations.
|
|
2445
|
-
if (imageUrl is None):
|
|
2446
|
-
raise SpotifyApiError(SAAppMessages.ARGUMENT_REQUIRED_ERROR % (apiMethodName, 'imageUrl'), logsi=_logsi)
|
|
2447
|
-
if (outputPath is None):
|
|
2448
|
-
raise SpotifyApiError(SAAppMessages.ARGUMENT_REQUIRED_ERROR % (apiMethodName, 'outputPath'), logsi=_logsi)
|
|
2449
|
-
|
|
2450
|
-
# was an image list specified?
|
|
2451
|
-
if (isinstance(imageUrl, list)):
|
|
2452
|
-
|
|
2453
|
-
# return the highest resolution order image from a list of `ImageObject` items.
|
|
2454
|
-
# this will return None if images argument was none or empty.
|
|
2455
|
-
url = ImageObject.GetImageHighestResolution(imageUrl, desiredWidth)
|
|
2456
|
-
imageWidth = ImageObject.GetImageHighestResolutionWidth(imageUrl, desiredWidth)
|
|
2457
|
-
if (url) is None:
|
|
2458
|
-
_logsi.LogVerbose("List of ImageObjects was not specified, or was empty")
|
|
2459
|
-
return
|
|
2460
|
-
imageUrl = url
|
|
2461
|
-
|
|
2462
|
-
# download content from the selected image url.
|
|
2463
|
-
_logsi.LogVerbose("Downloading cover image url (width=%s): \"%s\"" % (desiredWidth, imageUrl))
|
|
2464
|
-
response = self._Manager.request("GET", imageUrl)
|
|
2465
|
-
|
|
2466
|
-
# trace.
|
|
2467
|
-
if _logsi.IsOn(SILevel.Debug):
|
|
2468
|
-
_logsi.LogObject(SILevel.Debug, "SpotifyClient http response [%s-%s]: '%s' (response)" % (response.status, response.reason, imageUrl), response)
|
|
2469
|
-
if (response.headers):
|
|
2470
|
-
_logsi.LogCollection(SILevel.Debug, "SpotifyClient http response [%s-%s]: '%s' (headers)" % (response.status, response.reason, imageUrl), response.headers.items())
|
|
2471
|
-
|
|
2472
|
-
# do response headers contain a content-type value?
|
|
2473
|
-
# if so, then set file extension based on content type.
|
|
2474
|
-
contentType:str = None
|
|
2475
|
-
outputFileExtn:str = ".jpg"
|
|
2476
|
-
if response.headers:
|
|
2477
|
-
if 'content-type' in response.headers:
|
|
2478
|
-
contentType = response.headers['content-type'] + ""
|
|
2479
|
-
if (contentType.find("image/jpeg") != -1):
|
|
2480
|
-
outputFileExtn = ".jpg"
|
|
2481
|
-
elif (contentType.find("image/bmp") != -1):
|
|
2482
|
-
outputFileExtn = ".bmp"
|
|
2483
|
-
elif (contentType.find("image/png") != -1):
|
|
2484
|
-
outputFileExtn = ".png"
|
|
2485
|
-
elif (contentType.find("image/apng") != -1):
|
|
2486
|
-
outputFileExtn = ".apng"
|
|
2487
|
-
elif (contentType.find("image/gif") != -1):
|
|
2488
|
-
outputFileExtn = ".gif"
|
|
2489
|
-
else:
|
|
2490
|
-
outputFileExtn = ".jpg"
|
|
2491
|
-
|
|
2492
|
-
# do we have response data?
|
|
2493
|
-
if len(response.data) == 0:
|
|
2494
|
-
|
|
2495
|
-
# some requests will not return a response, which is ok.
|
|
2496
|
-
_logsi.LogVerbose("SpotifyClient http response [%s-%s]: '%s' (no data)" % (response.status, response.reason, imageUrl))
|
|
2497
|
-
|
|
2498
|
-
else:
|
|
2499
|
-
|
|
2500
|
-
# override file extension based on content type (if desired).
|
|
2501
|
-
outputPath = outputPath.replace("{dotfileextn}", outputFileExtn)
|
|
2502
|
-
outputPath = outputPath.replace("{imagewidth}", str(imageWidth))
|
|
2503
|
-
|
|
2504
|
-
# write data to output file.
|
|
2505
|
-
f = open(outputPath,'wb')
|
|
2506
|
-
f.write(response.data)
|
|
2507
|
-
f.close()
|
|
2508
|
-
|
|
2509
|
-
# response is raw image data.
|
|
2510
|
-
_logsi.LogJpegFile(SILevel.Verbose, "SpotifyClient http response [%s-%s]: '%s' (imagefile)" % (response.status, response.reason, imageUrl), outputPath)
|
|
2511
|
-
|
|
2512
|
-
except SpotifyApiError: raise # pass handled exceptions on thru
|
|
2513
|
-
except Exception as ex:
|
|
2514
|
-
|
|
2515
|
-
# format unhandled exception.
|
|
2516
|
-
raise SpotifyApiError(SAAppMessages.UNHANDLED_EXCEPTION.format(apiMethodName, str(ex)), ex, logsi=_logsi)
|
|
2517
|
-
|
|
2518
|
-
finally:
|
|
2519
|
-
|
|
2520
|
-
# close the response (if needed).
|
|
2521
|
-
if response is not None:
|
|
2522
|
-
if response.closed == False:
|
|
2523
|
-
response.close()
|
|
2524
|
-
|
|
2525
|
-
# trace.
|
|
2526
|
-
_logsi.LeaveMethod(SILevel.Debug, apiMethodName)
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
2394
|
def FollowArtists(
|
|
2530
2395
|
self,
|
|
2531
2396
|
ids:str=None,
|
|
@@ -5883,6 +5748,141 @@ class SpotifyClient:
|
|
|
5883
5748
|
_logsi.LeaveMethod(SILevel.Debug, apiMethodName)
|
|
5884
5749
|
|
|
5885
5750
|
|
|
5751
|
+
def GetCoverImageFile(
|
|
5752
|
+
self,
|
|
5753
|
+
imageUrl:Union[str,list],
|
|
5754
|
+
outputPath:str,
|
|
5755
|
+
desiredWidth:int=None,
|
|
5756
|
+
) -> None:
|
|
5757
|
+
"""
|
|
5758
|
+
Gets the contents of an image url and transfers the contents to the local file system.
|
|
5759
|
+
|
|
5760
|
+
Args:
|
|
5761
|
+
imageUrl (str | list[ImageObject]):
|
|
5762
|
+
The cover image to retrieve - can be one of the following:
|
|
5763
|
+
- a url string that points to the exact cover image to transfer.
|
|
5764
|
+
- a list of `ImageObject` items that contain the cover art for the media in
|
|
5765
|
+
various sizes, usually widest first.
|
|
5766
|
+
outputPath (str):
|
|
5767
|
+
Fully-qualified path to store the downloaded image to.
|
|
5768
|
+
desiredWidth (int):
|
|
5769
|
+
A desired resolution width to return (if found); if not found, then the
|
|
5770
|
+
highest resolution is returned.
|
|
5771
|
+
This argument is ignored if the `images` argument is not an `ImageObject` list.
|
|
5772
|
+
|
|
5773
|
+
The output path supports the replacement of the following keyword parameters:
|
|
5774
|
+
- `{dotfileextn}` - a "." followed by the file extension based on response content
|
|
5775
|
+
type (for known types: JPG,PNG,APNG,BMP,GIF).
|
|
5776
|
+
- `{imagewidth}` - the resolved width value, if `imageUrl` argument is of type list[ImageObject].
|
|
5777
|
+
|
|
5778
|
+
The Spotify Web API normally returns a list of `ImageObject` items in its various
|
|
5779
|
+
endpoints. The highest resolution image is usually the first list item, but the
|
|
5780
|
+
order is not guarenteed (e.g. `GetShowFavorites`).
|
|
5781
|
+
|
|
5782
|
+
This method should only be used to download images for playlists that contain
|
|
5783
|
+
public domain images. It should not be used to download copyright protected images,
|
|
5784
|
+
as that would violate the Spotify Web API Terms of Service.
|
|
5785
|
+
"""
|
|
5786
|
+
apiMethodName:str = 'GetCoverImageFile'
|
|
5787
|
+
apiMethodParms:SIMethodParmListContext = None
|
|
5788
|
+
response:HTTPResponse = None
|
|
5789
|
+
url:str = None
|
|
5790
|
+
imageWidth:int = 0
|
|
5791
|
+
|
|
5792
|
+
try:
|
|
5793
|
+
|
|
5794
|
+
# trace.
|
|
5795
|
+
apiMethodParms = _logsi.EnterMethodParmList(SILevel.Debug, apiMethodName)
|
|
5796
|
+
apiMethodParms.AppendKeyValue("imageUrl", imageUrl)
|
|
5797
|
+
apiMethodParms.AppendKeyValue("outputPath", outputPath)
|
|
5798
|
+
apiMethodParms.AppendKeyValue("desiredWidth", desiredWidth)
|
|
5799
|
+
_logsi.LogMethodParmList(SILevel.Verbose, "Downloading cover image url content", apiMethodParms)
|
|
5800
|
+
|
|
5801
|
+
# validations.
|
|
5802
|
+
if (imageUrl is None):
|
|
5803
|
+
raise SpotifyApiError(SAAppMessages.ARGUMENT_REQUIRED_ERROR % (apiMethodName, 'imageUrl'), logsi=_logsi)
|
|
5804
|
+
if (outputPath is None):
|
|
5805
|
+
raise SpotifyApiError(SAAppMessages.ARGUMENT_REQUIRED_ERROR % (apiMethodName, 'outputPath'), logsi=_logsi)
|
|
5806
|
+
|
|
5807
|
+
# was an image list specified?
|
|
5808
|
+
if (isinstance(imageUrl, list)):
|
|
5809
|
+
|
|
5810
|
+
# return the highest resolution order image from a list of `ImageObject` items.
|
|
5811
|
+
# this will return None if images argument was none or empty.
|
|
5812
|
+
url = ImageObject.GetImageHighestResolution(imageUrl, desiredWidth)
|
|
5813
|
+
imageWidth = ImageObject.GetImageHighestResolutionWidth(imageUrl, desiredWidth)
|
|
5814
|
+
if (url) is None:
|
|
5815
|
+
_logsi.LogVerbose("List of ImageObjects was not specified, or was empty")
|
|
5816
|
+
return
|
|
5817
|
+
imageUrl = url
|
|
5818
|
+
|
|
5819
|
+
# download content from the selected image url.
|
|
5820
|
+
_logsi.LogVerbose("Downloading cover image url (width=%s): \"%s\"" % (desiredWidth, imageUrl))
|
|
5821
|
+
response = self._Manager.request("GET", imageUrl)
|
|
5822
|
+
|
|
5823
|
+
# trace.
|
|
5824
|
+
if _logsi.IsOn(SILevel.Debug):
|
|
5825
|
+
_logsi.LogObject(SILevel.Debug, "SpotifyClient http response [%s-%s]: '%s' (response)" % (response.status, response.reason, imageUrl), response)
|
|
5826
|
+
if (response.headers):
|
|
5827
|
+
_logsi.LogCollection(SILevel.Debug, "SpotifyClient http response [%s-%s]: '%s' (headers)" % (response.status, response.reason, imageUrl), response.headers.items())
|
|
5828
|
+
|
|
5829
|
+
# do response headers contain a content-type value?
|
|
5830
|
+
# if so, then set file extension based on content type.
|
|
5831
|
+
contentType:str = None
|
|
5832
|
+
outputFileExtn:str = ".jpg"
|
|
5833
|
+
if response.headers:
|
|
5834
|
+
if 'content-type' in response.headers:
|
|
5835
|
+
contentType = response.headers['content-type'] + ""
|
|
5836
|
+
if (contentType.find("image/jpeg") != -1):
|
|
5837
|
+
outputFileExtn = ".jpg"
|
|
5838
|
+
elif (contentType.find("image/bmp") != -1):
|
|
5839
|
+
outputFileExtn = ".bmp"
|
|
5840
|
+
elif (contentType.find("image/png") != -1):
|
|
5841
|
+
outputFileExtn = ".png"
|
|
5842
|
+
elif (contentType.find("image/apng") != -1):
|
|
5843
|
+
outputFileExtn = ".apng"
|
|
5844
|
+
elif (contentType.find("image/gif") != -1):
|
|
5845
|
+
outputFileExtn = ".gif"
|
|
5846
|
+
else:
|
|
5847
|
+
outputFileExtn = ".jpg"
|
|
5848
|
+
|
|
5849
|
+
# do we have response data?
|
|
5850
|
+
if len(response.data) == 0:
|
|
5851
|
+
|
|
5852
|
+
# some requests will not return a response, which is ok.
|
|
5853
|
+
_logsi.LogVerbose("SpotifyClient http response [%s-%s]: '%s' (no data)" % (response.status, response.reason, imageUrl))
|
|
5854
|
+
|
|
5855
|
+
else:
|
|
5856
|
+
|
|
5857
|
+
# override file extension based on content type (if desired).
|
|
5858
|
+
outputPath = outputPath.replace("{dotfileextn}", outputFileExtn)
|
|
5859
|
+
outputPath = outputPath.replace("{imagewidth}", str(imageWidth))
|
|
5860
|
+
|
|
5861
|
+
# write data to output file.
|
|
5862
|
+
f = open(outputPath,'wb')
|
|
5863
|
+
f.write(response.data)
|
|
5864
|
+
f.close()
|
|
5865
|
+
|
|
5866
|
+
# response is raw image data.
|
|
5867
|
+
_logsi.LogJpegFile(SILevel.Verbose, "SpotifyClient http response [%s-%s]: '%s' (imagefile)" % (response.status, response.reason, imageUrl), outputPath)
|
|
5868
|
+
|
|
5869
|
+
except SpotifyApiError: raise # pass handled exceptions on thru
|
|
5870
|
+
except Exception as ex:
|
|
5871
|
+
|
|
5872
|
+
# format unhandled exception.
|
|
5873
|
+
raise SpotifyApiError(SAAppMessages.UNHANDLED_EXCEPTION.format(apiMethodName, str(ex)), ex, logsi=_logsi)
|
|
5874
|
+
|
|
5875
|
+
finally:
|
|
5876
|
+
|
|
5877
|
+
# close the response (if needed).
|
|
5878
|
+
if response is not None:
|
|
5879
|
+
if response.closed == False:
|
|
5880
|
+
response.close()
|
|
5881
|
+
|
|
5882
|
+
# trace.
|
|
5883
|
+
_logsi.LeaveMethod(SILevel.Debug, apiMethodName)
|
|
5884
|
+
|
|
5885
|
+
|
|
5886
5886
|
def GetEpisode(
|
|
5887
5887
|
self,
|
|
5888
5888
|
episodeId:str=None,
|
|
@@ -717,7 +717,7 @@ class ZeroconfConnect:
|
|
|
717
717
|
apiMethodParms:SIMethodParmListContext = None
|
|
718
718
|
tracePrefix:str = 'SpotifyConnectAuthorizationCodeToken exchange'
|
|
719
719
|
|
|
720
|
-
# based upon Fiddler trace,
|
|
720
|
+
# based upon Fiddler trace, the tokenType "authorization_code" flow exchanges an
|
|
721
721
|
# access-token for an "authorization_code" token. it does this by calling
|
|
722
722
|
# "accounts.spotify.com/api/token" to exchange the spotify "login5" "client-token" value
|
|
723
723
|
# to an "authorization_code" token value, which is then passed on the Spotify Connect
|
|
File without changes
|
|
File without changes
|
{spotifywebapiPython-1.0.129.dist-info → spotifywebapiPython-1.0.130.dist-info}/top_level.txt
RENAMED
|
File without changes
|