spotifywebapiPython 1.0.286__py3-none-any.whl → 1.0.288__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 -2
- 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 +70 -7
- 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 +24 -2
- spotifywebapipython/docs/spotifywebapipython/spotifywebplayertoken.html +2 -2
- spotifywebapipython/spotifyclient.py +199 -8
- spotifywebapipython/spotifywebapierror.py +24 -0
- {spotifywebapipython-1.0.286.dist-info → spotifywebapipython-1.0.288.dist-info}/METADATA +1 -1
- {spotifywebapipython-1.0.286.dist-info → spotifywebapipython-1.0.288.dist-info}/RECORD +24 -24
- {spotifywebapipython-1.0.286.dist-info → spotifywebapipython-1.0.288.dist-info}/LICENSE +0 -0
- {spotifywebapipython-1.0.286.dist-info → spotifywebapipython-1.0.288.dist-info}/WHEEL +0 -0
- {spotifywebapipython-1.0.286.dist-info → spotifywebapipython-1.0.288.dist-info}/top_level.txt +0 -0
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</title>
|
|
10
10
|
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
|
|
11
11
|
<!-- build env - Package Name = "spotifywebapipython" -->
|
|
12
|
-
<!-- build env - Package Version = "1.0.
|
|
12
|
+
<!-- build env - Package Version = "1.0.288" -->
|
|
13
13
|
<!-- pdoc module.modulename = "spotifywebapipython.spotifywebapiauthenticationerror" -->
|
|
14
14
|
<!-- pdoc module.is_package = "False" -->
|
|
15
15
|
<!-- pdoc root_module_name = "None" -->
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
|
|
75
75
|
<footer class="footertext">
|
|
76
76
|
spotifywebapipython</br>
|
|
77
|
-
Version 1.0.
|
|
77
|
+
Version 1.0.288</br>
|
|
78
78
|
<a href="https://developer.spotify.com/documentation/web-api" target="_blank">
|
|
79
79
|
<img src="../spotifywebapipython.ico" alt="brand icon" style="width:32px; height:32px; padding:4px;"/>
|
|
80
80
|
A Spotify Web Api Client
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</title>
|
|
10
10
|
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
|
|
11
11
|
<!-- build env - Package Name = "spotifywebapipython" -->
|
|
12
|
-
<!-- build env - Package Version = "1.0.
|
|
12
|
+
<!-- build env - Package Version = "1.0.288" -->
|
|
13
13
|
<!-- pdoc module.modulename = "spotifywebapipython.spotifywebapierror" -->
|
|
14
14
|
<!-- pdoc module.is_package = "False" -->
|
|
15
15
|
<!-- pdoc root_module_name = "None" -->
|
|
@@ -60,6 +60,9 @@
|
|
|
60
60
|
<li>
|
|
61
61
|
<a class="variable" href="#SpotifyWebApiError.Status">Status</a>
|
|
62
62
|
</li>
|
|
63
|
+
<li>
|
|
64
|
+
<a class="variable" href="#SpotifyWebApiError.RetryAfter">RetryAfter</a>
|
|
65
|
+
</li>
|
|
63
66
|
<li>
|
|
64
67
|
<a class="function" href="#SpotifyWebApiError.ToString">ToString</a>
|
|
65
68
|
</li>
|
|
@@ -71,7 +74,7 @@
|
|
|
71
74
|
|
|
72
75
|
<footer class="footertext">
|
|
73
76
|
spotifywebapipython</br>
|
|
74
|
-
Version 1.0.
|
|
77
|
+
Version 1.0.288</br>
|
|
75
78
|
<a href="https://developer.spotify.com/documentation/web-api" target="_blank">
|
|
76
79
|
<img src="../spotifywebapipython.ico" alt="brand icon" style="width:32px; height:32px; padding:4px;"/>
|
|
77
80
|
A Spotify Web Api Client
|
|
@@ -197,6 +200,25 @@ For further information, see Response Status Codes.</p>
|
|
|
197
200
|
</div>
|
|
198
201
|
|
|
199
202
|
|
|
203
|
+
</div>
|
|
204
|
+
<div id="SpotifyWebApiError.RetryAfter" class="classattr">
|
|
205
|
+
<div class="attr variable">
|
|
206
|
+
<span class="name">RetryAfter</span><span class="annotation">: int</span>
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
</div>
|
|
210
|
+
<a class="headerlink" href="#SpotifyWebApiError.RetryAfter"></a>
|
|
211
|
+
|
|
212
|
+
<div class="docstring"><p>The number of seconds to wait before retrying a method call that resulted in
|
|
213
|
+
an HTTP status of 429 (rate-limit exceeded).</p>
|
|
214
|
+
|
|
215
|
+
<p>This value is only valid if the HTTP response headers contained a <code>retry-after</code> key.
|
|
216
|
+
This usually only happens when HTTP status code = 429.</p>
|
|
217
|
+
|
|
218
|
+
<p>Example: <code>21</code></p>
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
|
|
200
222
|
</div>
|
|
201
223
|
<div id="SpotifyWebApiError.ToString" class="classattr">
|
|
202
224
|
<div class="attr function">
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</title>
|
|
10
10
|
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
|
|
11
11
|
<!-- build env - Package Name = "spotifywebapipython" -->
|
|
12
|
-
<!-- build env - Package Version = "1.0.
|
|
12
|
+
<!-- build env - Package Version = "1.0.288" -->
|
|
13
13
|
<!-- pdoc module.modulename = "spotifywebapipython.spotifywebplayertoken" -->
|
|
14
14
|
<!-- pdoc module.is_package = "False" -->
|
|
15
15
|
<!-- pdoc root_module_name = "None" -->
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
|
|
102
102
|
<footer class="footertext">
|
|
103
103
|
spotifywebapipython</br>
|
|
104
|
-
Version 1.0.
|
|
104
|
+
Version 1.0.288</br>
|
|
105
105
|
<a href="https://developer.spotify.com/documentation/web-api" target="_blank">
|
|
106
106
|
<img src="../spotifywebapipython.ico" alt="brand icon" style="width:32px; height:32px; padding:4px;"/>
|
|
107
107
|
A Spotify Web Api Client
|
|
@@ -15,7 +15,7 @@ from soco.plugins.sharelink import ShareLinkPlugin
|
|
|
15
15
|
import time
|
|
16
16
|
import threading
|
|
17
17
|
from typing import Tuple, Callable, Union
|
|
18
|
-
from urllib3 import PoolManager, Timeout, HTTPResponse
|
|
18
|
+
from urllib3 import PoolManager, Timeout, HTTPResponse, Retry
|
|
19
19
|
from urllib.parse import urlencode
|
|
20
20
|
import urllib.parse
|
|
21
21
|
from lxml.etree import fromstring, Element
|
|
@@ -252,16 +252,29 @@ class SpotifyClient:
|
|
|
252
252
|
# "WARNING:urllib3.connectionpool:Connection pool is full, discarding connection: x.x.x.x. Connection pool size: 1"
|
|
253
253
|
if (manager is None) or (not isinstance(manager,PoolManager)):
|
|
254
254
|
|
|
255
|
+
# setup retry details for each request made to the Spotify Web API.
|
|
256
|
+
# this allows the urllib3 PoolManager to automatically retry requests that fail due to
|
|
257
|
+
# connection and read related scenarios (e.g. temporary connection issues, redirects, etc);
|
|
258
|
+
# it allows our library to manually handle other types of retry scenarios (e.g. temporary
|
|
259
|
+
# Spotify Web API backend server, unauthorized / forbidden requests, etc).
|
|
260
|
+
retry = Retry(
|
|
261
|
+
total=3, # total number of retries to allow (takes precedence over other counts)
|
|
262
|
+
connect=2, # number of times to retry on connection-related errors (errors raised before request is sent to server)
|
|
263
|
+
read=2, # number of times to retry on read errors (errors raised after request was sent to server)
|
|
264
|
+
status=0, # number of times to retry on bad status codes (0=never retry; let us handle them manually and ignore `status_forcelist`)
|
|
265
|
+
respect_retry_after_header=False, # whether to respect Retry-After header on status codes
|
|
266
|
+
)
|
|
267
|
+
|
|
255
268
|
# create new pool manager with specified timeouts and limits.
|
|
256
269
|
timeout = Timeout(connect=float(30), read=None)
|
|
257
|
-
self._Manager = PoolManager(headers={'User-Agent': '
|
|
270
|
+
self._Manager = PoolManager(headers={'User-Agent': 'SpotifyWebApiPython/1.0.0'},
|
|
258
271
|
timeout=timeout,
|
|
259
272
|
num_pools=10, # number of connection pools to allocate.
|
|
260
273
|
maxsize=30, # maximum number of connections to keep in the pool.
|
|
261
|
-
block=True
|
|
274
|
+
block=True, # limit number of connections to the device.
|
|
275
|
+
retries=retry, # specific way to handle retry on errors.
|
|
262
276
|
)
|
|
263
277
|
|
|
264
|
-
|
|
265
278
|
# verify token storage directory exists.
|
|
266
279
|
if tokenStorageDir is None:
|
|
267
280
|
tokenStorageDir = platformdirs.site_config_dir('SpotifyWebApiPython', ensure_exists=True, appauthor=False)
|
|
@@ -706,6 +719,7 @@ class SpotifyClient:
|
|
|
706
719
|
responseData:dict = None
|
|
707
720
|
responseUTF8:str = None
|
|
708
721
|
contentType:str = None
|
|
722
|
+
retryAfterSeconds:int|None = None
|
|
709
723
|
|
|
710
724
|
try:
|
|
711
725
|
|
|
@@ -740,9 +754,17 @@ class SpotifyClient:
|
|
|
740
754
|
# do response headers contain a content-type value?
|
|
741
755
|
# if so, we will use it to determine how to convert the response data.
|
|
742
756
|
if response.headers:
|
|
757
|
+
|
|
743
758
|
if 'content-type' in response.headers:
|
|
744
759
|
contentType = response.headers['content-type']
|
|
745
760
|
|
|
761
|
+
# Spotify normally returns a seconds value for `retry-after`, but it could change to a date.
|
|
762
|
+
if 'retry-after' in response.headers:
|
|
763
|
+
try:
|
|
764
|
+
retryAfterSeconds = int(response.headers.get('retry-after', 0))
|
|
765
|
+
except Exception as ex:
|
|
766
|
+
retryAfterSeconds = None
|
|
767
|
+
|
|
746
768
|
# do we have response data?
|
|
747
769
|
if len(response.data) == 0:
|
|
748
770
|
|
|
@@ -839,9 +861,16 @@ class SpotifyClient:
|
|
|
839
861
|
|
|
840
862
|
if errCode is None:
|
|
841
863
|
errCode = response.status
|
|
864
|
+
|
|
865
|
+
# if "retry-after" response header, then append the amount to the message.
|
|
866
|
+
if (retryAfterSeconds is not None):
|
|
867
|
+
errMessage += " (retry-after: %s seconds)" % retryAfterSeconds
|
|
842
868
|
|
|
843
869
|
if (not msg.IgnoreResponseErrors):
|
|
844
|
-
|
|
870
|
+
exObj = SpotifyWebApiError(errCode, errMessage, msg.MethodName, response.reason, _logsi)
|
|
871
|
+
if (retryAfterSeconds is not None):
|
|
872
|
+
exObj.RetryAfter = retryAfterSeconds
|
|
873
|
+
raise exObj
|
|
845
874
|
|
|
846
875
|
elif isinstance(errObj, str):
|
|
847
876
|
|
|
@@ -1565,6 +1594,18 @@ class SpotifyClient:
|
|
|
1565
1594
|
_logsi.LogDictionary(SILevel.Verbose, "SpotifyClient http request: '%s' (no body)" % (url), msg.RequestData, prettyPrint=True)
|
|
1566
1595
|
response = self._Manager.request(method, url, headers=msg.RequestHeaders)
|
|
1567
1596
|
|
|
1597
|
+
# TEST TODO - simulate http response for testing purposes.
|
|
1598
|
+
# _logsi.LogWarning("SpotifyClient MakeRequest forced HTTPResponse for testing!", colorValue=SIColors.Red)
|
|
1599
|
+
# response = HTTPResponse(
|
|
1600
|
+
# status=429,
|
|
1601
|
+
# reason="Too Many Requests (TEST)",
|
|
1602
|
+
# body=b'{"error":{"status":429,"message":"API rate limit exceeded"}}',
|
|
1603
|
+
# headers={
|
|
1604
|
+
# "Content-Type": "application/json",
|
|
1605
|
+
# "Retry-After": "41",
|
|
1606
|
+
# },
|
|
1607
|
+
# )
|
|
1608
|
+
|
|
1568
1609
|
# TEST TODO - for testing retry logic.
|
|
1569
1610
|
# if (response.status_code == 200) and (loopTotalDelay <= 0.200):
|
|
1570
1611
|
# _logsi.LogWarning("TEST TODO - Testing Spotify Web API 504 status (Gateway timeout) condition ...", colorValue=SIColors.Red)
|
|
@@ -1577,7 +1618,7 @@ class SpotifyClient:
|
|
|
1577
1618
|
|
|
1578
1619
|
# check for errors that are temporary in nature; for these errors, we will retry the
|
|
1579
1620
|
# request for a specified number of tries with a small wait period in between.
|
|
1580
|
-
if (response.status
|
|
1621
|
+
if (response.status in [503,504]):
|
|
1581
1622
|
|
|
1582
1623
|
# only retry so many times before we give up;
|
|
1583
1624
|
if (loopTotalDelay >= LOOP_TIMEOUT):
|
|
@@ -3722,6 +3763,11 @@ class SpotifyClient:
|
|
|
3722
3763
|
SpotifyApiError:
|
|
3723
3764
|
If the method fails for any other reason.
|
|
3724
3765
|
|
|
3766
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
3767
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
3768
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
3769
|
+
is considered by the filter.
|
|
3770
|
+
|
|
3725
3771
|
<details>
|
|
3726
3772
|
<summary>Sample Code - Manual Paging</summary>
|
|
3727
3773
|
```python
|
|
@@ -3925,6 +3971,11 @@ class SpotifyClient:
|
|
|
3925
3971
|
SpotifyApiError:
|
|
3926
3972
|
If the method fails for any other reason.
|
|
3927
3973
|
|
|
3974
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
3975
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
3976
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
3977
|
+
is considered by the filter.
|
|
3978
|
+
|
|
3928
3979
|
<details>
|
|
3929
3980
|
<summary>Sample Code - Manual Paging</summary>
|
|
3930
3981
|
```python
|
|
@@ -5191,8 +5242,8 @@ class SpotifyClient:
|
|
|
5191
5242
|
were returned in by the Spotify Web API.
|
|
5192
5243
|
Default: True
|
|
5193
5244
|
filterCriteria (str):
|
|
5194
|
-
Filter returned entries by
|
|
5195
|
-
Value can be a full name (e.g. "My
|
|
5245
|
+
Filter returned entries by an artist name or uri value.
|
|
5246
|
+
Value can be a full name (e.g. "My Artist Name"), or a partial name (e.g. "My").
|
|
5196
5247
|
|
|
5197
5248
|
Returns:
|
|
5198
5249
|
An `ArtistPage` object of matching results.
|
|
@@ -5204,6 +5255,11 @@ class SpotifyClient:
|
|
|
5204
5255
|
SpotifyApiError:
|
|
5205
5256
|
If the method fails for any other reason.
|
|
5206
5257
|
|
|
5258
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
5259
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
5260
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
5261
|
+
is considered by the filter.
|
|
5262
|
+
|
|
5207
5263
|
<details>
|
|
5208
5264
|
<summary>Sample Code - Manual Paging</summary>
|
|
5209
5265
|
```python
|
|
@@ -5352,6 +5408,7 @@ class SpotifyClient:
|
|
|
5352
5408
|
artistId:str=None,
|
|
5353
5409
|
market:str=None,
|
|
5354
5410
|
sortResult:bool=True,
|
|
5411
|
+
filterCriteria:str|None=None,
|
|
5355
5412
|
) -> list[Track]:
|
|
5356
5413
|
"""
|
|
5357
5414
|
<span class="deprecated">
|
|
@@ -5801,6 +5858,11 @@ class SpotifyClient:
|
|
|
5801
5858
|
SpotifyApiError:
|
|
5802
5859
|
If the method fails for any other reason.
|
|
5803
5860
|
|
|
5861
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
5862
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
5863
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
5864
|
+
is considered by the filter.
|
|
5865
|
+
|
|
5804
5866
|
<details>
|
|
5805
5867
|
<summary>Sample Code - Manual Paging</summary>
|
|
5806
5868
|
```python
|
|
@@ -7311,6 +7373,11 @@ class SpotifyClient:
|
|
|
7311
7373
|
SpotifyApiError:
|
|
7312
7374
|
If the method fails for any other reason.
|
|
7313
7375
|
|
|
7376
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
7377
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
7378
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
7379
|
+
is considered by the filter.
|
|
7380
|
+
|
|
7314
7381
|
<details>
|
|
7315
7382
|
<summary>Sample Code - Manual Paging</summary>
|
|
7316
7383
|
```python
|
|
@@ -9396,6 +9463,11 @@ class SpotifyClient:
|
|
|
9396
9463
|
If both `after` and `before` arguments are null (or zero), then a `before` value
|
|
9397
9464
|
is generated that will retrieve the last 50 recently played tracks.
|
|
9398
9465
|
|
|
9466
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
9467
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
9468
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
9469
|
+
is considered by the filter.
|
|
9470
|
+
|
|
9399
9471
|
Returns:
|
|
9400
9472
|
A `PlayHistoryPage` object that contains the recently played items.
|
|
9401
9473
|
|
|
@@ -10090,6 +10162,11 @@ class SpotifyClient:
|
|
|
10090
10162
|
target="_blank">Spotify Developer Forum Blog</a> page.
|
|
10091
10163
|
<span>
|
|
10092
10164
|
|
|
10165
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
10166
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
10167
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
10168
|
+
is considered by the filter.
|
|
10169
|
+
|
|
10093
10170
|
<details>
|
|
10094
10171
|
<summary>Sample Code - Manual Paging</summary>
|
|
10095
10172
|
```python
|
|
@@ -10741,6 +10818,11 @@ class SpotifyClient:
|
|
|
10741
10818
|
The reasoning for that is unclear, but the `excludeAudiobooks` argument allows you to
|
|
10742
10819
|
only return podcast shows in the results if desired.
|
|
10743
10820
|
|
|
10821
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
10822
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
10823
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
10824
|
+
is considered by the filter.
|
|
10825
|
+
|
|
10744
10826
|
<details>
|
|
10745
10827
|
<summary>Sample Code - Manual Paging</summary>
|
|
10746
10828
|
```python
|
|
@@ -11731,6 +11813,11 @@ class SpotifyClient:
|
|
|
11731
11813
|
SpotifyApiError:
|
|
11732
11814
|
If the method fails for any other reason.
|
|
11733
11815
|
|
|
11816
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
11817
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
11818
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
11819
|
+
is considered by the filter.
|
|
11820
|
+
|
|
11734
11821
|
<details>
|
|
11735
11822
|
<summary>Sample Code - Manual Paging</summary>
|
|
11736
11823
|
```python
|
|
@@ -12762,6 +12849,7 @@ class SpotifyClient:
|
|
|
12762
12849
|
offset:int=0,
|
|
12763
12850
|
limitTotal:int=None,
|
|
12764
12851
|
sortResult:bool=True,
|
|
12852
|
+
filterCriteria:str|None=None,
|
|
12765
12853
|
) -> ArtistPage:
|
|
12766
12854
|
"""
|
|
12767
12855
|
Get the current user's top artists based on calculated affinity.
|
|
@@ -12793,6 +12881,9 @@ class SpotifyClient:
|
|
|
12793
12881
|
True to sort the items by name; otherwise, False to leave the items in the same order they
|
|
12794
12882
|
were returned in by the Spotify Web API.
|
|
12795
12883
|
Default: True
|
|
12884
|
+
filterCriteria (str):
|
|
12885
|
+
Filter returned entries by a artist name or uri value.
|
|
12886
|
+
Value can be a full name (e.g. "My Artist Name"), or a partial name (e.g. "My").
|
|
12796
12887
|
|
|
12797
12888
|
Returns:
|
|
12798
12889
|
An `ArtistPage` object of matching results.
|
|
@@ -12804,6 +12895,11 @@ class SpotifyClient:
|
|
|
12804
12895
|
SpotifyApiError:
|
|
12805
12896
|
If the method fails for any other reason.
|
|
12806
12897
|
|
|
12898
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
12899
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
12900
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
12901
|
+
is considered by the filter.
|
|
12902
|
+
|
|
12807
12903
|
<details>
|
|
12808
12904
|
<summary>Sample Code - Manual Paging</summary>
|
|
12809
12905
|
```python
|
|
@@ -12830,6 +12926,7 @@ class SpotifyClient:
|
|
|
12830
12926
|
apiMethodParms.AppendKeyValue("offset", offset)
|
|
12831
12927
|
apiMethodParms.AppendKeyValue("limitTotal", limitTotal)
|
|
12832
12928
|
apiMethodParms.AppendKeyValue("sortResult", sortResult)
|
|
12929
|
+
apiMethodParms.AppendKeyValue("filterCriteria", filterCriteria)
|
|
12833
12930
|
_logsi.LogMethodParmList(SILevel.Verbose, "Get the current user's top artists", apiMethodParms)
|
|
12834
12931
|
|
|
12835
12932
|
# validations.
|
|
@@ -12906,6 +13003,23 @@ class SpotifyClient:
|
|
|
12906
13003
|
if (sortResult is True):
|
|
12907
13004
|
result.Items.sort(key=lambda x: (x.Name or "").lower(), reverse=False)
|
|
12908
13005
|
|
|
13006
|
+
# apply filter criteria (if specified).
|
|
13007
|
+
if (filterCriteria is not None):
|
|
13008
|
+
_logsi.LogVerbose("Applying filter criteria to results list: \"%s\"" % (filterCriteria))
|
|
13009
|
+
filterCriteriaCompare:str = (filterCriteria or "").lower()
|
|
13010
|
+
isFilterUri:bool = SpotifyClient.IsSpotifyUri(filterCriteriaCompare)
|
|
13011
|
+
# process list in reverse order since we are removing items.
|
|
13012
|
+
for idx in reversed(range(len(result.Items))):
|
|
13013
|
+
item:Artist = result.Items[idx]
|
|
13014
|
+
itemFound:bool = False
|
|
13015
|
+
if (isFilterUri):
|
|
13016
|
+
if ((item.Uri or "").lower() == filterCriteriaCompare):
|
|
13017
|
+
itemFound = True
|
|
13018
|
+
elif ((item.Name or "").lower().find(filterCriteriaCompare) > -1):
|
|
13019
|
+
itemFound = True
|
|
13020
|
+
if (not itemFound):
|
|
13021
|
+
result.Items.pop(idx)
|
|
13022
|
+
|
|
12909
13023
|
# trace.
|
|
12910
13024
|
_logsi.LogObject(SILevel.Verbose, (TRACE_METHOD_RESULT_TYPE + result.PagingInfo) % (apiMethodName, type(result).__name__), result, excludeNonPublic=True)
|
|
12911
13025
|
return result
|
|
@@ -12931,6 +13045,9 @@ class SpotifyClient:
|
|
|
12931
13045
|
offset:int=0,
|
|
12932
13046
|
limitTotal:int=None,
|
|
12933
13047
|
sortResult:bool=True,
|
|
13048
|
+
filterArtist:str|None=None,
|
|
13049
|
+
filterAlbum:str|None=None,
|
|
13050
|
+
filterCriteria:str|None=None,
|
|
12934
13051
|
) -> TrackPage:
|
|
12935
13052
|
"""
|
|
12936
13053
|
Get the current user's top tracks based on calculated affinity.
|
|
@@ -12962,6 +13079,15 @@ class SpotifyClient:
|
|
|
12962
13079
|
True to sort the items by name; otherwise, False to leave the items in the same order they
|
|
12963
13080
|
were returned in by the Spotify Web API.
|
|
12964
13081
|
Default: True
|
|
13082
|
+
filterArtist (str):
|
|
13083
|
+
Filter returned entries by an artist name or uri value.
|
|
13084
|
+
Value can be the full name of the artist (e.g. "Jeremy Camp"), or a partial name (e.g. "Camp").
|
|
13085
|
+
filterAlbum (str):
|
|
13086
|
+
Filter returned entries by an album name or uri value.
|
|
13087
|
+
Value can be the full name of the album (e.g. "Carried Me"), or a partial name (e.g. "Carried").
|
|
13088
|
+
filterCriteria (str):
|
|
13089
|
+
Filter returned entries by a track name or uri value.
|
|
13090
|
+
Value can be a full name (e.g. "My Track Name"), or a partial name (e.g. "My").
|
|
12965
13091
|
|
|
12966
13092
|
Returns:
|
|
12967
13093
|
An `TrackPage` object of matching results.
|
|
@@ -12973,6 +13099,11 @@ class SpotifyClient:
|
|
|
12973
13099
|
SpotifyApiError:
|
|
12974
13100
|
If the method fails for any other reason.
|
|
12975
13101
|
|
|
13102
|
+
Filter criteria is applied after data (up to the limit) has been retrieved.
|
|
13103
|
+
This is important, in that if you set the limit too low it will not find any matching entries because
|
|
13104
|
+
it could not retrieve them all. If filtering, ensure that you set higher a limit value to that ALL data
|
|
13105
|
+
is considered by the filter.
|
|
13106
|
+
|
|
12976
13107
|
<details>
|
|
12977
13108
|
<summary>Sample Code - Manual Paging</summary>
|
|
12978
13109
|
```python
|
|
@@ -12999,6 +13130,9 @@ class SpotifyClient:
|
|
|
12999
13130
|
apiMethodParms.AppendKeyValue("offset", offset)
|
|
13000
13131
|
apiMethodParms.AppendKeyValue("limitTotal", limitTotal)
|
|
13001
13132
|
apiMethodParms.AppendKeyValue("sortResult", sortResult)
|
|
13133
|
+
apiMethodParms.AppendKeyValue("filterArtist", filterArtist)
|
|
13134
|
+
apiMethodParms.AppendKeyValue("filterAlbum", filterAlbum)
|
|
13135
|
+
apiMethodParms.AppendKeyValue("filterCriteria", filterCriteria)
|
|
13002
13136
|
_logsi.LogMethodParmList(SILevel.Verbose, "Get the current user's top tracks", apiMethodParms)
|
|
13003
13137
|
|
|
13004
13138
|
# validations.
|
|
@@ -13075,6 +13209,63 @@ class SpotifyClient:
|
|
|
13075
13209
|
if (sortResult is True):
|
|
13076
13210
|
result.Items.sort(key=lambda x: (x.Name or "").lower(), reverse=False)
|
|
13077
13211
|
|
|
13212
|
+
# apply artist filter criteria.
|
|
13213
|
+
if (filterArtist is not None):
|
|
13214
|
+
_logsi.LogVerbose("Applying filter criteria to results list: %s=\"%s\"" % ("artist", filterArtist))
|
|
13215
|
+
filterArtistCompare:str = (filterArtist or "").lower()
|
|
13216
|
+
isFilterUri:bool = SpotifyClient.IsSpotifyUri(filterArtistCompare)
|
|
13217
|
+
# process list in reverse order since we are removing items.
|
|
13218
|
+
for idx in reversed(range(len(result.Items))):
|
|
13219
|
+
track:Track = result.Items[idx]
|
|
13220
|
+
artistFound:bool = False
|
|
13221
|
+
artist:ArtistSimplified = None
|
|
13222
|
+
for artist in track.Artists:
|
|
13223
|
+
if (isFilterUri):
|
|
13224
|
+
if ((artist.Uri or "").lower() == filterArtistCompare):
|
|
13225
|
+
artistFound = True
|
|
13226
|
+
break
|
|
13227
|
+
elif ((artist.Name or "").lower().find(filterArtistCompare) > -1):
|
|
13228
|
+
artistFound = True
|
|
13229
|
+
break
|
|
13230
|
+
if (not artistFound):
|
|
13231
|
+
result.Items.pop(idx)
|
|
13232
|
+
|
|
13233
|
+
# apply album filter criteria.
|
|
13234
|
+
if (filterAlbum is not None):
|
|
13235
|
+
_logsi.LogVerbose("Applying filter criteria to results list: %s=\"%s\"" % ("album", filterAlbum))
|
|
13236
|
+
filterAlbumCompare:str = (filterAlbum or "").lower()
|
|
13237
|
+
isFilterUri:bool = SpotifyClient.IsSpotifyUri(filterAlbumCompare)
|
|
13238
|
+
# process list in reverse order since we are removing items.
|
|
13239
|
+
for idx in reversed(range(len(result.Items))):
|
|
13240
|
+
track:Track = result.Items[idx]
|
|
13241
|
+
albumFound:bool = False
|
|
13242
|
+
album:Album = track.Album
|
|
13243
|
+
if (album is not None):
|
|
13244
|
+
if (isFilterUri):
|
|
13245
|
+
if ((album.Uri or "").lower() == filterAlbumCompare):
|
|
13246
|
+
albumFound = True
|
|
13247
|
+
elif ((album.Name or "").lower().find(filterAlbumCompare) > -1):
|
|
13248
|
+
albumFound = True
|
|
13249
|
+
if (not albumFound):
|
|
13250
|
+
result.Items.pop(idx)
|
|
13251
|
+
|
|
13252
|
+
# apply filter criteria (if specified).
|
|
13253
|
+
if (filterCriteria is not None):
|
|
13254
|
+
_logsi.LogVerbose("Applying filter criteria to results list: \"%s\"" % (filterCriteria))
|
|
13255
|
+
filterCriteriaCompare:str = (filterCriteria or "").lower()
|
|
13256
|
+
isFilterUri:bool = SpotifyClient.IsSpotifyUri(filterCriteriaCompare)
|
|
13257
|
+
# process list in reverse order since we are removing items.
|
|
13258
|
+
for idx in reversed(range(len(result.Items))):
|
|
13259
|
+
item:Track = result.Items[idx]
|
|
13260
|
+
itemFound:bool = False
|
|
13261
|
+
if (isFilterUri):
|
|
13262
|
+
if ((item.Uri or "").lower() == filterCriteriaCompare):
|
|
13263
|
+
itemFound = True
|
|
13264
|
+
elif ((item.Name or "").lower().find(filterCriteriaCompare) > -1):
|
|
13265
|
+
itemFound = True
|
|
13266
|
+
if (not itemFound):
|
|
13267
|
+
result.Items.pop(idx)
|
|
13268
|
+
|
|
13078
13269
|
# trace.
|
|
13079
13270
|
_logsi.LogObject(SILevel.Verbose, (TRACE_METHOD_RESULT_TYPE + result.PagingInfo) % (apiMethodName, type(result).__name__), result, excludeNonPublic=True)
|
|
13080
13271
|
return result
|
|
@@ -39,6 +39,7 @@ class SpotifyWebApiError(Exception):
|
|
|
39
39
|
self._Message:str = message
|
|
40
40
|
self._MethodName:str = methodName
|
|
41
41
|
self._Status:int = status
|
|
42
|
+
self._RetryAfter:int = 0
|
|
42
43
|
|
|
43
44
|
# trace.
|
|
44
45
|
if logsi is not None:
|
|
@@ -95,6 +96,29 @@ class SpotifyWebApiError(Exception):
|
|
|
95
96
|
return self._Status
|
|
96
97
|
|
|
97
98
|
|
|
99
|
+
@property
|
|
100
|
+
def RetryAfter(self) -> int:
|
|
101
|
+
"""
|
|
102
|
+
The number of seconds to wait before retrying a method call that resulted in
|
|
103
|
+
an HTTP status of 429 (rate-limit exceeded).
|
|
104
|
+
|
|
105
|
+
This value is only valid if the HTTP response headers contained a `retry-after` key.
|
|
106
|
+
This usually only happens when HTTP status code = 429.
|
|
107
|
+
|
|
108
|
+
Example: `21`
|
|
109
|
+
"""
|
|
110
|
+
return self._RetryAfter
|
|
111
|
+
|
|
112
|
+
@RetryAfter.setter
|
|
113
|
+
def RetryAfter(self, value:int):
|
|
114
|
+
"""
|
|
115
|
+
Sets the RetryAfter property value.
|
|
116
|
+
"""
|
|
117
|
+
if isinstance(value, int):
|
|
118
|
+
if (value > 0):
|
|
119
|
+
self._RetryAfter = value
|
|
120
|
+
|
|
121
|
+
|
|
98
122
|
def ToString(self) -> str:
|
|
99
123
|
"""
|
|
100
124
|
Returns a UI-friendly string representation of the class.
|