spotifywebapiPython 1.0.242__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. spotifywebapipython/__init__.py +35 -0
  2. spotifywebapipython/const.py +114 -0
  3. spotifywebapipython/docs/__init__.html +2156 -0
  4. spotifywebapipython/docs/codecopy.js +70 -0
  5. spotifywebapipython/docs/index.html +514 -0
  6. spotifywebapipython/docs/search.js +46 -0
  7. spotifywebapipython/docs/spotifywebapipython/const.html +636 -0
  8. spotifywebapipython/docs/spotifywebapipython/saappmessages.html +540 -0
  9. spotifywebapipython/docs/spotifywebapipython/sautils.html +620 -0
  10. spotifywebapipython/docs/spotifywebapipython/spotifyapierror.html +341 -0
  11. spotifywebapipython/docs/spotifywebapipython/spotifyapimessage.html +598 -0
  12. spotifywebapipython/docs/spotifywebapipython/spotifyauthtoken.html +612 -0
  13. spotifywebapipython/docs/spotifywebapipython/spotifyclient.html +16557 -0
  14. spotifywebapipython/docs/spotifywebapipython/spotifydiscovery.html +518 -0
  15. spotifywebapipython/docs/spotifywebapipython/spotifywebapiauthenticationerror.html +421 -0
  16. spotifywebapipython/docs/spotifywebapipython/spotifywebapierror.html +400 -0
  17. spotifywebapipython/docs/spotifywebapipython/spotifywebplayertoken.html +635 -0
  18. spotifywebapipython/docs/spotifywebapipython.ico +0 -0
  19. spotifywebapipython/docs/spotifywebapipython_OLD.ico +0 -0
  20. spotifywebapipython/models/__init__.py +121 -0
  21. spotifywebapipython/models/album.py +170 -0
  22. spotifywebapipython/models/albumpagesaved.py +85 -0
  23. spotifywebapipython/models/albumpagesimplified.py +88 -0
  24. spotifywebapipython/models/albumsaved.py +102 -0
  25. spotifywebapipython/models/albumsimplified.py +308 -0
  26. spotifywebapipython/models/artist.py +146 -0
  27. spotifywebapipython/models/artistinfo.py +282 -0
  28. spotifywebapipython/models/artistinfotourevent.py +127 -0
  29. spotifywebapipython/models/artistpage.py +70 -0
  30. spotifywebapipython/models/artistsimplified.py +163 -0
  31. spotifywebapipython/models/audiobook.py +87 -0
  32. spotifywebapipython/models/audiobookpagesimplified.py +88 -0
  33. spotifywebapipython/models/audiobooksimplified.py +362 -0
  34. spotifywebapipython/models/audiofeatures.py +333 -0
  35. spotifywebapipython/models/author.py +67 -0
  36. spotifywebapipython/models/category.py +168 -0
  37. spotifywebapipython/models/categorypage.py +70 -0
  38. spotifywebapipython/models/chapter.py +84 -0
  39. spotifywebapipython/models/chapterpagesimplified.py +88 -0
  40. spotifywebapipython/models/chaptersimplified.py +387 -0
  41. spotifywebapipython/models/context.py +113 -0
  42. spotifywebapipython/models/copyright.py +79 -0
  43. spotifywebapipython/models/device.py +301 -0
  44. spotifywebapipython/models/episode.py +84 -0
  45. spotifywebapipython/models/episodepagesaved.py +85 -0
  46. spotifywebapipython/models/episodepagesimplified.py +88 -0
  47. spotifywebapipython/models/episodesaved.py +99 -0
  48. spotifywebapipython/models/episodesimplified.py +370 -0
  49. spotifywebapipython/models/explicitcontent.py +80 -0
  50. spotifywebapipython/models/externalids.py +91 -0
  51. spotifywebapipython/models/externalurls.py +104 -0
  52. spotifywebapipython/models/followers.py +81 -0
  53. spotifywebapipython/models/imageobject.py +193 -0
  54. spotifywebapipython/models/imagevibrantcolors.py +182 -0
  55. spotifywebapipython/models/linkedfrom.py +165 -0
  56. spotifywebapipython/models/narrator.py +67 -0
  57. spotifywebapipython/models/owner.py +162 -0
  58. spotifywebapipython/models/pageobject.py +343 -0
  59. spotifywebapipython/models/playeractions.py +196 -0
  60. spotifywebapipython/models/playerlastplayedinfo.py +334 -0
  61. spotifywebapipython/models/playerplaystate.py +467 -0
  62. spotifywebapipython/models/playerqueueinfo.py +207 -0
  63. spotifywebapipython/models/playhistory.py +136 -0
  64. spotifywebapipython/models/playhistorypage.py +85 -0
  65. spotifywebapipython/models/playlist.py +125 -0
  66. spotifywebapipython/models/playlistpage.py +85 -0
  67. spotifywebapipython/models/playlistpagesimplified.py +107 -0
  68. spotifywebapipython/models/playlistsimplified.py +334 -0
  69. spotifywebapipython/models/playlisttrack.py +143 -0
  70. spotifywebapipython/models/playlisttracksummary.py +80 -0
  71. spotifywebapipython/models/recommendationseed.py +135 -0
  72. spotifywebapipython/models/restrictions.py +86 -0
  73. spotifywebapipython/models/resumepoint.py +79 -0
  74. spotifywebapipython/models/searchresponse.py +391 -0
  75. spotifywebapipython/models/searchresultbase.py +299 -0
  76. spotifywebapipython/models/show.py +87 -0
  77. spotifywebapipython/models/showpagesaved.py +85 -0
  78. spotifywebapipython/models/showpagesimplified.py +88 -0
  79. spotifywebapipython/models/showsaved.py +99 -0
  80. spotifywebapipython/models/showsimplified.py +320 -0
  81. spotifywebapipython/models/spotifyconnectdevice.py +321 -0
  82. spotifywebapipython/models/spotifyconnectdevices.py +441 -0
  83. spotifywebapipython/models/track.py +142 -0
  84. spotifywebapipython/models/trackpage.py +110 -0
  85. spotifywebapipython/models/trackpagesaved.py +85 -0
  86. spotifywebapipython/models/trackpagesimplified.py +88 -0
  87. spotifywebapipython/models/trackrecommendations.py +88 -0
  88. spotifywebapipython/models/tracksaved.py +99 -0
  89. spotifywebapipython/models/tracksimplified.py +398 -0
  90. spotifywebapipython/models/userprofile.py +184 -0
  91. spotifywebapipython/models/userprofilesimplified.py +206 -0
  92. spotifywebapipython/models/zeroconfdiscoveryresult.py +592 -0
  93. spotifywebapipython/models/zeroconfproperty.py +93 -0
  94. spotifywebapipython/oauthcli/__init__.py +7 -0
  95. spotifywebapipython/oauthcli/authclient.py +1229 -0
  96. spotifywebapipython/saappmessages.py +86 -0
  97. spotifywebapipython/sautils.py +285 -0
  98. spotifywebapipython/spotifyapierror.py +66 -0
  99. spotifywebapipython/spotifyapimessage.py +269 -0
  100. spotifywebapipython/spotifyauthtoken.py +264 -0
  101. spotifywebapipython/spotifyclient.py +17885 -0
  102. spotifywebapipython/spotifyconnect/__init__.py +19 -0
  103. spotifywebapipython/spotifyconnect/spotifyconnectdeviceeventargs.py +67 -0
  104. spotifywebapipython/spotifyconnect/spotifyconnectdirectorytask.py +2564 -0
  105. spotifywebapipython/spotifyconnect/spotifyconnectzeroconfcastapptask.py +467 -0
  106. spotifywebapipython/spotifyconnect/spotifyconnectzeroconfcastcontroller.py +701 -0
  107. spotifywebapipython/spotifyconnect/spotifyconnectzeroconfcastlistener.py +359 -0
  108. spotifywebapipython/spotifyconnect/spotifyconnectzeroconfcastmultizonelistener.py +212 -0
  109. spotifywebapipython/spotifyconnect/spotifyconnectzeroconfexceptions.py +20 -0
  110. spotifywebapipython/spotifyconnect/spotifyconnectzeroconflistener.py +335 -0
  111. spotifywebapipython/spotifydiscovery.py +473 -0
  112. spotifywebapipython/spotifymediatypes.py +53 -0
  113. spotifywebapipython/spotifywebapiauthenticationerror.py +122 -0
  114. spotifywebapipython/spotifywebapierror.py +106 -0
  115. spotifywebapipython/spotifywebplayertoken.py +743 -0
  116. spotifywebapipython/vibrant/__init__.py +17 -0
  117. spotifywebapipython/vibrant/generator.py +261 -0
  118. spotifywebapipython/vibrant/image.py +100 -0
  119. spotifywebapipython/vibrant/main.py +34 -0
  120. spotifywebapipython/vibrant/models.py +93 -0
  121. spotifywebapipython/vibrant/utils.py +56 -0
  122. spotifywebapipython/zeroconfapi/__init__.py +23 -0
  123. spotifywebapipython/zeroconfapi/authenticationtypes.py +38 -0
  124. spotifywebapipython/zeroconfapi/blobbuilder.py +370 -0
  125. spotifywebapipython/zeroconfapi/credentials.py +37 -0
  126. spotifywebapipython/zeroconfapi/cryptodiffiehellman.py +89 -0
  127. spotifywebapipython/zeroconfapi/helpers.py +64 -0
  128. spotifywebapipython/zeroconfapi/spotifyzeroconfapierror.py +108 -0
  129. spotifywebapipython/zeroconfapi/zeroconfconnect.py +1327 -0
  130. spotifywebapipython/zeroconfapi/zeroconfgetinfo.py +572 -0
  131. spotifywebapipython/zeroconfapi/zeroconfgetinfoalias.py +109 -0
  132. spotifywebapipython/zeroconfapi/zeroconfgetinfodrmmediaformat.py +90 -0
  133. spotifywebapipython/zeroconfapi/zeroconfresponse.py +195 -0
  134. spotifywebapipython-1.0.242.dist-info/LICENSE +22 -0
  135. spotifywebapipython-1.0.242.dist-info/METADATA +219 -0
  136. spotifywebapipython-1.0.242.dist-info/RECORD +138 -0
  137. spotifywebapipython-1.0.242.dist-info/WHEEL +5 -0
  138. spotifywebapipython-1.0.242.dist-info/top_level.txt +1 -0
@@ -0,0 +1,2156 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="generator" content="pdoc 14.3.0"/>
7
+ <title> spotifywebapipython &dash;
8
+ Module Overview
9
+ </title>
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
+ <!-- build env - Package Name = "spotifywebapipython" -->
12
+ <!-- build env - Package Version = "1.0.242" -->
13
+ <!-- pdoc module.modulename = "__init__" -->
14
+ <!-- pdoc module.is_package = "False" -->
15
+ <!-- pdoc root_module_name = "None" -->
16
+ <!-- pdoc namespace levels = "0" -->
17
+ <script type="text/javascript" src="codecopy.js"></script>
18
+
19
+ <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
20
+ <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#49483e}.pdoc-code{background:#272822; color:#f8f8f2}.pdoc-code .c{color:#75715e}.pdoc-code .err{color:#960050; background-color:#1e0010}.pdoc-code .esc{color:#f8f8f2}.pdoc-code .g{color:#f8f8f2}.pdoc-code .k{color:#66d9ef}.pdoc-code .l{color:#ae81ff}.pdoc-code .n{color:#ffc633}.pdoc-code .o{color:#f92672}.pdoc-code .x{color:#f8f8f2}.pdoc-code .p{color:#f8f8f2}.pdoc-code .ch{color:#75715e}.pdoc-code .cm{color:#75715e}.pdoc-code .cp{color:#75715e}.pdoc-code .cpf{color:#75715e}.pdoc-code .c1{color:#75715e}.pdoc-code .cs{color:#75715e}.pdoc-code .gd{color:#f92672}.pdoc-code .ge{color:#f8f8f2; font-style:italic}.pdoc-code .gr{color:#f8f8f2}.pdoc-code .gh{color:#f8f8f2}.pdoc-code .gi{color:#a6e22e}.pdoc-code .go{color:#66d9ef}.pdoc-code .gp{color:#f92672; font-weight:bold}.pdoc-code .gs{color:#f8f8f2; font-weight:bold}.pdoc-code .gu{color:#75715e}.pdoc-code .gt{color:#f8f8f2}.pdoc-code .kc{color:#66d9ef}.pdoc-code .kd{color:#66d9ef}.pdoc-code .kn{color:#f92672}.pdoc-code .kp{color:#66d9ef}.pdoc-code .kr{color:#66d9ef}.pdoc-code .kt{color:#66d9ef}.pdoc-code .ld{color:#e6db74}.pdoc-code .m{color:#ae81ff}.pdoc-code .s{color:#e6db74}.pdoc-code .na{color:#a6e22e}.pdoc-code .nb{color:#f8f8f2}.pdoc-code .nc{color:#a6e22e}.pdoc-code .no{color:#66d9ef}.pdoc-code .nd{color:#a6e22e}.pdoc-code .ni{color:#f8f8f2}.pdoc-code .ne{color:#a6e22e}.pdoc-code .nf{color:#a6e22e}.pdoc-code .nl{color:#f8f8f2}.pdoc-code .nn{color:#f8f8f2}.pdoc-code .nx{color:#a6e22e}.pdoc-code .py{color:#f8f8f2}.pdoc-code .nt{color:#f92672}.pdoc-code .nv{color:#f8f8f2}.pdoc-code .ow{color:#f92672}.pdoc-code .w{color:#f8f8f2}.pdoc-code .mb{color:#ae81ff}.pdoc-code .mf{color:#ae81ff}.pdoc-code .mh{color:#ae81ff}.pdoc-code .mi{color:#ae81ff}.pdoc-code .mo{color:#ae81ff}.pdoc-code .sa{color:#e6db74}.pdoc-code .sb{color:#e6db74}.pdoc-code .sc{color:#e6db74}.pdoc-code .dl{color:#e6db74}.pdoc-code .sd{color:#e6db74}.pdoc-code .s2{color:#e6db74}.pdoc-code .se{color:#ae81ff}.pdoc-code .sh{color:#e6db74}.pdoc-code .si{color:#e6db74}.pdoc-code .sx{color:#e6db74}.pdoc-code .sr{color:#e6db74}.pdoc-code .s1{color:#e6db74}.pdoc-code .ss{color:#e6db74}.pdoc-code .bp{color:#f8f8f2}.pdoc-code .fm{color:#a6e22e}.pdoc-code .vc{color:#f8f8f2}.pdoc-code .vg{color:#f8f8f2}.pdoc-code .vi{color:#f8f8f2}.pdoc-code .vm{color:#f8f8f2}</style>
21
+ <style>/*! theme.css */:root{--pdoc-background:#212529;}.pdoc{--text:#f7f7f7;--muted:#9d9d9d;--link:#58a6ff;--link-hover:#3989ff;--code:#333;--active:#555;--accent:#343434;--accent2:#555;--nav-hover:rgba(0, 0, 0, 0.1);--name:#77C1FF;--def:#0cdd0c;--annotation:#00c037;}</style>
22
+ <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;z-index:999;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem;}.git-button{display:none !important;}nav input[type="search"]{max-width:77%;}nav input[type="search"]:first-child{margin-top:-6px;}nav input[type="search"]:valid ~ *{display:none !important;}}@media (min-width:770px){:root{--sidebar-width:clamp(12.5rem, 28vw, 22rem);}nav{position:fixed;overflow:auto;height:100vh;width:var(--sidebar-width);}main, header{padding:3rem 2rem 3rem calc(var(--sidebar-width) + 3rem);width:calc(54rem + var(--sidebar-width));max-width:100%;}header + main{margin-top:-4rem;}#navtoggle{display:none;}}#togglestate{position:absolute;height:0;opacity:0;}nav.pdoc{--pad:clamp(0.5rem, 2vw, 1.75rem);--indent:1.5rem;background-color:var(--accent);border-right:1px solid var(--accent2);box-shadow:0 0 20px rgba(50, 50, 50, .2) inset;padding:0 0 0 var(--pad);overflow-wrap:anywhere;scrollbar-width:thin; scrollbar-color:var(--accent2) transparent; z-index:1}nav.pdoc::-webkit-scrollbar{width:.4rem; }nav.pdoc::-webkit-scrollbar-thumb{background-color:var(--accent2); }nav.pdoc > div{padding:var(--pad) 0;}nav.pdoc .module-list-button{display:inline-flex;align-items:center;color:var(--text);border-color:var(--muted);margin-bottom:1rem;}nav.pdoc .module-list-button:hover{border-color:var(--text);}nav.pdoc input[type=search]{display:block;outline-offset:0;width:calc(100% - var(--pad));}nav.pdoc .logo{max-width:calc(100% - var(--pad));max-height:35vh;display:block;margin:0 auto 1rem;transform:translate(calc(-.5 * var(--pad)), 0);}nav.pdoc ul{list-style:none;padding-left:0;}nav.pdoc > div > ul{margin-left:calc(0px - var(--pad));}nav.pdoc li a{padding:.2rem 0 .2rem calc(var(--pad) + var(--indent));}nav.pdoc > div > ul > li > a{padding-left:var(--pad);}nav.pdoc li{transition:all 100ms;}nav.pdoc li:hover{background-color:var(--nav-hover);}nav.pdoc a, nav.pdoc a:hover{color:var(--text);}nav.pdoc a{display:block;}nav.pdoc > h2:first-of-type{margin-top:1.5rem;}nav.pdoc .class:before{content:"class ";color:var(--muted);}nav.pdoc .function:after{content:"()";color:var(--muted);}nav.pdoc footer:before{content:"";display:block;width:calc(100% - var(--pad));border-top:solid var(--accent2) 1px;margin-top:1.5rem;padding-top:.5rem;}nav.pdoc footer{font-size:small;}</style>
23
+ <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{cursor:pointer;display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bottom:0;}.pdoc .pdoc-alert-note {color:#084298;background-color:#cfe2ff;border-color:#b6d4fe;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23084298%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8%2016A8%208%200%201%200%208%200a8%208%200%200%200%200%2016zm.93-9.412-1%204.705c-.07.34.029.533.304.533.194%200%20.487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703%200-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381%202.29-.287zM8%205.5a1%201%200%201%201%200-2%201%201%200%200%201%200%202z%22/%3E%3C/svg%3E");}.pdoc .pdoc-alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23664d03%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8.982%201.566a1.13%201.13%200%200%200-1.96%200L.165%2013.233c-.457.778.091%201.767.98%201.767h13.713c.889%200%201.438-.99.98-1.767L8.982%201.566zM8%205c.535%200%20.954.462.9.995l-.35%203.507a.552.552%200%200%201-1.1%200L7.1%205.995A.905.905%200%200%201%208%205zm.002%206a1%201%200%201%201%200%202%201%201%200%200%201%200-2z%22/%3E%3C/svg%3E");}.pdoc .pdoc-alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23842029%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M5.52.359A.5.5%200%200%201%206%200h4a.5.5%200%200%201%20.474.658L8.694%206H12.5a.5.5%200%200%201%20.395.807l-7%209a.5.5%200%200%201-.873-.454L6.823%209.5H3.5a.5.5%200%200%201-.48-.641l2.5-8.5z%22/%3E%3C/svg%3E");}.pdoc .visually-hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important;}.pdoc h1, .pdoc h2, .pdoc h3{font-weight:300;margin:.3em 0;padding:.2em 0;}.pdoc > section:not(.module-info) h1{font-size:1.5rem;font-weight:500;}.pdoc > section:not(.module-info) h2{font-size:1.4rem;font-weight:500;}.pdoc > section:not(.module-info) h3{font-size:1.3rem;font-weight:500;}.pdoc > section:not(.module-info) h4{font-size:1.2rem;}.pdoc > section:not(.module-info) h5{font-size:1.1rem;}.pdoc a{text-decoration:none;color:var(--link);}.pdoc a:hover{color:var(--link-hover);}.pdoc blockquote{margin-left:2rem;}.pdoc pre{border-top:1px solid var(--accent2);border-bottom:1px solid var(--accent2);margin-top:0;margin-bottom:1em;padding:.5rem 0 .5rem .5rem;overflow-x:auto;background-color:var(--code);}.pdoc code{color:var(--text);padding:.2em .4em;margin:0;font-size:85%;background-color:var(--accent);border-radius:6px;}.pdoc a > code{color:inherit;}.pdoc pre > code{display:inline-block;font-size:inherit;background:none;border:none;padding:0;}.pdoc > section:not(.module-info){margin-bottom:1.5rem;}.pdoc .modulename{margin-top:0;font-weight:bold;}.pdoc .modulename a{color:var(--link);transition:100ms all;}.pdoc .git-button{float:right;border:solid var(--link) 1px;}.pdoc .git-button:hover{background-color:var(--link);color:var(--pdoc-background);}.view-source-toggle-state,.view-source-toggle-state ~ .pdoc-code{display:none;}.view-source-toggle-state:checked ~ .pdoc-code{display:block;}.view-source-button{display:inline-block;float:right;font-size:.75rem;line-height:1.5rem;color:var(--muted);padding:0 .4rem 0 1.3rem;cursor:pointer;text-indent:-2px;}.view-source-button > span{visibility:hidden;}.module-info .view-source-button{float:none;display:flex;justify-content:flex-end;margin:-1.2rem .4rem -.2rem 0;}.view-source-button::before{position:absolute;content:"View Source";display:list-item;list-style-type:disclosure-closed;}.view-source-toggle-state:checked ~ .attr .view-source-button::before,.view-source-toggle-state:checked ~ .view-source-button::before{list-style-type:disclosure-open;}.pdoc .docstring{margin-bottom:1.5rem;}.pdoc section:not(.module-info) .docstring{margin-left:clamp(0rem, 5vw - 2rem, 1rem);}.pdoc .docstring .pdoc-code{margin-left:1em;margin-right:1em;}.pdoc h1:target,.pdoc h2:target,.pdoc h3:target,.pdoc h4:target,.pdoc h5:target,.pdoc h6:target,.pdoc .pdoc-code > pre > span:target{background-color:var(--active);box-shadow:-1rem 0 0 0 var(--active);}.pdoc .pdoc-code > pre > span:target{display:block;}.pdoc div:target > .attr,.pdoc section:target > .attr,.pdoc dd:target > a{background-color:var(--active);}.pdoc *{scroll-margin:2rem;}.pdoc .pdoc-code .linenos{user-select:none;}.pdoc .attr:hover{filter:contrast(0.95);}.pdoc section, .pdoc .classattr{position:relative;}.pdoc .headerlink{--width:clamp(1rem, 3vw, 2rem);position:absolute;top:0;left:calc(0rem - var(--width));transition:all 100ms ease-in-out;opacity:0;}.pdoc .headerlink::before{content:"#";display:block;text-align:center;width:var(--width);height:2.3rem;line-height:2.3rem;font-size:1.5rem;}.pdoc .attr:hover ~ .headerlink,.pdoc *:target > .headerlink,.pdoc .headerlink:hover{opacity:1;}.pdoc .attr{display:block;margin:.5rem 0 .5rem;padding:.4rem .4rem .4rem 1rem;background-color:var(--accent);overflow-x:auto;}.pdoc .classattr{margin-left:2rem;}.pdoc .name{color:var(--name);font-weight:bold;}.pdoc .def{color:var(--def);font-weight:bold;}.pdoc .signature{background-color:transparent;}.pdoc .param, .pdoc .return-annotation{white-space:pre;}.pdoc .signature.multiline .param{display:block;}.pdoc .signature.condensed .param{display:inline-block;}.pdoc .annotation{color:var(--annotation);}.pdoc .view-value-toggle-state,.pdoc .view-value-toggle-state ~ .default_value{display:none;}.pdoc .view-value-toggle-state:checked ~ .default_value{display:inherit;}.pdoc .view-value-button{font-size:.5rem;vertical-align:middle;border-style:dashed;margin-top:-0.1rem;}.pdoc .view-value-button:hover{background:white;}.pdoc .view-value-button::before{content:"show";text-align:center;width:2.2em;display:inline-block;}.pdoc .view-value-toggle-state:checked ~ .view-value-button::before{content:"hide";}.pdoc .inherited{margin-left:2rem;}.pdoc .inherited dt{font-weight:700;}.pdoc .inherited dt, .pdoc .inherited dd{display:inline;margin-left:0;margin-bottom:.5rem;}.pdoc .inherited dd:not(:last-child):after{content:", ";}.pdoc .inherited .class:before{content:"class ";}.pdoc .inherited .function a:after{content:"()";}.pdoc .search-result .docstring{overflow:auto;max-height:25vh;}.pdoc .search-result.focused > .attr{background-color:var(--active);}.pdoc .attribution{margin-top:2rem;display:block;opacity:0.5;transition:all 200ms;filter:grayscale(100%);}.pdoc .attribution:hover{opacity:1;filter:grayscale(0%);}.pdoc .attribution img{margin-left:5px;height:35px;vertical-align:middle;width:70px;transition:all 200ms;}.pdoc table{display:block;width:max-content;max-width:100%;overflow:auto;margin-bottom:1rem;}.pdoc table th{font-weight:600;}.pdoc table th, .pdoc table td{padding:6px 13px;border:1px solid var(--accent2);}</style>
24
+ <style>/*! custom.css */.deprecated{ color:#f62817; font-weight:bolder;}.warning{ color:orange; font-weight:normal;}.modulename{color:#58a6ff;}.signature .param span{color:#ffc633;}.docstring #arguments ~ ul strong{color:#ffc633;}.docstring #raises ~ ul strong{color:#f62817 !important;}#change-log ~ h6{ color:#ffc633;}details summary{ color:#58a6ff;}.footertext{ color:#58a6ff;}.pdoc .docstring .pdoc-code{ margin-left:0; margin-right:0;}div.codehilite{ background-color:var(--code); border-bottom:1px solid var(--accent2);}div.codehilite button{ color:var(--link); background:var(--pdoc-background); background-color:var(--code); border:none; box-sizing:border-box; transition:0.2s ease-out; cursor:pointer; user-select:none; padding:5px 10px; font-size:0.8em; z-index:9999; margin:2px; border-radius:0 0.15rem;}div.codehilite pre{ margin-bottom:0px;}</style></head>
25
+ <body>
26
+ <nav class="pdoc">
27
+ <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
28
+ <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
29
+ <div> <a class="pdoc-button module-list-button" href="index.html">
30
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
31
+ <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
32
+ <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
33
+ </svg> &nbsp;
34
+ Module Index
35
+ </a>
36
+
37
+
38
+ <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
39
+ pattern=".+" required>
40
+
41
+ <h2>Contents</h2>
42
+ <ul>
43
+ <li><a href="#overview">Overview</a></li>
44
+ <li><a href="#features">Features</a></li>
45
+ <li><a href="#requirements-and-dependencies">Requirements and Dependencies</a></li>
46
+ <li><a href="#documentation">Documentation</a></li>
47
+ <li><a href="#installation">Installation</a></li>
48
+ <li><a href="#quick-start-sample-code">Quick-Start Sample Code</a></li>
49
+ <li><a href="#licensing">Licensing</a></li>
50
+ <li><a href="#logging-tracing-support">Logging / Tracing Support</a></li>
51
+ <li><a href="#contributing">Contributing</a></li>
52
+ <li><a href="#change-log">Change Log</a></li>
53
+ </ul>
54
+
55
+
56
+
57
+ <h2>API Documentation</h2>
58
+ <ul class="memberlist">
59
+ </ul>
60
+
61
+
62
+ <footer class="footertext">
63
+ spotifywebapipython</br>
64
+ Version 1.0.242</br>
65
+ <a href="https://developer.spotify.com/documentation/web-api" target="_blank">
66
+ <img src="spotifywebapipython.ico" alt="brand icon" style="width:32px; height:32px; padding:4px;"/>
67
+ A Spotify Web Api Client
68
+ </a>
69
+ </footer>
70
+
71
+ <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev" target="_blank">
72
+ built with <span class="visually-hidden">pdoc</span><img
73
+ alt="pdoc logo"
74
+ src="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"/>
75
+ </a>
76
+ </div>
77
+ </nav>
78
+ <main class="pdoc">
79
+ <section class="module-info">
80
+ <h1 style="display:none;" class="modulename">__init__</h1>
81
+
82
+ <div class="docstring"><h1 class="modulename">
83
+ Spotify Web API Python3 Library
84
+ </h1>
85
+
86
+ <h2 id="overview">Overview</h2>
87
+
88
+ <p>This API provides Python programmers the ability to retrieve information from the Spotify Web API from any program written in Python 3. It also allows player control via Spotify Connect devices.</p>
89
+
90
+ <p>More information about the Spotify Web API can be found on the <a href="https://developer.spotify.com/documentation/web-api" target="_blank">Spotify Developer Portal page</a>.</p>
91
+
92
+ <p><em>IMPORTANT</em>
93
+ This API assumes you will adhere to all of the terms set forth in the <a href="https://developer.spotify.com/terms" target="_blank">Spotify Developer Terms of Use</a>. The developers of this API are not responsible for misuse of the underlying Spotify Web API.</p>
94
+
95
+ <h2 id="features">Features</h2>
96
+
97
+ <p>This API supports all of the features of the Spotify Web API including access to all end points, and support for user authorization with scope(s). Check out the <a href="https://developer.spotify.com/documentation/web-api">Spotify Web API documentation</a> page for more details.</p>
98
+
99
+ <p>The following features are supported by this API.</p>
100
+
101
+ <ul>
102
+ <li>Authorization: Token generation (Authorization Code, Authorization Code PKCE, Client Credentials) with Scope(s), auto token storage and renewal.</li>
103
+ <li>Albums: Get Album(s), Get Album Tracks, User Favorites (Get,Add,Remove,Check), Get New Releases.</li>
104
+ <li>Artists: Get Artist(s), Get Artist's Albums, Get Artist's Top Tracks, Get Related Artists.</li>
105
+ <li>Audiobooks: Get Audiobook(s), Get Audiobook Chapters, User Favorites (Get,Add,Remove,Check).</li>
106
+ <li>Categories: Get Several Browse Categories, Get Single Browse Category.</li>
107
+ <li>Chapters: Get a Chapter, Get Several Chapters.</li>
108
+ <li>Episodes: Get Episode(s), User Favorites (Get,Add,Remove,Check).</li>
109
+ <li>Genres: Get Available Genre Seeds.</li>
110
+ <li>Markets: Get Available Markets.</li>
111
+ <li>Player: Get Playback State, Transfer Playback, Get Available Devices, Get Currently Playing Track, Start/Resume/Pause/Skip/Seek/Repeat/Shuffle/Volume Playback, Get Recently Played Tracks, Get the User's Queue, Add Item to Playback Queue.</li>
112
+ <li>Playlists: Get Playlist(s), Change Playlist Details, Get/Update/Add/Remove Playlist Items, Get Favorites, Get User's Playlists, Create Playlist, Get Featured Playlists, Get Category's Playlists, Get Playlist Cover Image, Add Custom Playlist Cover Image</li>
113
+ <li>Search: Search for Albums/Artists/Audiobooks/Episodes/Playlists/Shows/Tracks.</li>
114
+ <li>Shows: Get Show(s), Get Show Episodes, User Favorites (Get,Add,Remove,Check).</li>
115
+ <li>Tracks: Get Track(s), User Favorites (Get,Add,Remove,Check), Get Track(s) Audio Features, Recommendations, Analysis.</li>
116
+ <li>Users: Get Current/Another User's Profile, Get Top Items, Favorites (Follow,Unfollow,Check) Artists/Playlist/Users.</li>
117
+ <li>Supports caching of rarely changed configuration data: Categories, Devices, Genres, Markets, UserProfile, etc.</li>
118
+ <li>... and more</li>
119
+ </ul>
120
+
121
+ <h2 id="requirements-and-dependencies">Requirements and Dependencies</h2>
122
+
123
+ <p>The following requirements must be met in order to utilize this API:</p>
124
+
125
+ <ul>
126
+ <li>You must have a Spotify account (free or premium). Note that some API functions require a PREMIUM account in order to work. Check the <a href="https://developer.spotify.com/documentation/web-api/reference/transfer-a-users-playback">Spotify Developer Documentation</a> pages for more details.</li>
127
+ <li>You will need to create a Spotify App in order to access the Spotify Web API. An App provides the Client ID and Client Secret needed to request an access token by implementing any of the OAuth2 authorization flows. More information about creating an application can be found on the Spotify <a href="https://developer.spotify.com/documentation/web-api/tutorials/getting-started">Getting started with Web API</a> page.</li>
128
+ </ul>
129
+
130
+ <p>The following Python-related requirements must be met in order to utilize this API:</p>
131
+
132
+ <ul>
133
+ <li>Python 3.9 or greater (Python 2 not supported).</li>
134
+ </ul>
135
+
136
+ <h2 id="documentation">Documentation</h2>
137
+
138
+ <p>Documentation is located in the package library under the 'docs' folder; use the index.html as your starting point.
139
+ You can also view the latest docs on the <a href="https://spotifywebapipython.readthedocs.io/en/latest/__init__.html" target="_blank">readthedocs web-site</a>.</p>
140
+
141
+ <h2 id="installation">Installation</h2>
142
+
143
+ <p>This module can be easily installed via pip:</p>
144
+
145
+ <div class="pdoc-code codehilite">
146
+ <pre><span></span><code>$<span class="w"> </span>python3<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>spotifywebapipython
147
+ </code></pre>
148
+ </div>
149
+
150
+ <h2 id="quick-start-sample-code">Quick-Start Sample Code</h2>
151
+
152
+ <p>Almost every method is documented with sample code; just click on the "Sample Code" links under the method, and use the "Copy to Clipboard" functionality to copy / paste.</p>
153
+
154
+ <p>Check out the following classes to get you started:</p>
155
+
156
+ <ul>
157
+ <li><code><a href="spotifywebapipython/spotifyclient.html#SpotifyClient">spotifywebapipython.spotifyclient.SpotifyClient</a></code> - main client class.</li>
158
+ </ul>
159
+
160
+ <h2 id="licensing">Licensing</h2>
161
+
162
+ <p>This project is licensed and distributed under the terms of the MIT End-User License Agreement (EULA) license.</p>
163
+
164
+ <h2 id="logging-tracing-support">Logging / Tracing Support</h2>
165
+
166
+ <p>The SmartInspectPython package (installed with this package) can be used to easily debug your applications that utilize this API.</p>
167
+
168
+ <p>The following topics and code samples will get you started on how to enable logging support. <br />
169
+ Note that logging support can be turned on and off without changing code or restarting the application. <br />
170
+ Click on the topics below to expand the section and reveal more information. </p>
171
+
172
+ <p><details>
173
+ <summary>Configure Logging Support Settings File</summary>
174
+ <br/>
175
+ Add the following lines to a new file (e.g. "smartinspect.cfg") in your application startup / test directory. <br />
176
+ Note the file name can be whatever you like, just specify it on the call to <code>SiAuto.Si.LoadConfiguration()</code> when initializing the logger.</p>
177
+
178
+ <div class="pdoc-code codehilite">
179
+ <pre><span></span><code><span class="c1">; smartinspect.cfg</span>
180
+
181
+ <span class="c1">; SmartInspect Logging Configuration General settings.</span>
182
+ <span class="c1">; - &quot;Enabled&quot; parameter to turn logging on (True) or off (False).</span>
183
+ <span class="c1">; - &quot;Level&quot; parameter to control the logging level (Debug|Verbose|Message|Warning|Error).</span>
184
+ <span class="c1">; - &quot;AppName&quot; parameter to control the application name.</span>
185
+ <span class="na">Enabled</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">False</span><span class="w"> </span>
186
+ <span class="na">Level</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">Verbose</span>
187
+ <span class="na">DefaultLevel</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">Debug</span>
188
+ <span class="na">AppName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">My Application Name</span>
189
+
190
+ <span class="c1">; SmartInspect Logging Configuration Output settings.</span>
191
+ <span class="c1">; - Log to SmartInspect Console Viewer running on the specified network address.</span>
192
+ <span class="na">Connections</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">tcp(host=192.168.1.1,port=4228,timeout=5000,reconnect=true,reconnect.interval=10s,async.enabled=true)</span>
193
+ <span class="c1">; - Log to a file, keeping 14 days worth of logs.</span>
194
+ <span class="c1">;Connections = &quot;file(filename=\&quot;./tests/logfiles/logfile.log\&quot;, rotate=daily, maxparts=14, append=true)&quot;</span>
195
+ <span class="c1">; - Log to an encrypted file, keeping 14 days worth of logs.</span>
196
+ <span class="c1">;Connections = &quot;file(filename=\&quot;./tests/logfiles/logfileEncrypted.sil\&quot;, encrypt=true, key=&quot;&quot;1234567890123456&quot;&quot;, rotate=daily, maxparts=14, append=true)&quot;</span>
197
+
198
+ <span class="c1">; set defaults for new sessions</span>
199
+ <span class="c1">; note that session defaults do not apply to the SiAuto.Main session, since</span>
200
+ <span class="c1">; this session was already added before a configuration file can be loaded. </span>
201
+ <span class="c1">; session defaults only apply to newly added sessions and do not affect existing sessions.</span>
202
+ <span class="na">SessionDefaults.Active</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">True</span>
203
+ <span class="na">SessionDefaults.Level</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">Message</span>
204
+ <span class="na">SessionDefaults.ColorBG</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">0xFFFFFF</span>
205
+
206
+ <span class="c1">; configure some individual session properties.</span>
207
+ <span class="c1">; note that this does not add the session to the sessionmanager; it simply</span>
208
+ <span class="c1">; sets the property values IF the session name already exists.</span>
209
+ <span class="na">Session.Main.Active</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">True</span>
210
+ <span class="na">Session.Main.ColorBG</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">0xFFFFFF</span>
211
+ </code></pre>
212
+ </div>
213
+
214
+ <p></details></p>
215
+
216
+ <p><details>
217
+ <summary>Initialize Logging Support, MAIN module</summary>
218
+ <br/>
219
+ Add the following lines to your program startup module. <br />
220
+ This will import the necessary package modules, and initialize logging support. <br />
221
+ NOTE - This code should only be executed one time! </p>
222
+
223
+ <div class="pdoc-code codehilite">
224
+ <pre><span></span><code><span class="c1"># load SmartInspect settings from a configuration settings file.</span>
225
+ <span class="kn">from</span><span class="w"> </span><span class="nn">smartinspectpython.siauto</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</span>
226
+ <span class="n">siConfigPath</span><span class="p">:</span><span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;./tests/smartinspect.cfg&quot;</span>
227
+ <span class="n">SIAuto</span><span class="o">.</span><span class="n">Si</span><span class="o">.</span><span class="n">LoadConfiguration</span><span class="p">(</span><span class="n">siConfigPath</span><span class="p">)</span>
228
+
229
+ <span class="c1"># start monitoring the configuration file for changes, and reload it when it changes.</span>
230
+ <span class="c1"># this will check the file for changes every 60 seconds.</span>
231
+ <span class="n">siConfig</span><span class="p">:</span><span class="n">SIConfigurationTimer</span> <span class="o">=</span> <span class="n">SIConfigurationTimer</span><span class="p">(</span><span class="n">SIAuto</span><span class="o">.</span><span class="n">Si</span><span class="p">,</span> <span class="n">siConfigPath</span><span class="p">)</span>
232
+
233
+ <span class="c1"># get smartinspect logger reference.</span>
234
+ <span class="n">_logsi</span><span class="p">:</span><span class="n">SISession</span> <span class="o">=</span> <span class="n">SIAuto</span><span class="o">.</span><span class="n">Main</span>
235
+
236
+ <span class="c1"># log system environment and application startup parameters.</span>
237
+ <span class="n">_logsi</span><span class="o">.</span><span class="n">LogSeparator</span><span class="p">(</span><span class="n">SILevel</span><span class="o">.</span><span class="n">Fatal</span><span class="p">)</span>
238
+ <span class="n">_logsi</span><span class="o">.</span><span class="n">LogAppDomain</span><span class="p">(</span><span class="n">SILevel</span><span class="o">.</span><span class="n">Verbose</span><span class="p">)</span>
239
+ <span class="n">_logsi</span><span class="o">.</span><span class="n">LogSystem</span><span class="p">(</span><span class="n">SILevel</span><span class="o">.</span><span class="n">Verbose</span><span class="p">)</span>
240
+ </code></pre>
241
+ </div>
242
+
243
+ <p></details></p>
244
+
245
+ <p><details>
246
+ <summary>Initialize Logging Support, CLASS or sub-modules</summary>
247
+ <br/>
248
+ Add the following lines to your program supporting modules. <br />
249
+ This will import the necessary package modules, and initialize the shared logging session. </p>
250
+
251
+ <div class="pdoc-code codehilite">
252
+ <pre><span></span><code><span class="c1"># get smartinspect logger reference.</span>
253
+ <span class="kn">from</span><span class="w"> </span><span class="nn">smartinspectpython.siauto</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</span>
254
+ <span class="n">_logsi</span><span class="p">:</span><span class="n">SISession</span> <span class="o">=</span> <span class="n">SIAuto</span><span class="o">.</span><span class="n">Main</span>
255
+ </code></pre>
256
+ </div>
257
+
258
+ <p></details></p>
259
+
260
+ <p><details>
261
+ <summary>More Information on SmartInspect</summary>
262
+ <br/>
263
+ You can use SmartInspectPython by itself to create log files for your own applications. <br />
264
+ Use the following PIP command to install the SmartInspectPython package from PyPi.org: <br />
265
+ <div class="pdoc-code codehilite">
266
+ <pre><span></span><code>$<span class="w"> </span>python3<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>smartinspectpython
267
+ </code></pre>
268
+ </div></p>
269
+
270
+ <p>The SmarrtInspect Redistributable Console Viewer (free) is required to view SmartInspect Log (.sil) formatted log files, as well capture packets via the TcpProtocol or PipeProtocol connections. The Redistributable Console Viewer can be downloaded from the <a href="https://code-partners.com/offerings/smartinspect/releases/" target="_blank">Code-Partners Software Downloads Page</a>. Note that the "Redistributable Console Viewer" is a free product, while the "SmartInspect Full Setup" is the Professional level viewer that adds a few more bells and whistles for a fee. Also note that a Console Viewer is NOT required to view plain text (non .sil) formatted log files.
271
+ </details></p>
272
+
273
+ <h2 id="contributing">Contributing</h2>
274
+
275
+ <p>Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are <strong>greatly appreciated</strong>.</p>
276
+
277
+ <p>If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement".</p>
278
+
279
+ <ol>
280
+ <li>Fork the Project</li>
281
+ <li>Create your Feature Branch <code>git checkout -b feature/AmazingFeature</code></li>
282
+ <li>Commit your Changes <code>git commit -m 'Add some AmazingFeature'</code></li>
283
+ <li>Push to the Branch <code>git push origin feature/AmazingFeature</code></li>
284
+ <li>Open a Pull Request</li>
285
+ </ol>
286
+
287
+ <hr />
288
+
289
+ <p><details>
290
+ <summary>View Change Log</summary></p>
291
+
292
+ <h2 id="change-log">Change Log</h2>
293
+
294
+ <p>All notable changes to this project are listed here. </p>
295
+
296
+ <p>Change are listed in reverse chronological order (newest to oldest). </p>
297
+
298
+ <p><span class="changelog"></p>
299
+
300
+ <h6 id="10242-20250913">[ 1.0.242 ] - 2025/09/13</h6>
301
+
302
+ <ul>
303
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayContext</code> method (correctly this time!) to restore shuffle mode after play is started. Some players (e.g. HA SpotifyConnect AddOn, librespot, etc) reset the shuffle setting when starting context play.</li>
304
+ </ul>
305
+
306
+ <h6 id="10241-20250913">[ 1.0.241 ] - 2025/09/13</h6>
307
+
308
+ <ul>
309
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayContext</code> method to restore shuffle mode after play is started. Some players (e.g. HA SpotifyConnect AddOn, librespot, etc) reset the shuffle setting when starting context play.</li>
310
+ </ul>
311
+
312
+ <h6 id="10240-20250913">[ 1.0.240 ] - 2025/09/13</h6>
313
+
314
+ <ul>
315
+ <li>Updated <code>SpotifyClient</code> <code>PlayerMediaPlayTracks</code> and <code>PlayerMediaPlayContext</code> methods to check if player is active and not restricted prior to setting shuffle mode. This should correct the <code>Restriction violated</code> errors when calling these methods.</li>
316
+ </ul>
317
+
318
+ <h6 id="10239-20250830">[ 1.0.239 ] - 2025/08/30</h6>
319
+
320
+ <ul>
321
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayTrackFavorites</code> method to activate the specified (or default) device if it not currently active. This will correct the <code>404 - Device not found</code> error if the device is not currently active.</li>
322
+ </ul>
323
+
324
+ <h6 id="10238-20250824">[ 1.0.238 ] - 2025/08/24</h6>
325
+
326
+ <ul>
327
+ <li>Added support for <a href="https://github.com/devgianlu/go-librespot"><code>go-librespot</code></a> clients.</li>
328
+ </ul>
329
+
330
+ <h6 id="10237-20250818">[ 1.0.237 ] - 2025/08/18</h6>
331
+
332
+ <ul>
333
+ <li>Added model <code>PlayerLastPlayedInfo</code>. Contains information about the content that was last playing on the Spotify Player, including context, item (track / episode), progress, and active device. This is a helper object, and is not part of the Spotify Web API specification.</li>
334
+ <li>Added property <code>SpotifyClient.PlayerLastPlayedInfo</code>; Contains information about the content that was last playing on the Spotify Player. This property is updated when calls are made to the <code>GetDevicePlaybackState</code> and <code>GetPlayerPlaybackState</code> methods.</li>
335
+ <li>Updated method <code>SpotifyClient.PlayerMediaPlayContext</code> to fix <code>Malformed JSON</code> errors that would occur if the <code>positionMS</code> argument was used.</li>
336
+ <li>Updated method <code>SpotifyClient.PlayerTransferPlayback</code> to utilize the new <code>PlayerLastPlayedInfo</code> class to resume play when there is no active device. The track favorites will be used if there is no last played information set.</li>
337
+ </ul>
338
+
339
+ <h6 id="10236-20250810">[ 1.0.236 ] - 2025/08/10</h6>
340
+
341
+ <ul>
342
+ <li>Changed the <code>SpotifyClient.PlayerMediaPlayTrackFavorites</code> method to default the shuffle argument to <code>null</code>. Specify the following for the <code>shuffle</code> argument: True to set player shuffle mode to on; False to set player shuffle mode to off; null to leave the shuffle mode as-is. Default is null.</li>
343
+ <li>Added Google Cast <code>MultiZoneListener</code> support to better determine cast group leadership status.</li>
344
+ </ul>
345
+
346
+ <h6 id="10235-20250804">[ 1.0.235 ] - 2025/08/04</h6>
347
+
348
+ <ul>
349
+ <li>Updated the following <code>SpotifyClient</code> methods to support <a href="https://developer.spotify.com/documentation/web-api/concepts/track-relinking">Spotify Track Re-Linking</a> functionality: <code>GetPlayerPlaybackState</code>, <code>GetPlayerNowPlaying</code>. Prior to this fix, the calls were not returning <code>linked_from</code> results.</li>
350
+ </ul>
351
+
352
+ <h6 id="10234-20250802">[ 1.0.234 ] - 2025/08/02</h6>
353
+
354
+ <ul>
355
+ <li>Updated the following <code>SpotifyClient</code> methods to support <a href="https://developer.spotify.com/documentation/web-api/concepts/track-relinking">Spotify Track Re-Linking</a> functionality: <code>GetAlbum</code>, <code>GetAlbums</code>, <code>GetAlbumTracks</code>, <code>GetPlaylistItems</code>, <code>GetTrack</code>, <code>GetTracks</code>, <code>GetTrackFavorites</code>.</li>
356
+ <li>Added model <code>LinkedFrom</code>. Part of the response when Track Relinking is applied, and the requested track has been replaced with different track. The track in the <code>linked_from</code> object contains information about the originally requested track.</li>
357
+ <li>Added <code>TrackSimplified.IdOrigin</code> property that contains the origin Spotify ID for the track. The <code>LinkedFrom.Id</code> value is returned if present; otherwise, the <code>Id</code> value is returned. This is a helper property, and is not part of the Spotify Web API specification.</li>
358
+ <li>Added <code>TrackSimplified.UriOrigin</code> property that contains the origin Spotify URI for the track. The <code>LinkedFrom.Uri</code> value is returned if present; otherwise, the <code>Uri</code> value is returned. This is a helper property, and is not part of the Spotify Web API specification.</li>
359
+ <li>Added <code>TrackSimplified.IsLinkedFrom</code> property that determines whether or not the track is linked from another track (True) or not (False). This is a helper property, and is not part of the Spotify Web API specification.</li>
360
+ <li>Added <code>TrackSimplified.LinkedFrom</code> property that is part of the response when Track Relinking is applied, and the requested track has been replaced with a different track. The track in the LinkedFrom object contains information about the originally requested track.</li>
361
+ </ul>
362
+
363
+ <h6 id="10233-20250727">[ 1.0.233 ] - 2025/07/27</h6>
364
+
365
+ <ul>
366
+ <li>Updated package requirement from <code>smartinspectpython&gt;=3.0.37</code> to <code>smartinspectpython&gt;=3.0.38</code>.</li>
367
+ <li>Rebuilt package due to PDoc build error.</li>
368
+ </ul>
369
+
370
+ <h6 id="10232-20250727">[ 1.0.232 ] - 2025/07/27</h6>
371
+
372
+ <ul>
373
+ <li>Updated package requirement from <code>smartinspectpython&gt;=3.0.37</code> to <code>smartinspectpython&gt;=3.0.38</code>.</li>
374
+ </ul>
375
+
376
+ <h6 id="10231-20250725">[ 1.0.231 ] - 2025/07/25</h6>
377
+
378
+ <ul>
379
+ <li>Updated internal code to utilize Spotify media types enumeration (<code>SpotifyMediaTypes</code>).</li>
380
+ </ul>
381
+
382
+ <h6 id="10230-20250725">[ 1.0.230 ] - 2025/07/25</h6>
383
+
384
+ <ul>
385
+ <li>Added <code>SpotifyMediaTypes</code> class; Spotify media types enumeration.</li>
386
+ </ul>
387
+
388
+ <h6 id="10229-20250724">[ 1.0.229 ] - 2025/07/24</h6>
389
+
390
+ <ul>
391
+ <li>Added <code>SpotifyClient.Search</code> method; Get Spotify catalog information about albums, artists, playlists, tracks, shows, episodes or audiobooks that match a keyword string. This allows you to search ALL criteria types with one call, but only supports auto-pagination. Use the individual search type methods if you want to employ pagination techniques for searching.</li>
392
+ </ul>
393
+
394
+ <h6 id="10228-20250723">[ 1.0.228 ] - 2025/07/23</h6>
395
+
396
+ <ul>
397
+ <li>Updated Google Cast processing to transfer control to the deviceId that was activated, as well as send other player commands to the activated device. The actual deviceId that was activated may be different than the requested deviceId. This can sometimes occur when activating a group, as getInfoResponse will return the deviceId of the group coordinator instead of the deviceId of the group itself.</li>
398
+ </ul>
399
+
400
+ <h6 id="10227-20250722">[ 1.0.227 ] - 2025/07/22</h6>
401
+
402
+ <ul>
403
+ <li>Updated Google Cast processing to transfer control to the deviceId that was activated. The actual deviceId that was activated may be different than the requested deviceId. This can sometimes occur when activating a group, as getInfoResponse will return the deviceId of the group coordinator instead of the deviceId of the group itself.</li>
404
+ </ul>
405
+
406
+ <h6 id="10226-20250719">[ 1.0.226 ] - 2025/07/19</h6>
407
+
408
+ <ul>
409
+ <li>Updated Google Cast zeroconf message processing to ignore IP address changes for cast group notifications; we want the first device discovered in the group to be the coordinator by default. </li>
410
+ </ul>
411
+
412
+ <h6 id="10225-20250718">[ 1.0.225 ] - 2025/07/18</h6>
413
+
414
+ <ul>
415
+ <li>Updated <code>SpotifyConnectDirectoryTask.ActivateCastAppSpotify</code> method to use the discovery result ip address (instead of the host address from the multi-zone status result). The multi-zone status results were returning IPV6 formatted addresses, which was causing issues if the device was originally activated using an IPV4 address!</li>
416
+ </ul>
417
+
418
+ <h6 id="10224-20250718">[ 1.0.224 ] - 2025/07/18</h6>
419
+
420
+ <ul>
421
+ <li>Added support for <code>interactionIDs</code> argument in various Google Cast message payloads.</li>
422
+ <li>Added support for <code>hashedUserName</code> argument in Google Cast <code>addUser</code> message payloads.</li>
423
+ </ul>
424
+
425
+ <h6 id="10223-20250712">[ 1.0.223 ] - 2025/07/12</h6>
426
+
427
+ <ul>
428
+ <li>Added <code>SpotifyClient.IsSpotifyUri</code> method to determine if a value is a Spotify URI (true) or not (false).</li>
429
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayContext</code> method to improve shuffle functionality.</li>
430
+ </ul>
431
+
432
+ <h6 id="10222-20250702">[ 1.0.222 ] - 2025/07/02</h6>
433
+
434
+ <ul>
435
+ <li>Updated requirements: from <code>urllib3&gt;=1.21.1,&lt;1.27</code> to <code>urllib3&gt;=2.0</code>. Due to Home Assistant Core 2025.7.0 update requirements.</li>
436
+ </ul>
437
+
438
+ <h6 id="10221-20250628">[ 1.0.221 ] - 2025/06/28</h6>
439
+
440
+ <ul>
441
+ <li>Updated <code>SpotifyConnectZeroconfCastListener._GetZeroconfDiscoveryResult</code> method to remove IPV4 host resolution, as both IPV4 and IPV6 are supported types for casting. The <code>get_multizone_status</code> call will only return IPV6 information in some instances anyway.</li>
442
+ <li>Updated <code>SpotifyConnectDirectoryTask.ActivateCastAppSpotify</code> method to increase wait times for cast objects to become available. More time is needed for cast group processing.</li>
443
+ <li>Updated calls made to <code>SpotifyConnectDeviceNotFound</code> to include the <code>logsi=</code> parameter, so that trace dumps are not generated in the system logger.</li>
444
+ </ul>
445
+
446
+ <h6 id="10220-20250626">[ 1.0.220 ] - 2025/06/26</h6>
447
+
448
+ <ul>
449
+ <li>Updated requirements: restored <code>urllib3&gt;=1.21.1,&lt;1.27</code> from <code>urllib3&gt;=2.0</code> due to Home Assistant issues.</li>
450
+ </ul>
451
+
452
+ <h6 id="10219-20250625">[ 1.0.219 ] - 2025/06/25</h6>
453
+
454
+ <ul>
455
+ <li>Updated <code>SpotifyConnectZeroconfCastController.launch_app</code> method to add a slight delay before we query the Spotify Cast App for Spotify Connect device information. This should allow time for devices whose group leader has changed to promote the change throughout the group membership, so the group leader contains the correct getInfo response.</li>
456
+ <li>Updated requirements: from <code>urllib3&gt;=1.21.1,&lt;1.27</code> to <code>urllib3&gt;=2.0</code>. Due to HA core 2025.07.00 update requirements.</li>
457
+ </ul>
458
+
459
+ <h6 id="10218-20250624">[ 1.0.218 ] - 2025/06/24</h6>
460
+
461
+ <ul>
462
+ <li>Updated <code>SpotifyConnectDirectoryTask.ActivateCastAppSpotify</code> method to ensure that the SpotifyAppTask is activated on the group leader if the device name is a cast group.</li>
463
+ </ul>
464
+
465
+ <h6 id="10217-20250623">[ 1.0.217 ] - 2025/06/23</h6>
466
+
467
+ <ul>
468
+ <li>Updated underlying <code>PyChromecast</code> package requirement from version <code>&gt;=14.0.5</code> to <code>&gt;=14.0.7</code>.</li>
469
+ <li>Updated <code>SpotifyConnectZeroconfCastController.GetInformation</code> method to back out the Cast <code>getInfo.deviceAPI_isGroup</code> parameter changes from v1.0.216. This seems to have caused more issues than it prevents.</li>
470
+ </ul>
471
+
472
+ <h6 id="10216-20250621">[ 1.0.216 ] - 2025/06/21</h6>
473
+
474
+ <ul>
475
+ <li>Updated <code>SpotifyConnectZeroconfCastController.GetInformation</code> method to properly set the Cast <code>getInfo.deviceAPI_isGroup</code> parameter, which indicates if the remote device is part of a group or not.</li>
476
+ </ul>
477
+
478
+ <h6 id="10215-20250620">[ 1.0.215 ] - 2025/06/20</h6>
479
+
480
+ <ul>
481
+ <li>Updated <code>SpotifyConnectDirectoryTask.OnServiceInfoAddedUpdatedChromecast</code> method to discover Google Cast devices in the device collection by their discovery KEY (e.g. UUID) value rather than their NAME value. The discovery name value cannot be used, as Google Group updates use slightly different names that refer to the same key value! This was causing duplicate group names to be added to the devices collection, as well as host ip address and port details to be wrong which prevented devices from being activated in the group.</li>
482
+ </ul>
483
+
484
+ <h6 id="10214-20250619">[ 1.0.214 ] - 2025/06/19</h6>
485
+
486
+ <ul>
487
+ <li>Updated <code>SpotifyConnectDirectoryTask.UpdatePlayerDevices</code> method to check each entry in the Spotify Web API device list for alias indicators. If a Spotify Web API device entry is an alias, then the device id and device name values will be the same (e.g. a device id value) and the SpotifyConnectDevices collection entry's DeviceInfo.RemoteName value will be an empty string (e.g. ""). If so then we don't want to update the RemoteName value, as an alias is in use; if not, then the RemoteName was changed and we need to update the device collection.</li>
488
+ <li>Updated <code>SpotifyConnectZeroconfCastListener._GetZeroconfDiscoveryResult</code> method to retrieve IPV4 host information if necessary. The CastInfo object will sometimes contain IPV6 data in the base object; if found, then the CastInfo.services array must be iterated to find the IPV4 HostServiceInfo record that will contain IPV4 address format. IPV4 is preferred over IPV6.</li>
489
+ </ul>
490
+
491
+ <h6 id="10213-20250619">[ 1.0.213 ] - 2025/06/19</h6>
492
+
493
+ <ul>
494
+ <li>Rebuilt, as v1.0.212 did not contain documentation updates.</li>
495
+ </ul>
496
+
497
+ <h6 id="10212-20250619">[ 1.0.212 ] - 2025/06/19</h6>
498
+
499
+ <ul>
500
+ <li>Updated <code>SpotifyConnectDirectoryTask.OnServiceInfoAddedUpdatedSpotifyConnect</code> method to handle Spotify Connect Zeroconf device name changes.</li>
501
+ </ul>
502
+
503
+ <h6 id="10211-20250619">[ 1.0.211 ] - 2025/06/19</h6>
504
+
505
+ <ul>
506
+ <li>Updated <code>SpotifyConnectDevices.GetDeviceByNameAndId</code> device resolution processing to correct a bug that was causing Google Cast Group devices to not be detected.</li>
507
+ </ul>
508
+
509
+ <h6 id="10210-20250618">[ 1.0.210 ] - 2025/06/18</h6>
510
+
511
+ <ul>
512
+ <li>Updated <code>SpotifyConnectDevices.GetDeviceById</code> device resolution processing. All Spotify Connect Zeroconf GetInfo response <code>DeviceId</code> entries are checked first; if not resolved, then base device <code>Id</code> entries are checked. We do it this way in case a Spotify Connect Zeroconf GetInfo response has not been recevied for a device yet.</li>
513
+ <li>Updated <code>SpotifyConnectDevices.GetDeviceByName</code> device resolution processing. All Spotify Connect Zeroconf GetInfo response <code>RemoteName</code> / Zeroconf DiscoveryResult <code>DeviceName</code> entries are checked first; if not resolved, then Spotify Connect Zeroconf GetInfo <code>Alias</code> entries are checked. We do it this way in case an alias name is defined for a Spotify Connect Zeroconf entry that already exists with the same name (e.g. the RemoteName entry will take precedence).</li>
514
+ <li>Added additional tracing messages for diagnosing device resolution / connection issues.</li>
515
+ </ul>
516
+
517
+ <h6 id="10209-20250617">[ 1.0.209 ] - 2025/06/17</h6>
518
+
519
+ <ul>
520
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayContext</code> method, adding the <code>shuffle</code> argument: True to enable player shuffle mode; False to disable player shuffle mode; None to use current player shuffle mode. Default is None. </li>
521
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayTracks</code> method, adding the <code>shuffle</code> argument: True to enable player shuffle mode; False to disable player shuffle mode; None to use current player shuffle mode. Default is None. </li>
522
+ </ul>
523
+
524
+ <h6 id="10208-20250614">[ 1.0.208 ] - 2025/06/14</h6>
525
+
526
+ <ul>
527
+ <li>Updated <code>SpotifyConnectDirectoryTask</code> to handle Google Cast device rename changes.</li>
528
+ <li>Updated <code>SpotifyConnectDirectoryTask</code> to properly handle Google Cast Group <code>add_cast</code> notifications. There should only be 1 instance of the Group Name registered in the SpotifyConnectDevices collection. The issue was that the Cast protocol generates an <code>add_cast</code> operation for each member of the group and the code was processing each <code>add_cast</code> entry as a new device entry. </li>
529
+ </ul>
530
+
531
+ <h6 id="10207-20250512">[ 1.0.207 ] - 2025/05/12</h6>
532
+
533
+ <ul>
534
+ <li>Updated <code>SpotifyConnectZeroconfCastAppTask</code> logic to use the Spotify Desktop Player OAuth2 token to activate Google Chromecast devices. This was necessary due to changes made by Spotify to disable Spotify Web Player Cookie credential access token usage with their Spotify Web API.</li>
535
+ </ul>
536
+
537
+ <h6 id="10206-20250508">[ 1.0.206 ] - 2025/05/08</h6>
538
+
539
+ <ul>
540
+ <li>Added logic to transfer playback corectly for Sonos devices after Spotify API changes that broke functionaity.</li>
541
+ </ul>
542
+
543
+ <h6 id="10205-20250508">[ 1.0.205 ] - 2025/05/08</h6>
544
+
545
+ <ul>
546
+ <li>Updated <code>SpotifyClient</code> methods to change the default Spotify Developer App Redirect URL to comply with Spotify guidance; value was changed from <code>localhost</code> to <code>127.0.0.1</code>. More information can be found on the <a href="https://developer.spotify.com/blog/2025-02-12-increasing-the-security-requirements-for-integrating-with-spotify">Spotify Developer Forum Blog post</a> that was conveyed on February 12, 2025.</li>
547
+ </ul>
548
+
549
+ <h6 id="10204-20250504">[ 1.0.204 ] - 2025/05/04</h6>
550
+
551
+ <ul>
552
+ <li>Updated <code>SpotifyClient</code> methods to return an exception due to the functions being removed by the Spotify development team (without warning, as usual). More information can be found on the <a href="https://developer.spotify.com/blog/2024-11-27-changes-to-the-web-api">Spotify Developer Forum Blog post</a> that was conveyed on November 27, 2024. The following methods will now raise a <code>SpotifyApiError</code> exception due to the Spotify development team changes: <code>GetTrackRecommendations</code>, <code>GetGenres</code>. </li>
553
+ <li>Updated <code>SpotifyClient.GetPlaylistFavorites</code> method to not use the Spotify Web Player Credentials, as it was returning a <code>404 Not Found</code>. It seems that the Spotify developers disabled the extended functionality, so that any "Made For You" playlists cannot be returned in the results. User-defined playlist favorites will be returned as normal.</li>
554
+ </ul>
555
+
556
+ <h6 id="10203-20250428">[ 1.0.203 ] - 2025/04/28</h6>
557
+
558
+ <ul>
559
+ <li>Fixed a bug that was causing Sonos devices to transfer playback after a 5 second delay. Delay can be removed if using Spotify Web Player Credentials for control.</li>
560
+ </ul>
561
+
562
+ <h6 id="10202-20250427">[ 1.0.202 ] - 2025/04/27</h6>
563
+
564
+ <ul>
565
+ <li>Corrected logic to resolve device object by device name when there are duplicate names defined to the device list.</li>
566
+ </ul>
567
+
568
+ <h6 id="10201-20250426">[ 1.0.201 ] - 2025/04/26</h6>
569
+
570
+ <ul>
571
+ <li>Added logic to resolve device object by device name when there are duplicate names defined to the device list. If the resolved device name is the same as the active device name, but the id's are different, then the active device is used instead of the resolved device.</li>
572
+ <li>Updated <code>SpotifyConnectDirectoryTask.ActivateCastAppSpotify</code> to search for device by id first; if no matches, then search for device by name.</li>
573
+ </ul>
574
+
575
+ <h6 id="10200-20250423">[ 1.0.200 ] - 2025/04/23</h6>
576
+
577
+ <ul>
578
+ <li>Added logic to detect device name changes when speakers are grouped / ungrouped. This can happen for devices that are added to / removed from groups and do not correctly inform interested parties via a zeroconf OnServiceStateChange event that the name has changed (e.g. Denon HEOS devices, etc).</li>
579
+ </ul>
580
+
581
+ <h6 id="10199-20250407">[ 1.0.199 ] - 2025/04/07</h6>
582
+
583
+ <ul>
584
+ <li>Updated <code>ImageVibrantColors</code> model to include the rgb, hsl, and population values along with the rgb_hex values. </li>
585
+ </ul>
586
+
587
+ <h6 id="10198-20250406">[ 1.0.198 ] - 2025/04/06</h6>
588
+
589
+ <ul>
590
+ <li>Changed <code>pillow&gt;=11.1.0</code> requirement to <code>pillow&gt;=10.3.0</code> for older versions of Home Assistant that have a <code>pillow&gt;=10.3.0</code> requirement.</li>
591
+ </ul>
592
+
593
+ <h6 id="10197-20250406">[ 1.0.197 ] - 2025/04/06</h6>
594
+
595
+ <ul>
596
+ <li>Removed version 1.0.196, as the <code>vibrant-python</code> namespace has a dependency that was not compatible with current version of Home Assistant: "pillow>=10.1.0,&lt;11.0.0".</li>
597
+ <li>Added namespace <code>vibrant</code> to library to support vibrant color extraction.</li>
598
+ </ul>
599
+
600
+ <h6 id="10196-20250406">[ 1.0.196 ] - 2025/04/06</h6>
601
+
602
+ <ul>
603
+ <li>Added <code>ImageVibrantColors</code> model that contains vibrant colors extracted from a processed image.</li>
604
+ <li>Added <code>SpotifyClient.GetImageVibrantColors</code> method that extracts vibrant color palette RGB values from the specified image url.</li>
605
+ </ul>
606
+
607
+ <h6 id="10195-20250403">[ 1.0.195 ] - 2025/04/03</h6>
608
+
609
+ <ul>
610
+ <li>Changed transfer playback behavior to resume playback of the last playing track instead of defaulting to playing of track favorites if no active device was found and Spotify Web Player cookie credentials are in use. Note that track favorites will be used if no active device was found and Spotify Web Player cookie credentials are NOT in use.</li>
611
+ </ul>
612
+
613
+ <h6 id="10194-20250329">[ 1.0.194 ] - 2025/03/29</h6>
614
+
615
+ <ul>
616
+ <li>Added support for re-awakening Amazon devices from sleep mode.</li>
617
+ </ul>
618
+
619
+ <h6 id="10193-20250327">[ 1.0.193 ] - 2025/03/27</h6>
620
+
621
+ <ul>
622
+ <li>Updated underlying <code>smartinspectpython</code> package requirement to version 3.0.37.</li>
623
+ </ul>
624
+
625
+ <h6 id="10192-20250326">[ 1.0.192 ] - 2025/03/26</h6>
626
+
627
+ <ul>
628
+ <li>Updated underlying <code>smartinspectpython</code> package requirement to version 3.0.36.</li>
629
+ </ul>
630
+
631
+ <h6 id="10191-20250319">[ 1.0.191 ] - 2025/03/19</h6>
632
+
633
+ <ul>
634
+ <li>Added Time-based One Time Password processing. </li>
635
+ <li>Added <code>pyotp</code> package requirement version &gt;=2.9.0.</li>
636
+ </ul>
637
+
638
+ <h6 id="10190-20250314">[ 1.0.190 ] - 2025/03/14</h6>
639
+
640
+ <ul>
641
+ <li>Fixed a bug that was causing <code>'ZeroconfGetInfoAlias' object has no attribute 'lower'</code> exceptions when Aliases were returned in Spotify Connect <code>GetInfo</code> requests. </li>
642
+ </ul>
643
+
644
+ <h6 id="10189-20250313">[ 1.0.189 ] - 2025/03/13</h6>
645
+
646
+ <ul>
647
+ <li>Fixed a bug that was causing the device name to be blank when Aliases were returned in Spotify Connect <code>GetInfo</code> requests. The first alias name will be used as the device name when aliases are returned for a device.</li>
648
+ <li>Defaulted Chromecast Zeroconf GetInformation BrandDisplayName value to "ChromeCast" if a manufacturer name was not supplied.</li>
649
+ </ul>
650
+
651
+ <h6 id="10188-20250309">[ 1.0.188 ] - 2025/03/09</h6>
652
+
653
+ <ul>
654
+ <li>Added more device <code>cast_type</code> values to check for supported Chromecast devices: <code>null</code>; if <code>cast_type</code> is null, then assume it supports audio. It appears that some manufacturers are not correctly setting this attribute (e.g. LG SN Series ThinQ Soundbar, JBL Authentics 200, etc).</li>
655
+ </ul>
656
+
657
+ <h6 id="10187-20250308">[ 1.0.187 ] - 2025/03/08</h6>
658
+
659
+ <ul>
660
+ <li>Cleaned up some error / trace messages related to Spotify Web Player credentials processing.</li>
661
+ </ul>
662
+
663
+ <h6 id="10186-20250308">[ 1.0.186 ] - 2025/03/08</h6>
664
+
665
+ <ul>
666
+ <li>Fixed a bug in Spotify Web Player credentials processing.</li>
667
+ </ul>
668
+
669
+ <h6 id="10185-20250308">[ 1.0.185 ] - 2025/03/08</h6>
670
+
671
+ <ul>
672
+ <li>Fixed a bug in device name processing to properly display the Spotify Connect RemoteName value. Prior code was causing the Zeroconf DeviceName to be displayed, which is sometimes not a user-friendly name.</li>
673
+ <li>Added Spotify Web Player credentials to <code>SpotifyClient</code> class constructor. If the <code>spotifyWebPlayerCookieSpdc</code> and <code>spotifyWebPlayerCookieSpkey</code> argument values are specified, then an "elevated" access token (created from the argument values) will be used for all player-control related methods.</li>
674
+ </ul>
675
+
676
+ <h6 id="10184-20250302">[ 1.0.184 ] - 2025/03/02</h6>
677
+
678
+ <ul>
679
+ <li>Updated underlying <code>smartinspectpython</code> package requirement to version 3.0.35.</li>
680
+ </ul>
681
+
682
+ <h6 id="10183-20250302">[ 1.0.183 ] - 2025/03/02</h6>
683
+
684
+ <ul>
685
+ <li>Updated PDoc Documentation package name to lower-case, to match the PyPi.org package name. This was to adhere to PyPI.org requirements for uploaded binary distribution filenames to comply with the binary distribution format.</li>
686
+ </ul>
687
+
688
+ <h6 id="10182-20250302">[ 1.0.182 ] - 2025/03/02</h6>
689
+
690
+ <ul>
691
+ <li>Updated <code>setup.py</code> to adhere to PyPI.org requirements for uploaded binary distribution filenames to comply with the binary distribution format. This changes the wheel filename that is generated from <code>spotifywebapiPython-1.0.182-py3-none-any.whl</code> to <code>spotifywebapipython-1.0.182-py3-none-any.whl</code> (same filename, just lower-case project name).</li>
692
+ </ul>
693
+
694
+ <h6 id="10181-20250301">[ 1.0.181 ] - 2025/03/01</h6>
695
+
696
+ <ul>
697
+ <li>Updated logic to start / restart the Spotify Connect Directory task only if the authorization token setup was successful. Prior logic was causing a misleading exception to be returned to the caller, and the original offending exception was only visible in the SmartInspect trace.</li>
698
+ </ul>
699
+
700
+ <h6 id="10180-20250225">[ 1.0.180 ] - 2025/02/25</h6>
701
+
702
+ <ul>
703
+ <li>Updated Spotify Web API request logic to retry request failures with status code 504 (Gateway Timeout); request will be tried 5 times with a slight delay in between before giving up.</li>
704
+ <li>Updated Spotify Web Player token refresh request logic to retry request failures with status code 504 (Gateway Timeout); request will be tried 5 times with a slight delay in between before giving up.</li>
705
+ </ul>
706
+
707
+ <h6 id="10179-20250225">[ 1.0.179 ] - 2025/02/25</h6>
708
+
709
+ <ul>
710
+ <li>Updated <code>SpotifyClient.GetDevicePlaybackState</code> method to get the current Spotify playback state, with device fallback if nothing is reported from Spotify.</li>
711
+ <li>Updated <code>SpotifyClient.PlayerTransferPlayback</code> method to ignore exceptions if trying to pause play on the device being transferred from.</li>
712
+ </ul>
713
+
714
+ <h6 id="10178-20250224">[ 1.0.178 ] - 2025/02/24</h6>
715
+
716
+ <ul>
717
+ <li>Updated <code>mediaPositionHMS_toSeconds</code> method to account for a null position value.</li>
718
+ </ul>
719
+
720
+ <h6 id="10177-20250224">[ 1.0.177 ] - 2025/02/24</h6>
721
+
722
+ <ul>
723
+ <li>Added retry logic to token exchange method for handling Spotify Web Player token refresh "504 - Gateway Timeout" errors.</li>
724
+ <li>Added exception handling logic to process TokenError exceptions more gradefully and without adding extra system log errors messages.</li>
725
+ </ul>
726
+
727
+ <h6 id="10176-20250224">[ 1.0.176 ] - 2025/02/24</h6>
728
+
729
+ <ul>
730
+ <li>Added Spotify Player transport control for Spotify FREE accounts. Note that the <a href="https://github.com/thlucas1/homeassistantcomponent_spotifyplus/wiki/Device-Configuration-Options#spotify-web-player-authentication-setup">Spotify Web Player Authentication Setup</a> must be configured to use this functionality; if not configured, then the Spotify Web API will return a <code>Premium required</code> exception for all transport control methods.</li>
731
+ </ul>
732
+
733
+ <h6 id="10175-20250223">[ 1.0.175 ] - 2025/02/23</h6>
734
+
735
+ <ul>
736
+ <li>Updated <code>SpotifyClient</code> methods to utilize the Spotify Web Player elevated access token (if configured) if a Spotify Player method is accessed. This should prevent issues with Sonos devices. Note that the <a href="https://github.com/thlucas1/homeassistantcomponent_spotifyplus/wiki/Device-Configuration-Options#spotify-web-player-authentication-setup">Spotify Web Player Authentication Setup</a> must be configured to use this functionality; if not configured, then the Sonos Controller (e.g. SoCo) API is used to control the Sonos device. The following methods were updated: <code>PlayerMediaPause</code>, <code>PlayerMediaResume</code>, <code>PlayerMediaSeek</code>, <code>PlayerMediaSkipNext</code>, <code>PlayerMediaSkipPrevious</code>, <code>PlayerSetRepeatMode</code>, <code>PlayerSetShuffleMode</code>, <code>PlayerSetVolume</code>, <code>PlayerTransferPlayback</code>, <code>AddPlayerQueueItems</code>.</li>
737
+ </ul>
738
+
739
+ <h6 id="10174-20250222">[ 1.0.174 ] - 2025/02/22</h6>
740
+
741
+ <ul>
742
+ <li>Updated <code>SpotifyClient</code> methods to restore functions that were previously deprecated by the Spotify development team. Note that the <a href="https://github.com/thlucas1/homeassistantcomponent_spotifyplus/wiki/Device-Configuration-Options#spotify-web-player-authentication-setup">Spotify Web Player Authentication Setup</a> must be enabled to use these specific functions; if not enabled, the functions will still work but won't return Spotify owned items and data. The following methods have functionality restored: <code>GetPlaylistItems</code>.</li>
743
+ </ul>
744
+
745
+ <h6 id="10173-20250222">[ 1.0.173 ] - 2025/02/22</h6>
746
+
747
+ <ul>
748
+ <li>Updated <code>SpotifyClient</code> methods to restore functions that were previously deprecated by the Spotify development team. Note that the <a href="https://github.com/thlucas1/homeassistantcomponent_spotifyplus/wiki/Device-Configuration-Options#spotify-web-player-authentication-setup">Spotify Web Player Authentication Setup</a> must be enabled to use these specific functions; if not enabled, the functions will still work but won't return Spotify owned items and data. The following methods have functionality restored: <code>GetPlaylist</code>, <code>GetPlaylistFavorites</code>.</li>
749
+ </ul>
750
+
751
+ <h6 id="10172-20250222">[ 1.0.172 ] - 2025/02/22</h6>
752
+
753
+ <ul>
754
+ <li>Updated <code>SpotifyClient</code> methods to restore functions that were previously deprecated by the Spotify development team. Note that the <a href="https://github.com/thlucas1/homeassistantcomponent_spotifyplus/wiki/Device-Configuration-Options#spotify-web-player-authentication-setup">Spotify Web Player Authentication Setup</a> must be enabled to use these specific functions; if not enabled, the functions will raise a <code>deprecated</code> exception. The following methods were restored: <code>GetArtistRelatedArtists</code>, <code>GetTrackRecommendations</code>, <code>GetTracksAudioFeatures</code>, <code>GetFeaturedPlaylists</code>, <code>GetCategoryPlaylists</code>, <code>GetGenres</code>.</li>
755
+ </ul>
756
+
757
+ <h6 id="10171-20250221">[ 1.0.171 ] - 2025/02/21</h6>
758
+
759
+ <ul>
760
+ <li>Updated <code>SpotifyConnectDirectoryTask.GetSonosPlayer</code> method to trace the SoCo instance that is used to control Sonos devices.</li>
761
+ </ul>
762
+
763
+ <h6 id="10170-20250220">[ 1.0.170 ] - 2025/02/20</h6>
764
+
765
+ <ul>
766
+ <li>Updated <code>SpotifyConnectDevices.GetDeviceByName</code> method to match on alias name, remote name, and zeroconf device name when resolving a device name value.</li>
767
+ <li>Updated <code>SpotifyConnectDirectoryTask.OnServiceInfoAddedUpdatedSpotifyConnect</code> method to use the ZeroConf DeviceName value for the user-friendly device name by default. The getInfo RemoteName value will be used for the user-friendly device name for some manufacturers (Sonos, etc).</li>
768
+ </ul>
769
+
770
+ <h6 id="10169-20250220">[ 1.0.169 ] - 2025/02/20</h6>
771
+
772
+ <ul>
773
+ <li>Updated <code>SpotifyConnectDirectoryTask.GetSonosPlayer</code> method to optionally return the Sonos Group Coordinator when retrieving the Sonos Controller instance for a device. This should prevent any <code>"play" can only be called/used on the coordinator in a group</code> errors.</li>
774
+ </ul>
775
+
776
+ <h6 id="10168-20250218">[ 1.0.168 ] - 2025/02/18</h6>
777
+
778
+ <ul>
779
+ <li>Cleaned up some old trace messages and code comments.</li>
780
+ </ul>
781
+
782
+ <h6 id="10167-20250218">[ 1.0.167 ] - 2025/02/18</h6>
783
+
784
+ <ul>
785
+ <li>Updated <code>SpotifyConnectDirectoryTask.GetDevices</code> method to not lock the collection when making a copy of the collection.</li>
786
+ </ul>
787
+
788
+ <h6 id="10166-20250218">[ 1.0.166 ] - 2025/02/18</h6>
789
+
790
+ <ul>
791
+ <li>Updated <code>AuthClient.RefreshToken</code> logic to prevent calling external token updaters from more than 1 thread at a time.</li>
792
+ </ul>
793
+
794
+ <h6 id="10165-20250217">[ 1.0.165 ] - 2025/02/17</h6>
795
+
796
+ <ul>
797
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayContext</code> and <code>PlayerMediaPlayTracks</code> to utilize Spotify Web Player authorization token when starting play for Sonos and restricted devices. This will cause play to start under Spotify Connect control, rather than using the Sonos Local Queue. Refer to the <a href="https://github.com/thlucas1/homeassistantcomponent_spotifyplus/wiki/Device-Configuration-Options#spotify-web-player-authentication-setup">Spotify Web Player Authentication Setup</a> wiki page for more information on how to configure it.</li>
798
+ </ul>
799
+
800
+ <h6 id="10164-20250205">[ 1.0.164 ] - 2025/02/05</h6>
801
+
802
+ <ul>
803
+ <li>Added <code>SpotifyClient.Dispose</code> method to properly dispose of resources and unwire events when the instance is destroyed.friendly.</li>
804
+ </ul>
805
+
806
+ <h6 id="10163-20250130">[ 1.0.163 ] - 2025/01/30</h6>
807
+
808
+ <ul>
809
+ <li>Adjusted <code>no active device</code> error message to be more user-friendly.</li>
810
+ <li>Updated service method arguments to indicate DEPRECATED parameters (e.g. parameters no longer used).</li>
811
+ </ul>
812
+
813
+ <h6 id="10162-20250128">[ 1.0.162 ] - 2025/01/28</h6>
814
+
815
+ <ul>
816
+ <li>Added device <code>cast_type</code> value to <code>ZeroconfDiscoveryResult.Properties</code> for easier detection of Chromecast device types.</li>
817
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayContext</code> method to correct shuffled track behavior; Prior behavior did not honor the current shuffle setting of the player, and would always start with the first track.</li>
818
+ </ul>
819
+
820
+ <h6 id="10161-20250126">[ 1.0.161 ] - 2025/01/26</h6>
821
+
822
+ <ul>
823
+ <li>Added more device <code>cast_type</code> values to check for supported Chromecast devices: <code>cast</code>, <code>group</code>.</li>
824
+ </ul>
825
+
826
+ <h6 id="10160-20250126">[ 1.0.160 ] - 2025/01/26</h6>
827
+
828
+ <ul>
829
+ <li>Removed check for <code>(castInfo.cast_type != "audio")</code> to determine if the Chromecast device is allowed in the device list or not. This was never released to PROD.</li>
830
+ </ul>
831
+
832
+ <h6 id="10159-20250125">[ 1.0.159 ] - 2025/01/25</h6>
833
+
834
+ <ul>
835
+ <li>Replaced <code>threading.Lock</code> references with <code>threading.RLock</code> (reentrant) references. This should avoid any potential deadlock situations for recursive calls to methods on the same thread.</li>
836
+ </ul>
837
+
838
+ <h6 id="10158-20250123">[ 1.0.158 ] - 2025/01/23</h6>
839
+
840
+ <ul>
841
+ <li>Updated Chromecast logic to support more user-friendly error messages when configuration / initialization errors occur.</li>
842
+ </ul>
843
+
844
+ <h6 id="10157-20250123">[ 1.0.157 ] - 2025/01/23</h6>
845
+
846
+ <ul>
847
+ <li>Updated Chromecast logic to support more user-friendly error messages when configuration / initialization errors occur.</li>
848
+ </ul>
849
+
850
+ <h6 id="10156-20250123">[ 1.0.156 ] - 2025/01/23</h6>
851
+
852
+ <ul>
853
+ <li>Updated <code>SpotifyClient</code> methods that require a <code>deviceId</code> argument to check for a "Device Not Found" condition, and return a more user-friendly message than the "Device Not Found" message from the Spotify Web API.</li>
854
+ </ul>
855
+
856
+ <h6 id="10155-20250122">[ 1.0.155 ] - 2025/01/22</h6>
857
+
858
+ <ul>
859
+ <li>Updated <code>SpotifyClient.AddPlayerQueueItems</code> to support adding items to the Sonos device local queue.</li>
860
+ <li>Added <code>additionalTypes='episode'</code> parameter to all <code>GetPlayerPlaybackState()</code> calls so that context and item information is returned in the player playstate data.</li>
861
+ </ul>
862
+
863
+ <h6 id="10154-20250122">[ 1.0.154 ] - 2025/01/22</h6>
864
+
865
+ <ul>
866
+ <li>Updated function <code>SpotifyClient.PlayerMediaPlayTracks</code> to handle playing tracks on the Sonos local queue. Sonos devices can only initiate play (of tracks or context) on their local queue, as they are considered restricted devices by the Spotify Web API.</li>
867
+ <li>Updated function <code>SpotifyClient.PlayerMediaPlayContext</code> to handle playing context on the Sonos local queue. Sonos devices can only initiate play (of tracks or context) on their local queue, as they are considered restricted devices by the Spotify Web API.</li>
868
+ </ul>
869
+
870
+ <h6 id="10153-20250122">[ 1.0.153 ] - 2025/01/22</h6>
871
+
872
+ <ul>
873
+ <li>Updated function <code>SpotifyClient.PlayerTransferPlayback</code> to return a <code>SpotifyConnectDevice</code> object for the device where playback was transferred to.</li>
874
+ </ul>
875
+
876
+ <h6 id="10152-20250122">[ 1.0.152 ] - 2025/01/22</h6>
877
+
878
+ <ul>
879
+ <li>Added more support for Sonos Player functions via the SoCo Sonos API.</li>
880
+ </ul>
881
+
882
+ <h6 id="10151-20250121">[ 1.0.151 ] - 2025/01/21</h6>
883
+
884
+ <ul>
885
+ <li>Added support for limited Sonos Player functions via the SoCo Sonos API.</li>
886
+ <li>Added <code>soco</code> package requirement, &gt;= 0.30.6.</li>
887
+ </ul>
888
+
889
+ <h6 id="10150-20250120">[ 1.0.150 ] - 2025/01/20</h6>
890
+
891
+ <ul>
892
+ <li>Updated <code>SpotifyConnectDirectoryTask</code> to reset Zeroconf response data after Chromecast device activation; new requests were still referring to the stale information.</li>
893
+ </ul>
894
+
895
+ <h6 id="10149-20250120">[ 1.0.149 ] - 2025/01/20</h6>
896
+
897
+ <ul>
898
+ <li>Added support for Google Chromecast Spotify Connect devices.</li>
899
+ <li>Added namespace <code>spotifyconnect</code> that contains support for Spotify Connect device discovery.</li>
900
+ <li>Removed function <code>SpotifyClient.AddPlayerQueueItem</code> - use <code>AddPlayerQueueItems</code> instead.</li>
901
+ <li>Removed function <code>SpotifyClient.PlayerActivateDevices</code> - playback is auto-transferred to some devices when they are activated (Sonos, Chromecast, etc). This method is no longer needed, as devices are automatically resolved / activated now.</li>
902
+ <li>Removed function <code>SpotifyClient.PlayerVerifyDeviceDefault</code> - devices are automatically resolved / verified now.</li>
903
+ <li>Removed function <code>SpotifyClient.VerifyPlayerActiveDeviceId</code> - devices are automatically resolved / verified now.</li>
904
+ <li>Added <code>PyChromecast</code> package requirement, &gt;= 14.0.5.</li>
905
+ <li>Updated underlying <code>smartinspectPython</code> package requirement to version 3.0.34.</li>
906
+ <li>Updated Python from v3.9 to v3.11.</li>
907
+ <li>Updated minimum python version requirement from v3.5.1+ to v3.11.0+</li>
908
+ </ul>
909
+
910
+ <h6 id="10148-20250113">[ 1.0.148 ] - 2025/01/13</h6>
911
+
912
+ <ul>
913
+ <li>Updated trace message to better reflect logic flow.</li>
914
+ </ul>
915
+
916
+ <h6 id="10147-20250113">[ 1.0.147 ] - 2025/01/13</h6>
917
+
918
+ <ul>
919
+ <li>Added <code>SpotifyConnectDevices.UpdateActiveDevice</code> method to update the currently active device based on playerState.</li>
920
+ <li>Added <code>ZeroconfDiscoveryResult.Description</code> property that returns a basic description of the device, and how source info was obtained. This is a helper property, and not part of the Zeroconf ServiceInfo result.</li>
921
+ </ul>
922
+
923
+ <h6 id="10146-20250112">[ 1.0.146 ] - 2025/01/12</h6>
924
+
925
+ <ul>
926
+ <li>Added <code>SpotifyConnectDevices.RemoveDevice</code> method to remove existing device entry(s) from the <code>Items</code> collection by device id value.</li>
927
+ </ul>
928
+
929
+ <h6 id="10145-20250112">[ 1.0.145 ] - 2025/01/12</h6>
930
+
931
+ <ul>
932
+ <li>Added <code>SpotifyConnectDevices.GetActiveDevice</code> method to return a Spotify Connect device if one is currently marked as the active device; otherwise, null if there is no active device.</li>
933
+ <li>Updated <code>SpotifyConnectDevices.UpdatePlayerDevices</code> method to return the currently active Spotify Player device instance as determined by the Spotify Player PlayState if one was supplied; otherwise, null if not active device.</li>
934
+ </ul>
935
+
936
+ <h6 id="10144-20250110">[ 1.0.144 ] - 2025/01/10</h6>
937
+
938
+ <ul>
939
+ <li>Added <code>SpotifyConnectDevices.UpdatePlayerDevices</code> method to add a list of dynamic player device entries to the <code>Items</code> collection, remove any existing dynamic devices from the collection that are not in the <code>playerDevices</code> list, and update the currently active device based on playerState.</li>
940
+ </ul>
941
+
942
+ <h6 id="10143-20250110">[ 1.0.143 ] - 2025/01/10</h6>
943
+
944
+ <ul>
945
+ <li>Added <code>SpotifyConnectDevices.GetDeviceIndexByDiscoveryName</code> method to return the index of the <code>Items</code> collection entry that contains the specified device Zeroconf discovery results name value, or -1 if not found.</li>
946
+ </ul>
947
+
948
+ <h6 id="10142-20250110">[ 1.0.142 ] - 2025/01/10</h6>
949
+
950
+ <ul>
951
+ <li>Added <code>ZeroconfDiscoveryResult.Equals</code> method to compare object argument values to determine equality.</li>
952
+ <li>Added <code>ZeroconfGetInfo.Equals</code> method to compare object argument values to determine equality.</li>
953
+ <li>Added <code>SpotifyConnectDevice.Equals</code> method to compare object argument values to determine equality.</li>
954
+ </ul>
955
+
956
+ <h6 id="10141-20250109">[ 1.0.141 ] - 2025/01/09</h6>
957
+
958
+ <ul>
959
+ <li>Added <code>SpotifyConnectDevices.GetDeviceByDiscoveryKey</code> method to return the device of the <code>Items</code> collection entry that contains the specified device Zeroconf discovery results key value, or null if not found.</li>
960
+ </ul>
961
+
962
+ <h6 id="10140-20250109">[ 1.0.140 ] - 2025/01/09</h6>
963
+
964
+ <ul>
965
+ <li>Added <code>SpotifyConnectDevices.GetDeviceIndexByDiscoveryKey</code> method to return the index of the <code>Items</code> collection entry that contains the specified device Zeroconf discovery results key value, or -1 if not found.</li>
966
+ </ul>
967
+
968
+ <h6 id="10139-20250107">[ 1.0.139 ] - 2025/01/07</h6>
969
+
970
+ <ul>
971
+ <li>Updated <code>SpotifyDiscovery._OnServiceStateChange</code> method to correctly update the Zeroconf DiscoveryResults instance. The serviceinfo <code>Key</code> value must be used to update the device entry (not its <code>Id</code> value).</li>
972
+ </ul>
973
+
974
+ <h6 id="10138-20250106">[ 1.0.138 ] - 2025/01/06</h6>
975
+
976
+ <ul>
977
+ <li>Updated <code>SpotifyDiscovery._OnServiceStateChange</code> method to correctly update the Zeroconf DiscoveryResults instance.</li>
978
+ </ul>
979
+
980
+ <h6 id="10137-20250106">[ 1.0.137 ] - 2025/01/06</h6>
981
+
982
+ <ul>
983
+ <li>Added <code>PlayerPlayState.IsEmpty</code> property setter.</li>
984
+ </ul>
985
+
986
+ <h6 id="10136-20250105">[ 1.0.136 ] - 2025/01/05</h6>
987
+
988
+ <ul>
989
+ <li>Updated <code>SpotifyClient.PlayerTransferPlayback</code> method to check player state before trying to transfer playback. If nothing is playing, then issue a call to <code>PlayTrackFavorites</code> instead. This will avoid the <code>Restriction violated</code> error which results from a transfer playback to the player when nothing is currently playing.</li>
990
+ </ul>
991
+
992
+ <h6 id="10135-20250105">[ 1.0.135 ] - 2025/01/05</h6>
993
+
994
+ <ul>
995
+ <li>Updated <code>SpotifyClient</code> class to include properties for <code>SpotifyConnectLoginId</code> and <code>SpotifyConnectUsername</code>.</li>
996
+ </ul>
997
+
998
+ <h6 id="10134-20250104">[ 1.0.134 ] - 2025/01/04</h6>
999
+
1000
+ <ul>
1001
+ <li>Updated <code>SpotifyClient</code> methods <code>PlayerActivateDevices</code> and <code>GetSpotifyConnectDevice</code> to re-create the ZeroconfConnect connection instance if the device IP address or port changed after Zeroconf rediscovery on a Disconnect call sequence.</li>
1002
+ </ul>
1003
+
1004
+ <h6 id="10133-20250104">[ 1.0.133 ] - 2025/01/04</h6>
1005
+
1006
+ <ul>
1007
+ <li>Modified <code>SpotifyDiscovery._OnServiceStateChange</code> method to process Zeroconf Update and Remove notifications.</li>
1008
+ </ul>
1009
+
1010
+ <h6 id="10132-20250102">[ 1.0.132 ] - 2025/01/02</h6>
1011
+
1012
+ <ul>
1013
+ <li>Modified <code>ZeroconfConnect.GetInformation</code> method logic to automatically retry the connection (after 250ms, 2s max) to the Spotify Connect Zeroconf device service if a "connection refused" was returned while trying to get device information. This was originally set to 10 seconds, which is far too long to wait for a device to become available.</li>
1014
+ <li>Updated <code>SpotifyClient</code> methods <code>PlayerActivateDevices</code> and <code>GetSpotifyConnectDevice</code> to rediscover the Spotify Connect Zeroconf device after a Disconnect call is issued. It has been found that some device manufacturers (e.g. Denon) stop and restart the Zeroconf server on the device after a <code>resetUsers</code> (e.g. disconnect) call is made, which changes the IP Port number that the device listens on for incoming connections.</li>
1015
+ <li>Removed the deprecated function <code>SpotifyConnect.PlayerResolveDeviceId</code> (since 2024/08/15); use the <code>GetSpotifyConnectDevice</code> method instead.</li>
1016
+ </ul>
1017
+
1018
+ <h6 id="10131-20250101">[ 1.0.131 ] - 2025/01/01</h6>
1019
+
1020
+ <ul>
1021
+ <li>Modified <code>ZeroconfConnect.GetInformation</code> method logic to automatically retry the connection (after 250ms, 10s max) to the Spotify Connect Zeroconf device service if a "connection refused" was returned while trying to get device information. The previous logic used a simple delay prior to the call and did not retry the connection, which resulted in the "connection refused" exceptions while trying to awaken devices. Some Spotify Connect devices take a little bit longer to start accepting connections again after a change.</li>
1022
+ <li>Added <code>lxml</code> package requirement to <code>setup.py</code>.</li>
1023
+ </ul>
1024
+
1025
+ <h6 id="10130-20241227">[ 1.0.130 ] - 2024/12/27</h6>
1026
+
1027
+ <ul>
1028
+ <li>Added <code>PlayerPlayState.IsEmpty</code> property; returns True if Spotify playstate returned an empty response; otherwise, false. This is a helper property, and is not part of the Spotify Web API specification.</li>
1029
+ </ul>
1030
+
1031
+ <h6 id="10129-20241221">[ 1.0.129 ] - 2024/12/21</h6>
1032
+
1033
+ <ul>
1034
+ <li>Added <code>SpotifyClient.GetCoverImageFile</code> that gets the contents of an image url and transfers the contents to the local file system. This method should only be used to download images for playlists that contain public domain images.</li>
1035
+ <li>Added <code>ImageObject.GetImageHighestResolutionWidth</code> that returns the highest resolution order image width from a list of <code>ImageObject</code> items.</li>
1036
+ </ul>
1037
+
1038
+ <h6 id="10128-20241220">[ 1.0.128 ] - 2024/12/20</h6>
1039
+
1040
+ <ul>
1041
+ <li>Updated <code>PlayerActions</code> model to load the correct action values for <code>TogglingRepeatTrack</code> and <code>TogglingShuffle</code>. These were switched, which was causing shuffle and repeat actions to be misinterpreted.</li>
1042
+ </ul>
1043
+
1044
+ <h6 id="10127-20241219">[ 1.0.127 ] - 2024/12/19</h6>
1045
+
1046
+ <ul>
1047
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayTrackFavorites</code> to default and validate limitTotal argument. It has been found that approximately 750 items can be retrieved and played successfully (anything more generates request size errors).</li>
1048
+ </ul>
1049
+
1050
+ <h6 id="10126-20241218">[ 1.0.126 ] - 2024/12/18</h6>
1051
+
1052
+ <ul>
1053
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayTrackFavorites</code> to retrieve unsorted track favorites, so that the most recently added favorites are played instead of the first alphabetical favorites.</li>
1054
+ </ul>
1055
+
1056
+ <h6 id="10125-20241209">[ 1.0.125 ] - 2024/12/09</h6>
1057
+
1058
+ <ul>
1059
+ <li>Added <code>PlaylistSimplified</code> property setters for the the following properties: <code>Description</code>, <code>Id</code>, <code>Name</code>, <code>Type</code>, <code>Uri</code>.</li>
1060
+ </ul>
1061
+
1062
+ <h6 id="10124-20241207">[ 1.0.124 ] - 2024/12/07</h6>
1063
+
1064
+ <ul>
1065
+ <li>Updated various <code>SpotifyClient</code> methods to discard favorites that do not contain a valid URI value. Sometimes the Spotify Web API returns favorite items with no information! The following methods were updated: <code>GetAlbumFavorites</code>, <code>GetEpisodeFavorites</code>, <code>GetShowFavorites</code>, <code>GetTrackFavorites</code>.</li>
1066
+ </ul>
1067
+
1068
+ <h6 id="10123-20241206">[ 1.0.123 ] - 2024/12/06</h6>
1069
+
1070
+ <ul>
1071
+ <li>Updated various methods to validate boolean arguments - if value was not passed (e.g. None), then set to documented value (True or False).</li>
1072
+ <li>Fixed a bug in <code>SpotifyClient.PlayerTransferPlayback</code> method that was causing play not to resume if <code>Play=True</code> and <code>forceActivateDevice=True</code>. If forceActivateDevice=True, then we need to resume play manually if play=True was specified; this is due to the device losing its current status since it was being forcefully activated (e.g. disconnected and reconnected).</li>
1073
+ </ul>
1074
+
1075
+ <h6 id="10122-20241202">[ 1.0.122 ] - 2024/12/02</h6>
1076
+
1077
+ <ul>
1078
+ <li>Updated <code>SpotifyClient</code> methods to return an exception due to the functions being deprecated by the Spotify development team. More information can be found on the <a href="https://developer.spotify.com/blog/2024-11-27-changes-to-the-web-api">Spotify Developer Forum Blog post</a> that was conveyed on November 27, 2024. The following methods will now raise a <code>SpotifyApiError</code> exception due to the Spotify development team changes: <code>GetArtistRelatedArtists</code>, <code>GetTrackRecommendations</code>, <code>GetTracksAudioFeatures</code>, <code>GetFeaturedPlaylists</code>, <code>GetCategoryPlaylists</code>, <code>GetGenres</code>. The following properties were also marked as deprecated for the same reason: <code>TrackSimplified.PreviewUrl</code>.</li>
1079
+ <li>Due to the above changes made by Spotify, any Algorithmic and Spotify-owned editorial playlists are no longer accessible or have more limited functionality. This means that you can no longer obtain details via the <code>SpotifyClient.GetPlaylist</code> and <code>SpotifyClient.GetPlaylistItems</code> methods for Spotify-owned / generated content (e.g. "Made For You", etc). A <code>404 - Not Found</code> error will be returned when trying to retrieve information for these playlist types.</li>
1080
+ </ul>
1081
+
1082
+ <h6 id="10121-20241120">[ 1.0.121 ] - 2024/11/20</h6>
1083
+
1084
+ <ul>
1085
+ <li>Updated <code>AuthTokenGenerator.py</code> sample code to correctly reference the token cache file.</li>
1086
+ </ul>
1087
+
1088
+ <h6 id="10120-20241118">[ 1.0.120 ] - 2024/11/18</h6>
1089
+
1090
+ <ul>
1091
+ <li>Updated <code>SpotifyClient.ReorderPlaylistItems</code> to validate required input parameters were supplied.</li>
1092
+ <li>Updated <code>SpotifyClient.ReplacePlaylistItems</code> to check for no uris argument; this can occur if you want to clear the playlist.</li>
1093
+ <li>Updated <code>SpotifyClient.GetPlaylistCoverImage</code> method to make the <code>playlistId</code> argument optional; if not supplied, the currently playing playlist id value is used instead.</li>
1094
+ <li>Added <code>SpotifyClient.Version</code> property.</li>
1095
+ </ul>
1096
+
1097
+ <h6 id="10119-20241115">[ 1.0.119 ] - 2024/11/15</h6>
1098
+
1099
+ <ul>
1100
+ <li>Updated <code>TrackRecommendations</code> model to return empty arrays (instead of None) if seeds or tracks items were not found.</li>
1101
+ </ul>
1102
+
1103
+ <h6 id="10118-20241107">[ 1.0.118 ] - 2024/11/07</h6>
1104
+
1105
+ <ul>
1106
+ <li>Updated <code>SpotifyClient.GetArtistInfo</code> method to handle the <code>see more</code> suffix in the <code>BioHtml</code> property.</li>
1107
+ <li>Updated <code>SpotifyClient.GetArtistInfo</code> method to correctly parse tour event dates.</li>
1108
+ </ul>
1109
+
1110
+ <h6 id="10117-20241107">[ 1.0.117 ] - 2024/11/07</h6>
1111
+
1112
+ <ul>
1113
+ <li>Updated <code>SpotifyClient.GetArtistInfo</code> method to force all links in the <code>BioHtml</code> property to open in a new browser window / tab (e.g. added <code>target="_blank"</code>).</li>
1114
+ </ul>
1115
+
1116
+ <h6 id="10116-20241107">[ 1.0.116 ] - 2024/11/07</h6>
1117
+
1118
+ <ul>
1119
+ <li>Updated <code>ArtistInfoTourEvent</code> model to include the concert link.</li>
1120
+ <li>Fixed <code>SpotifyClient.GetArtistInfo</code> method to correctly parse Spotify artist info and tour events.</li>
1121
+ </ul>
1122
+
1123
+ <h6 id="10115-20241104">[ 1.0.115 ] - 2024/11/04</h6>
1124
+
1125
+ <ul>
1126
+ <li>Updated <code>PlayerQueueInfo</code> model to include the <code>DateLastRefreshed</code> property, which contains the date and time items were was last refreshed in unix epoch format (e.g. 1669123919.331225). A value of zero indicates the date was unknown. Note that this attribute does not exist in the Spotify Web API; it was added here for convenience.</li>
1127
+ <li>Updated <code>Category</code> model to include the <code>Type</code> property, which contains a simulated data type. This is a helper property - no value with this name is returned from the Spotify Web API.</li>
1128
+ <li>Updated <code>Category</code> model to add the <code>uri</code> and <code>type</code> values to data returned by the <code>ToDictionary</code> method.</li>
1129
+ </ul>
1130
+
1131
+ <h6 id="10114-20241103">[ 1.0.114 ] - 2024/11/03</h6>
1132
+
1133
+ <ul>
1134
+ <li>Added <code>sortResult</code> argument to the following <code>SpotifyClient</code> methods: <code>GetArtistRelatedArtists</code>, <code>GetArtistTopTracks</code>. If True (default), result items are sorted by name prior to returning to the caller; otherwise, results are left in the order that the Spotify Web API returned them.</li>
1135
+ </ul>
1136
+
1137
+ <h6 id="10113-20241030">[ 1.0.113 ] - 2024/10/30</h6>
1138
+
1139
+ <ul>
1140
+ <li>Updated <code>PlayerQueueInfo</code> model to remove repeated items when retrieving player queue information. For some reason, the Spotify Web API will return up to 10 duplicate items with the same information. For example: if there is only 1 item in the queue, then 10 duplicate items are returned by the Spotify Web API; if there are 5 items in the queue, then 5 duplicate items are returned by the Spotify Web API. We will check for this scenario, and only return non-duplicate items if so.</li>
1141
+ <li>Updated <code>PageObject</code> model to include the <code>DateLastRefreshed</code> property, which contains the date and time items were was last refreshed in unix epoch format (e.g. 1669123919.331225). A value of zero indicates the date was unknown. Note that this attribute does not exist in the Spotify Web API; it was added here for convenience.</li>
1142
+ <li>Added <code>SpotifyClient.AddPlayerQueueItems</code> method that will add one or more items to the end of the user's current playback queue. </li>
1143
+ <li>Marked <code>SpotifyClient.AddPlayerQueueItem</code> method as deprecated; use the new <code>AddPlayerQueueItems</code> method instead.</li>
1144
+ </ul>
1145
+
1146
+ <h6 id="10112-20241019">[ 1.0.112 ] - 2024/10/19</h6>
1147
+
1148
+ <ul>
1149
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevice</code> method to issue a slight delay after disconnecting the device. This should prevent <code>Getinformation</code> exceptions for devices that require a little bit of extra time after a Disconnect (e.g. zeroconf <code>resetUsers</code>) request in order to be ready for a Connect (e.g. zeroconf <code>addUser</code>) request.</li>
1150
+ </ul>
1151
+
1152
+ <h6 id="10111-20241014">[ 1.0.111 ] - 2024/10/14</h6>
1153
+
1154
+ <ul>
1155
+ <li>Updated <code>SpotifyClient.GetChapter</code> method to make the <code>chapterId</code> argument optional; if not supplied, the currently playing chapter id value is used instead.</li>
1156
+ </ul>
1157
+
1158
+ <h6 id="10110-20241010">[ 1.0.110 ] - 2024/10/10</h6>
1159
+
1160
+ <ul>
1161
+ <li>Updated <code>ImageObject.GetImageHighestResolution</code> method to account for null width values.</li>
1162
+ </ul>
1163
+
1164
+ <h6 id="10109-20241010">[ 1.0.109 ] - 2024/10/10</h6>
1165
+
1166
+ <ul>
1167
+ <li>Correctly Updated various methods that return an ImageUrl property to return the highest resolution image from the Images collection instead of the first image. For some reason, the Spotify Web API sets the first Images collection image to the lowest resolution (e.g. 64x64); for all other Images, the highest resolution image is listed first (e.g. 640x640).</li>
1168
+ </ul>
1169
+
1170
+ <h6 id="10108-20241010">[ 1.0.108 ] - 2024/10/10</h6>
1171
+
1172
+ <ul>
1173
+ <li>Updated various methods that return an ImageUrl property to return the highest resolution image from the Images collection instead of the first image. For some reason, the Spotify Web API sets the first Images collection image to the lowest resolution (e.g. 64x64); for all other Images, the highest resolution image is listed first (e.g. 640x640).</li>
1174
+ </ul>
1175
+
1176
+ <h6 id="10107-20241009">[ 1.0.107 ] - 2024/10/09</h6>
1177
+
1178
+ <ul>
1179
+ <li>Updated <code>SpotifyClient.RemoveShowFavorites</code> method to account for Spotify Web API changes to remove show favorites.</li>
1180
+ <li>Updated <code>SpotifyClient.SaveShowFavorites</code> method to account for Spotify Web API changes to save show favorites.</li>
1181
+ <li>Updated <code>SpotifyClient.CheckPlaylistFollowers</code> method to account for Spotify Web API changes to <code>userIds</code> argument, which is now deprecated. A single item list containing current user's Spotify Username must now be used.</li>
1182
+ </ul>
1183
+
1184
+ <h6 id="10106-20241004">[ 1.0.106 ] - 2024/10/04</h6>
1185
+
1186
+ <ul>
1187
+ <li>Fixed various python <code>SyntaxWarning: invalid escape sequence '\ '</code> warnings that were being generated when code was executed. Something changed with Home Assistant recently that turned these "used to be ignored" warnings into actual warnings that wind up in the HA System Log! This is due to invalid escaped characters in various string comments that are used for documentation purposes (e.g. """ this is a code comment """).</li>
1188
+ </ul>
1189
+
1190
+ <h6 id="10105-20241004">[ 1.0.105 ] - 2024/10/04</h6>
1191
+
1192
+ <ul>
1193
+ <li>Updated Spotify Connect device processing to only require the userid and password parameters when authenticating to devices that require user and password values. Some devices only require a loginid value (e.g. spotifyd, Spotify Connect AddOn, librespot, Sonos, etc). The user should not have to specify userid and password values if they are not required!</li>
1194
+ <li>Cleaned up some documentation, as well as some of the code examples.</li>
1195
+ </ul>
1196
+
1197
+ <h6 id="10104-20241003">[ 1.0.104 ] - 2024/10/03</h6>
1198
+
1199
+ <ul>
1200
+ <li>Updated <code>SpotifyClient.PlayerMediaSeek</code> method to change the <code>progressMS</code> check to <code>&lt;= 0</code> when invoking relative positioning.</li>
1201
+ </ul>
1202
+
1203
+ <h6 id="10103-20241003">[ 1.0.103 ] - 2024/10/03</h6>
1204
+
1205
+ <ul>
1206
+ <li>Updated <code>SpotifyClient.PlayerMediaSeek</code> method to add relative positioning capability. This allows you to seek ahead / behind by a specified <code>relativePositionMS</code> positioning amount. The <code>positionMS</code> argument must be zero to enable this functionality. Note that the relative position functionality is not defined by the Spotify Web API. The functionality was added to this API to support "skip" seeking.</li>
1207
+ </ul>
1208
+
1209
+ <h6 id="10102-20240929">[ 1.0.102 ] - 2024/09/29</h6>
1210
+
1211
+ <ul>
1212
+ <li>Updated <code>SpotifyClient.GetShowFavorites</code> method to only return podcast show items by default. Prior to this fix, it was returning both audiobook and podcast shows. The new <code>excludeAudiobooks</code> argument allows you to return both audiobook and podcast shows (default returned by Spotify Web API).</li>
1213
+ </ul>
1214
+
1215
+ <h6 id="10101-20240928">[ 1.0.101 ] - 2024/09/28</h6>
1216
+
1217
+ <ul>
1218
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to load authorization credentials for the Spotify Connect <code>addUser</code> blob from a <code>credentials.json</code> file for devices that utilize librespot / spotifyd. Spotify no longer supports uername / password authentication via librespot (always returns "Bad Credentials" exceptions. This allows the librespot <code>credentials.json</code> file to be copied to the spotifywebapiPython storage folder, and used for calls to the librespot <code>addUser</code> zeroconf endpoint.</li>
1219
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevice</code> and <code>PlayerActivateDevices</code> methods to bypass the call to Spotify Connect Zeroconf Disconnect for devices that utilize librespot / spotifyd. librespot does not implement the Spotify Connect Zeroconf <code>resetUsers</code> endpoint, so the request always fails with a 404.</li>
1220
+ </ul>
1221
+
1222
+ <h6 id="10100-20240926">[ 1.0.100 ] - 2024/09/26</h6>
1223
+
1224
+ <ul>
1225
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevice</code> method to force a Spotify Connect Disconnect call to the device if <code>activateDevice</code> argument is <code>True</code>. The <code>verifyUserContext</code> argument is deprecated as well. This was necessary, as Spotify Connect device manufacturers do not use the Spotify Connect Zeroconf Information <code>ActiveUser</code> property consistently.</li>
1226
+ <li>Added <code>PlayerTransferPlayback.forceActivateDevice</code> argument that allows you to force activate the Spotify Connect device as part of the transfer of playback.</li>
1227
+ </ul>
1228
+
1229
+ <h6 id="1099-20240924">[ 1.0.99 ] - 2024/09/24</h6>
1230
+
1231
+ <ul>
1232
+ <li>Added <code>PlayerPlayState.ItemType</code> property that denotes the type of episode being played: <code>podcast</code> or <code>audiobook</code>. This property is only loaded when the <code>SpotifyClient</code> <code>GetPlayerNowPlaying</code> or <code>GetPlayerPlaybackState</code> method is called with <code>additionalTypes='episode'</code>.</li>
1233
+ </ul>
1234
+
1235
+ <h6 id="1098-20240924">[ 1.0.98 ] - 2024/09/24</h6>
1236
+
1237
+ <ul>
1238
+ <li>Added <code>SpotifyClient.IsAudiobookEpisode</code> method that returns true if the specified episode id is an audiobook chapter; otherwise, false. This allows you to programatically determine the difference between a podcast / show episode, and an audiobook episode.</li>
1239
+ </ul>
1240
+
1241
+ <h6 id="1097-20240920">[ 1.0.97 ] - 2024/09/20</h6>
1242
+
1243
+ <ul>
1244
+ <li>Updated <code>ZeroconfGetInfoAlias</code> to fix a bug related to Spotify Connect devices that define aliases (introduced with v1.0.93). This was causing <code>TypeError: unsupported operand type(s) for &amp;: 'str' and 'tuple'</code> exceptions if a device had aliases defined.</li>
1245
+ </ul>
1246
+
1247
+ <h6 id="1096-20240919">[ 1.0.96 ] - 2024/09/19</h6>
1248
+
1249
+ <ul>
1250
+ <li>Added defensive code in various parsers to account for the Spotify Web API returning an invalid / incomplete object. This was noticed with the <code>GetAlbumFavorites</code> method, but also applied to other models that inherited from PageObject.</li>
1251
+ </ul>
1252
+
1253
+ <h6 id="1095-20240912">[ 1.0.95 ] - 2024/09/12</h6>
1254
+
1255
+ <ul>
1256
+ <li>Added <code>image_url</code> attribute value to all models that support a <code>ToDictionary()</code> method (some that were previously missed in 1.0.94 release).</li>
1257
+ </ul>
1258
+
1259
+ <h6 id="1094-20240912">[ 1.0.94 ] - 2024/09/12</h6>
1260
+
1261
+ <ul>
1262
+ <li>Added <code>image_url</code> attribute value to all models that support a <code>ToDictionary()</code> method.</li>
1263
+ <li>Miscellaneous documentation updates.</li>
1264
+ </ul>
1265
+
1266
+ <h6 id="1093-20240910">[ 1.0.93 ] - 2024/09/10</h6>
1267
+
1268
+ <ul>
1269
+ <li>Updated <code>SpotifyClient.GetAlbumFavorites</code> method to correctly sort results based upon the <code>sortResult</code> argument setting; true to sort by name ascending, false to sort by AddedAt descending.</li>
1270
+ <li>Updated <code>SpotifyClient.GetEpisodeFavorites</code> method to correctly sort results based upon the <code>sortResult</code> argument setting; true to sort by name ascending, false to sort by AddedAt descending.</li>
1271
+ <li>Updated <code>SpotifyClient.GetShowFavorites</code> method to correctly sort results based upon the <code>sortResult</code> argument setting; true to sort by name ascending, false to sort by AddedAt descending.</li>
1272
+ <li>Updated <code>SpotifyClient.GetTrackFavorites</code> method to correctly sort results based upon the <code>sortResult</code> argument setting; true to sort by name ascending, false to sort by AddedAt descending.</li>
1273
+ </ul>
1274
+
1275
+ <h6 id="1092-20240823">[ 1.0.92 ] - 2024/08/23</h6>
1276
+
1277
+ <ul>
1278
+ <li>Updated <code>SpotifyClient.FollowPlaylist</code> method to make the <code>playlistId</code> argument optional; if not supplied, the currently playing playlist id value is used instead.</li>
1279
+ <li>Updated <code>SpotifyClient.GetAlbum</code> method to make the <code>albumId</code> argument optional; if not supplied, the currently playing album id value is used instead.</li>
1280
+ <li>Updated <code>SpotifyClient.GetAlbumTracks</code> method to make the <code>albumId</code> argument optional; if not supplied, the currently playing album id value is used instead.</li>
1281
+ <li>Updated <code>SpotifyClient.GetArtist</code> method to make the <code>artistId</code> argument optional; if not supplied, the currently playing artist id value is used instead.</li>
1282
+ <li>Updated <code>SpotifyClient.GetArtistAlbums</code> method to make the <code>artistId</code> argument optional; if not supplied, the currently playing artist id value is used instead.</li>
1283
+ <li>Updated <code>SpotifyClient.GetArtistInfo</code> method to make the <code>artistId</code> argument optional; if not supplied, the currently playing artist id value is used instead.</li>
1284
+ <li>Updated <code>SpotifyClient.GetArtistRelatedArtists</code> method to make the <code>artistId</code> argument optional; if not supplied, the currently playing artist id value is used instead.</li>
1285
+ <li>Updated <code>SpotifyClient.GetArtistTopTracks</code> method to make the <code>artistId</code> argument optional; if not supplied, the currently playing artist id value is used instead.</li>
1286
+ <li>Updated <code>SpotifyClient.GetAudiobook</code> method to make the <code>audiobookId</code> argument optional; if not supplied, the currently playing audiobook id value is used instead.</li>
1287
+ <li>Updated <code>SpotifyClient.GetAudiobookChapters</code> method to make the <code>audiobookId</code> argument optional; if not supplied, the currently playing audiobook id value is used instead.</li>
1288
+ <li>Updated <code>SpotifyClient.GetEpisode</code> method to make the <code>episodeId</code> argument optional; if not supplied, the currently playing episode id value is used instead.</li>
1289
+ <li>Updated <code>SpotifyClient.GetPlaylist</code> method to make the <code>playlistId</code> argument optional; if not supplied, the currently playing playlist id value is used instead.</li>
1290
+ <li>Updated <code>SpotifyClient.GetPlaylistItems</code> method to make the <code>playlistId</code> argument optional; if not supplied, the currently playing playlist id value is used instead.</li>
1291
+ <li>Updated <code>SpotifyClient.GetShow</code> method to make the <code>showId</code> argument optional; if not supplied, the currently playing show id value is used instead.</li>
1292
+ <li>Updated <code>SpotifyClient.GetShowEpisodes</code> method to make the <code>showId</code> argument optional; if not supplied, the currently playing show id value is used instead.</li>
1293
+ <li>Updated <code>SpotifyClient.GetTrack</code> method to make the <code>trackId</code> argument optional; if not supplied, the currently playing track id value is used instead.</li>
1294
+ <li>Updated <code>SpotifyClient.GetTracksAudioFeatures</code> method to make the <code>trackId</code> argument optional; if not supplied, the currently playing track id value is used instead.</li>
1295
+ <li>Updated <code>SpotifyClient.UnfollowPlaylist</code> method to make the <code>playlistId</code> argument optional; if not supplied, the currently playing playlist id value is used instead.</li>
1296
+ </ul>
1297
+
1298
+ <h6 id="1091-20240822">[ 1.0.91 ] - 2024/08/22</h6>
1299
+
1300
+ <ul>
1301
+ <li>Updated <code>CheckTrackFavorites</code>, <code>RemoveTrackFavorites</code>, and <code>SaveTrackFavorites</code> methods to ensure that nowplaying item was a track and not an episode item.</li>
1302
+ </ul>
1303
+
1304
+ <h6 id="1090-20240822">[ 1.0.90 ] - 2024/08/22</h6>
1305
+
1306
+ <ul>
1307
+ <li>Updated various methods to not log handled exception data as unhandled exceptions.</li>
1308
+ </ul>
1309
+
1310
+ <h6 id="1089-20240822">[ 1.0.89 ] - 2024/08/22</h6>
1311
+
1312
+ <ul>
1313
+ <li>Updated <code>SpotifyClient.CheckAlbumFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing album id value is used instead.</li>
1314
+ <li>Updated <code>SpotifyClient.CheckArtistsFollowing</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing artist id value is used instead.</li>
1315
+ <li>Updated <code>SpotifyClient.CheckAudiobookFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing audiobook id value is used instead.</li>
1316
+ <li>Updated <code>SpotifyClient.CheckEpisodeFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing episode id value is used instead.</li>
1317
+ <li>Updated <code>SpotifyClient.CheckShowFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing show id value is used instead.</li>
1318
+ <li>Updated <code>SpotifyClient.CheckTrackFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing track id value is used instead.</li>
1319
+ </ul>
1320
+
1321
+ <h6 id="1088-20240820">[ 1.0.88 ] - 2024/08/20</h6>
1322
+
1323
+ <ul>
1324
+ <li>Updated <code>SpotifyClient.DefaultDeviceId</code> property to setter to account for empty string values.</li>
1325
+ </ul>
1326
+
1327
+ <h6 id="1087-20240820">[ 1.0.87 ] - 2024/08/20</h6>
1328
+
1329
+ <ul>
1330
+ <li>Added <code>SpotifyClient.DefaultDeviceId</code> property to get / set the default device id (or name) to use for player transport methods (e.g. play, pause, skip, etc) that do not specify a device id and there is no active Spotify player detected (e.g. "Office", "5d4931f9d0684b625d702eaa24137b2c1d99539c", etc). This should avoid the <code>No Active Device</code> exceptions returned from the Spotify Web API when playback transport methods are called after long pauses of inactivity.</li>
1331
+ </ul>
1332
+
1333
+ <h6 id="1086-20240819">[ 1.0.86 ] - 2024/08/19</h6>
1334
+
1335
+ <ul>
1336
+ <li>Updated <code>SpotifyClient</code>, <code>ZeroconfConnect</code>, and <code>AuthClient</code> class constructors to include the <code>tokenStorageFile</code> argument that specifies the filename and extension of the authorization Token Cache file. This is used for Spotify Connect devices that utilize the <code>authorization_code</code> token type.</li>
1337
+ </ul>
1338
+
1339
+ <h6 id="1085-20240819">[ 1.0.85 ] - 2024/08/19</h6>
1340
+
1341
+ <ul>
1342
+ <li>Updated <code>SpotifyClient.RemoveAudiobookFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing audiobook id value is used instead.</li>
1343
+ <li>Updated <code>SpotifyClient.RemoveEpisodeFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing episode id value is used instead.</li>
1344
+ <li>Updated <code>SpotifyClient.RemoveShowFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing show id value is used instead.</li>
1345
+ <li>Updated <code>SpotifyClient.SaveAudiobookFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing audiobook id value is used instead.</li>
1346
+ <li>Updated <code>SpotifyClient.SaveEpisodeFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing episode id value is used instead.</li>
1347
+ <li>Updated <code>SpotifyClient.SaveShowFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing show id value is used instead.</li>
1348
+ </ul>
1349
+
1350
+ <h6 id="1084-20240818">[ 1.0.84 ] - 2024/08/18</h6>
1351
+
1352
+ <ul>
1353
+ <li>Updated <code>SpotifyClient.PlayerTransferPlayback</code> method to default the <code>refreshDeviceList</code> argument to True so that the Spotify Connect device list is refreshed by default before transferring playback.</li>
1354
+ <li>Updated <code>ZeroconfConnect</code> methods to use <code>connection:close</code> headers for requests to the Spotify Connect Zeroconf API endpoints.</li>
1355
+ </ul>
1356
+
1357
+ <h6 id="1083-20240815">[ 1.0.83 ] - 2024/08/15</h6>
1358
+
1359
+ <ul>
1360
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevice</code> method to check if a Spotify Desktop Client Application OAuth2 token exists when a PlayerTransfer targets a Sonos device. If not found, then control will be transferred to the Sonos device using it's local queue; if found, then Spotify Connect will reconnect to the device and control will be transferred to the Sonos device using Spotify Connect.</li>
1361
+ </ul>
1362
+
1363
+ <h6 id="1082-20240815">[ 1.0.82 ] - 2024/08/15</h6>
1364
+
1365
+ <ul>
1366
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevice</code> method to get real-time information for some portions of the device info for devices detected by zeroconf discovery (non-dynamic), even when using the cache. Prior to this fix, transfer of playback failed for dynamic devices (web player, mobile app player, etc).</li>
1367
+ </ul>
1368
+
1369
+ <h6 id="1081-20240815">[ 1.0.81 ] - 2024/08/15</h6>
1370
+
1371
+ <ul>
1372
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevice</code> method to get real-time information for some portions of the device info, even when using the cache. Prior to this, stale information was being used that had been updated since the last cache update.</li>
1373
+ </ul>
1374
+
1375
+ <h6 id="1080-20240815">[ 1.0.80 ] - 2024/08/15</h6>
1376
+
1377
+ <ul>
1378
+ <li>Added <code>SpotifyClient.GetSpotifyConnectDevice</code> method that will get information about a specific Spotify Connect player device, and (optionally) activate the device if it requires it.</li>
1379
+ <li>Marked the <code>SpotifyClient.PlayerResolveDeviceId</code> method as deprecated, and it will be removed in a future release; use the <code>GetSpotifyConnectDevice</code> instead.</li>
1380
+ <li>Removed <code>SpotifyClient.PlayerTransferPlayback</code> method argument <code>resolveDeviceId</code> as it is no longer used.</li>
1381
+ <li>Added <code>SpotifyClient.PlayerTransferPlayback</code> method argument <code>refreshDeviceList</code> to refresh the Spotify Connect device list (True) or use the Spotify Connect device list cache (False) when resolving a Spotify Connect device value.</li>
1382
+ </ul>
1383
+
1384
+ <h6 id="1079-20240813">[ 1.0.79 ] - 2024/08/13</h6>
1385
+
1386
+ <ul>
1387
+ <li>Updated <code>ZeroconfConnect._GetSpotifyConnectAuthorizationCodeToken</code> method to raise an exception if the Spotify Client Application authorization access token could not be found. Prior logic was causing the process to wait for a user response to a token authorization request, which would never happen since the process was running on a server.</li>
1388
+ </ul>
1389
+
1390
+ <h6 id="1078-20240812">[ 1.0.78 ] - 2024/08/12</h6>
1391
+
1392
+ <ul>
1393
+ <li>Updated <code>ZeroconfConnect</code> class constructor to include the <code>tokenStorageDir</code> argument that specified the directory path that will contain the <code>tokens.json</code> cache file. This is used for Spotify Connect devices that utilize the <code>authorization_code</code> token type.</li>
1394
+ </ul>
1395
+
1396
+ <h6 id="1077-20240812">[ 1.0.77 ] - 2024/08/12</h6>
1397
+
1398
+ <ul>
1399
+ <li>Updated <code>AuthClient.AuthorizeWithServer</code> method to specify a redirect uri with host, port, and path values. Prior code was only allowing a redirect uri with host and port values.</li>
1400
+ <li>Added <code>SpotifyClient.SetAuthTokenAuthorizationCode</code> method argument <code>redirectUriPath</code> to allow a redirect_uri path value to be specified for OAuth authorization requests.</li>
1401
+ <li>Added <code>SpotifyClient.SetAuthTokenAuthorizationCodePKCE</code> method argument <code>redirectUriPath</code> to allow a redirect_uri path value to be specified for OAuth authorization requests.</li>
1402
+ <li>Updated <code>ZeronconfConnect</code> class to correctly process Spotify Connect requests for token type <code>authorization_code</code> devices.</li>
1403
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayTrackFavorites</code> method to add the <code>limitTotal</code> argument that limits the number of tracks retrieved from favorites.</li>
1404
+ <li>Added <code>sortResult</code> argument to the following <code>SpotifyClient</code> methods: <code>GetAlbumFavorites</code>, <code>GetAlbumNewReleases</code>, <code>GetArtistAlbums</code>, <code>GetArtistsFollowed</code>, <code>GetAudiobookFavorites</code>, <code>GetBrowseCategorys</code>, <code>GetCategoryPlaylists</code>, <code>GetEpisodeFavorites</code>, <code>GetFeaturedPlaylists</code>, <code>GetPlayerDevices</code>, <code>GetPlaylistFavorites</code>, <code>GetPlaylistsForUser</code>, <code>GetShowFavorites</code>, <code>GetSpotifyConnectDevices</code>, <code>GetTrackFavorites</code>, <code>GetUsersTopArtists</code>, <code>GetUsersTopTracks</code>. If True (default), result items are sorted by name prior to returning to the caller; otherwise, results are left in the order that the Spotify Web API returned them.</li>
1405
+ </ul>
1406
+
1407
+ <h6 id="1076-20240718">[ 1.0.76 ] - 2024/07/18</h6>
1408
+
1409
+ <ul>
1410
+ <li>Updated <code>ZeroconfConnect</code> class to remove some test code that was accidentally left in place for tokentype <code>authorization_code</code> research.</li>
1411
+ </ul>
1412
+
1413
+ <h6 id="1075-20240717">[ 1.0.75 ] - 2024/07/17</h6>
1414
+
1415
+ <ul>
1416
+ <li>Updated <code>PlayerPlayState.ShuffleState</code> method to return a boolean True or False value to account for changes to underlying Spotify Web API.</li>
1417
+ <li>Updated <code>PlayerPlayState.SmartShuffle</code> method to return a boolean True or False value to account for changes to underlying Spotify Web API.</li>
1418
+ </ul>
1419
+
1420
+ <h6 id="1074-20240715">[ 1.0.74 ] - 2024/07/15</h6>
1421
+
1422
+ <ul>
1423
+ <li>Added <code>SpotifyConnectDevices.GetDeviceById</code> method to return a <code>SpotifyConnectDevice</code> instance if the collection contains the specified device id value; otherwise, None.</li>
1424
+ <li>Added <code>SpotifyConnectDevices.GetDeviceByName</code> method to return a <code>SpotifyConnectDevice</code> instance if the collection contains the specified device name value; otherwise, None.</li>
1425
+ <li>Updated <code>ZeroconfConnect</code> class to use a '2.7.1' version indicator if no version argument was specified on the class contructor.</li>
1426
+ <li>Updated <code>ZeroconfConnect.Disconnect</code> to check for an invalid JSON response. It has been found that some devices (Sonos, etc) do not return a proper JSON response for the <code>resetUsers</code> action. If a JSON response was not returned, then it will treat the http status code as the response code; if it's not a 200, then it will raise an exception.</li>
1427
+ <li>Updated <code>SpotifyClient.PlayerResolveDeviceId</code> method to not switch the active user context for Sonos devices. Sonos devices are restricted, and (currently) cannot be controlled by the Spotify Web-Services API player methods.</li>
1428
+ </ul>
1429
+
1430
+ <h6 id="1073-20240702">[ 1.0.73 ] - 2024/07/02</h6>
1431
+
1432
+ <ul>
1433
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevices</code> to gracefully handle device unavailable scenarios. It will try to reach the device by its direct HostIpAddress first; if that fails, then it will try to reach the device by its Server alias; if that fails, then it will log a warning that the device could not be reached and press on.</li>
1434
+ <li>Updated <code>ZeroconfConnect.Disconnect</code> to check for an invalid JSON response. It has been found that some devices (Sonos, etc) do not return a proper JSON response for the <code>resetUsers</code> action. If a JSON response was not returned, then it will treat the http status code as the response code; if it's not a 200, then it will raise an exception.</li>
1435
+ <li>Updated <code>BlobBuilder</code> methods to add tracing of blob data contents.</li>
1436
+ </ul>
1437
+
1438
+ <h6 id="1072-20240628">[ 1.0.72 ] - 2024/06/28</h6>
1439
+
1440
+ <ul>
1441
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to handle the <code>authorization_code</code> token type for Zeroconf API <code>addUser</code> requests.</li>
1442
+ </ul>
1443
+
1444
+ <h6 id="1071-20240627">[ 1.0.71 ] - 2024/06/27</h6>
1445
+
1446
+ <ul>
1447
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to properly return the response data from the <code>addUser</code> request and process the results.</li>
1448
+ </ul>
1449
+
1450
+ <h6 id="1070-20240627">[ 1.0.70 ] - 2024/06/27</h6>
1451
+
1452
+ <ul>
1453
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to properly wait for device to become fully availabile if need be.</li>
1454
+ </ul>
1455
+
1456
+ <h6 id="1069-20240626">[ 1.0.69 ] - 2024/06/26</h6>
1457
+
1458
+ <ul>
1459
+ <li>Added properties and arguments to support the Zeroconf API <code>loginId</code> argument for the <code>addUser</code> request.</li>
1460
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to include the <code>deviceName</code> and <code>deviceId</code> keys for the <code>addUser</code> request for certain device manufacturer conditions.</li>
1461
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to not issue a Disconnect to reset the user context if the public key value is "INVALID", as the logic did not work as expected.</li>
1462
+ </ul>
1463
+
1464
+ <h6 id="1068-20240626">[ 1.0.68 ] - 2024/06/26</h6>
1465
+
1466
+ <ul>
1467
+ <li>Updated <code>ZeroconfConnect._CheckResponseForErrors</code> method to not process the Spotify Zeroconf API response, as each method calling the check response method will process the returned status.</li>
1468
+ </ul>
1469
+
1470
+ <h6 id="1067-20240625">[ 1.0.67 ] - 2024/06/25</h6>
1471
+
1472
+ <ul>
1473
+ <li>Updated <code>SpotifyClient.IsDeviceId</code> class to recognize UUID-formatted device id's (e.g. "48b677ca-ef9b-516f-b702-93bf2e8c67ba").</li>
1474
+ <li>Updated <code>ZeroconfConnect</code> class to not default the <code>version</code> value to <code>1.0</code>, in the event that newer devices may not support that version identifier.</li>
1475
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to not pass the <code>loginId</code> parameter to the request.</li>
1476
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to issue a Disconnect to reset the user context if the public key value is "INVALID".</li>
1477
+ </ul>
1478
+
1479
+ <h6 id="1066-20240625">[ 1.0.66 ] - 2024/06/25</h6>
1480
+
1481
+ <ul>
1482
+ <li>Updated <code>ZeroconfResponse</code> class to convert the <code>status</code> and <code>spotifyError</code> values to numeric from string. Some Spotify Connect devices return them as strings, while other return them as numerics. </li>
1483
+ </ul>
1484
+
1485
+ <h6 id="1065-20240625">[ 1.0.65 ] - 2024/06/25</h6>
1486
+
1487
+ <ul>
1488
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to account for "ERROR-INVALID-PUBLICKEY" statuses returned for some devices. This will retry the connection request with the PublicKey value returned from the initial request.</li>
1489
+ </ul>
1490
+
1491
+ <h6 id="1064-20240624">[ 1.0.64 ] - 2024/06/24</h6>
1492
+
1493
+ <ul>
1494
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevices</code> method to correctly set the currently active device.</li>
1495
+ </ul>
1496
+
1497
+ <h6 id="1063-20240624">[ 1.0.63 ] - 2024/06/24</h6>
1498
+
1499
+ <ul>
1500
+ <li>Updated <code>ZeroconfConnect</code> class to process the Spotify Zeroconf API status code from the JSON response instead of processing the HTTP request status code. It has been found that some Spotify Connect manufacturers return different HTTP status codes than other manufacturers; but the Spotify Connect <code>status</code>, <code>statusString</code> and <code>spotifyError</code> JSON properties seem to be consistent across the board.</li>
1501
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevices</code> method to filter out duplicate Spotify Connect Device entries for devices that have been grouped together. For example, the "Bose-ST10-1" and "Bose-ST10-2" are grouped as a stereo pair; there will be two Zeroconf discovery result entries with different instance names, but their Zeroconf getInfo endpoint url will be the same. When this happens, it causes the values to show up as duplicates if we process both of them.</li>
1502
+ </ul>
1503
+
1504
+ <h6 id="1062-20240621">[ 1.0.62 ] - 2024/06/21</h6>
1505
+
1506
+ <ul>
1507
+ <li>Updated <code>SpotifyDiscovery.DiscoverDevices</code> method to properly free Zeroconf resources after service discovery, and prevent possible memory leaks and crashes due to running out of resources.</li>
1508
+ </ul>
1509
+
1510
+ <h6 id="1061-20240621">[ 1.0.61 ] - 2024/06/21</h6>
1511
+
1512
+ <ul>
1513
+ <li>Added <code>ZeroconfGetInfo.IsInDeviceList</code> property that returns the status of active device list verification process (Verification not Performed, Verified Active, Verified Inactive). </li>
1514
+ </ul>
1515
+
1516
+ <h6 id="1060-20240621">[ 1.0.60 ] - 2024/06/21</h6>
1517
+
1518
+ <ul>
1519
+ <li>Updated <code>ZeroconfConnect</code> class to process all responses as JSON responses. It was found that some Spotify Zeroconf API capable devices were not properly setting the <code>Content-Type</code> in the returned http response header.</li>
1520
+ <li>Updated <code>SpotifyDiscovery</code> class to process the individual Spotify Connect instance names that were discovered via Zeroconf. Prior logic was adding a device for every IPV4 address that was found for an instance, assuming that each instance only contained one IP address; some services contain multiple IP addressess for the same instance name (specifically, the <code>SpotifyConnect</code> add-on, which runs in a docker container).</li>
1521
+ <li>Updated <code>SpotifyDiscovery</code> class to rename the <code>HostIpv4Address</code> property (and method arguments) to <code>HostIpAddress</code>. The address specified in this argument can be an IP address (e.g. "192.168.1.81") or an alias (e.g. "bose.speaker.kitchen").</li>
1522
+ <li>Updated <code>ZeroconfConnect</code> class to rename the <code>HostIpv4Address</code> property (and method arguments) to <code>HostIpAddress</code>. The address specified in this argument can be an IP address (e.g. "192.168.1.81") or an alias (e.g. "bose.speaker.kitchen").</li>
1523
+ <li>Updated various <code>SpotifyClient</code> methods to utilize the default <code>HostIpAddress</code> (or <code>Server</code> value if default <code>HostIpAddress</code> was not discovered) when connecting to a Spotify Connect capable device. Methods updated were: <code>PlayerActivateDevices</code>, <code>GetSpotifyConnectDevices</code>, <code>PlayerResolveDeviceId</code>.</li>
1524
+ </ul>
1525
+
1526
+ <h6 id="1059-20240619">[ 1.0.59 ] - 2024/06/19</h6>
1527
+
1528
+ <ul>
1529
+ <li>Updated <code>SpotifyClient</code> methods that call <code>PlayerResolveDeviceId</code> with a new parameter that indicates if the device should be resolved (true) or not (False). This allows multiple methods that call <code>PlayerResolveDeviceId</code> to be called from the same method, and only resolve the device one time. This was sone to ensure that device resolution did not occur more than once, as it's such a time consuming operation. Methods updated were: <code>PlayerMediaPlayContext</code>, <code>PlayerMediaPlayTrackFavorites</code>, <code>PlayerMediaPlayTracks</code>, <code>PlayerTransferPlayback</code>.</li>
1530
+ </ul>
1531
+
1532
+ <h6 id="1058-20240619">[ 1.0.58 ] - 2024/06/19</h6>
1533
+
1534
+ <ul>
1535
+ <li>Updated <code>SpotifyClient.PlayerResolveDeviceId</code> method callers to log a warning message if the specified device value could not be resolved and just return a null value.</li>
1536
+ </ul>
1537
+
1538
+ <h6 id="1057-20240619">[ 1.0.57 ] - 2024/06/19</h6>
1539
+
1540
+ <ul>
1541
+ <li>Updated <code>SpotifyClient.PlayerResolveDeviceId</code> method callers to gracefully handle the <code>SpotifyApiError</code> error if the specified device value could not be resolved.</li>
1542
+ </ul>
1543
+
1544
+ <h6 id="1056-20240619">[ 1.0.56 ] - 2024/06/19</h6>
1545
+
1546
+ <ul>
1547
+ <li>Updated <code>SpotifyClient.PlayerResolveDeviceId</code> method to raise a <code>SpotifyApiError</code> error if the specified device value could not be resolved.</li>
1548
+ </ul>
1549
+
1550
+ <h6 id="1055-20240619">[ 1.0.55 ] - 2024/06/19</h6>
1551
+
1552
+ <ul>
1553
+ <li>Updated <code>SpotifyConnectDevices</code> model to include a <code>DateLastRefreshed</code> property that indicates when the device list was last refreshed.</li>
1554
+ </ul>
1555
+
1556
+ <h6 id="1054-20240619">[ 1.0.54 ] - 2024/06/19</h6>
1557
+
1558
+ <ul>
1559
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevices</code> method to store results to the configuration cache.</li>
1560
+ </ul>
1561
+
1562
+ <h6 id="1053-20240618">[ 1.0.53 ] - 2024/06/18</h6>
1563
+
1564
+ <ul>
1565
+ <li>Updated <code>ZeroconfConnect.Connect</code> method to provide a small delay after processing the Spotify Zeroconf API command, which will give the device some time to process the change.</li>
1566
+ <li>Updated <code>ZeroconfConnect.Disconnect</code> method to provide a small delay after processing the Spotify Zeroconf API command, which will give the device some time to process the change.</li>
1567
+ </ul>
1568
+
1569
+ <h6 id="1052-20240618">[ 1.0.52 ] - 2024/06/18</h6>
1570
+
1571
+ <ul>
1572
+ <li>Updated <code>SpotifyClient.GetSpotifyConnectDevices</code> method to retrieve dynamic Spotify Connect devices as well as static devices. Dynamic devices are Spotify Connect devices that are not found in Zeroconf discovery process, but still exist in the player device list. These are usually Spotify Connect web or mobile players with temporary device id's.</li>
1573
+ </ul>
1574
+
1575
+ <h6 id="1051-20240618">[ 1.0.51 ] - 2024/06/18</h6>
1576
+
1577
+ <ul>
1578
+ <li>Added <code>SpotifyClient.GetSpotifyConnectDevices</code> method that gets information about all available Spotify Connect player devices (not just ones controlled by a user).</li>
1579
+ </ul>
1580
+
1581
+ <h6 id="1050-20240618">[ 1.0.50 ] - 2024/06/18</h6>
1582
+
1583
+ <ul>
1584
+ <li>Added <code>SpotifyClient.ZeroconfClient</code> property that contains a reference to the Zeroconf client instance used to discover Spotify Connect devices.</li>
1585
+ <li>Added <code>SpotifyDiscovery.ZeroconfClient</code> property that contains a reference to the Zeroconf client instance used to discover Spotify Connect devices.</li>
1586
+ </ul>
1587
+
1588
+ <h6 id="1049-20240618">[ 1.0.49 ] - 2024/06/18</h6>
1589
+
1590
+ <ul>
1591
+ <li>Added <code>SpotifyClient.PlayerActivateDevices</code> method that activates all Spotify Connect player devices, and (optionally) switches the active user context to the current user context. Note that you can still activate individual devices using the <code>ZeroconfConnect.Connect</code> method if you wish.</li>
1592
+ <li>Added <code>SpotifyClient.PlayerResolveDeviceId</code> method that resolves a Spotify Connect device identifier from a specified device id, name, alias id, or alias name. This will ensure that the device id can be found on the network, as well as connect to the device (if necessary) with the current user context. </li>
1593
+ <li>Updated various <code>SpotifyClient</code> methods to utilize the new <code>SpotifyClient.PlayerResolveDeviceId</code> method so that device id's are automatically activated if they are currently deactivated but available on the local network. Methods updated were: <code>PlayerMediaPlayContext</code>, <code>PlayerMediaPlayTrackFavorites</code>, <code>PlayerMediaPlayTracks</code>, <code>PlayerTransferPlayback</code>.</li>
1594
+ <li>Updated <code>SpotifyClient</code> class constructor so that Spotify Connect user context credentials (e.g. username and password) may be supplied for the resolution of device id / name. Note these credentials are only used for Spotify Connect device resolution, and are not used by method calls that are made to the underlying Spotify Web API.</li>
1595
+ <li>Updated <code>SpotifyDiscovery</code> class constructor so that a <code>Zeroconf</code> instance can be provided. This allows Home Assistant integrations to use the HA Zeroconf instance and avoid the log warnings of multiple Zeroconf instances in use.</li>
1596
+ <li>Removed <code>SpotifyClient</code> processing from the <code>SpotifyDiscovery</code> class, as the processing was moved into the <code>SpotifyClient</code> class itself.</li>
1597
+ </ul>
1598
+
1599
+ <h6 id="1048-20240610">[ 1.0.48 ] - 2024/06/10</h6>
1600
+
1601
+ <ul>
1602
+ <li>Forgot to re-build prior to deploying!</li>
1603
+ </ul>
1604
+
1605
+ <h6 id="1047-20240610">[ 1.0.47 ] - 2024/06/10</h6>
1606
+
1607
+ <ul>
1608
+ <li>Moved all Spotify Zeroconf API related classes to a new namespace called <code>zeroconfapi</code>. Classes moved were: <code>ZeroconfResponse</code>, <code>ZeroconfGetInfo</code>, <code>ZeroconfGetInfoAlias</code>, <code>ZeroconfGetInfoDrmMediaFormat</code>.</li>
1609
+ <li>Added <code>ZeroconfConnect</code> class that contains various methods that support interfacing with the Spotify Zeroconf API.</li>
1610
+ <li>Added <code>ZeroconfConnect.Connect</code> method that calls the <code>addUser</code> Spotify Zeroconf API endpoint to issue a call to SpConnectionLoginBlob. If successful, the associated device id is added to the Spotify Connect active device list for the specified user account.</li>
1611
+ <li>Added <code>ZeroconfConnect.Disconnect</code> method that calls the <code>resetUsers</code> Spotify Zeroconf API endpoint to issue a call to SpConnectionLogout; the currently logged in user (if any) will be logged out of Spotify Connect, and the device id removed from the active Spotify Connect device list.</li>
1612
+ <li>Added <code>ZeroconfConnect.GetInformation</code> method that calls the <code>getInfo</code> Spotify Zeroconf API endpoint to return information about the device.</li>
1613
+ <li>Removed <code>SpotifyClient.ZeroconfAddUser</code> method, and replaced it with method <code>ZeroconfConnect.Connect</code>.</li>
1614
+ <li>Removed <code>SpotifyClient.ZeroconfResetUsers</code> method, and replaced it with method <code>ZeroconfConnect.Disconnect</code>.</li>
1615
+ <li>Removed <code>SpotifyClient.ZeroconfGetInformation</code> method, and replaced it with method <code>ZeroconfConnect.GetInformation</code>.</li>
1616
+ </ul>
1617
+
1618
+ <h6 id="1046-20240607">[ 1.0.46 ] - 2024/06/07</h6>
1619
+
1620
+ <ul>
1621
+ <li>Updated the following requirements due to Home Assistant dependency issues: 'oauthlib>=3.2.2', 'platformdirs>=4.1.0', 'requests>=2.31.0', 'requests_oauthlib>=1.3.1', 'zeroconf>=0.132.2'.</li>
1622
+ </ul>
1623
+
1624
+ <h6 id="1045-20240607">[ 1.0.45 ] - 2024/06/07</h6>
1625
+
1626
+ <ul>
1627
+ <li>Updated <code>zeroconf</code> requirements to "zeroconf>=0.132.2". This was causing installation issues with other components that utilize zeroconf.</li>
1628
+ </ul>
1629
+
1630
+ <h6 id="1044-20240607">[ 1.0.44 ] - 2024/06/07</h6>
1631
+
1632
+ <ul>
1633
+ <li>Added <code>SpotifyDiscovery.DiscoveredResults</code> class property that will contain an array of <code>ZeroconfDiscoveryResult</code> items that contain discovery details for each service that was discovered.</li>
1634
+ <li>Added model <code>ZeroconfDiscoveryResult</code> class that contains detailed Zeroconf ServiceInfo details that were discovered via Zeroconf.</li>
1635
+ <li>Added model <code>ZeroconfProperty</code> class that contains Zeroconf ServiceInfo property details that were discovered via Zeroconf.</li>
1636
+ <li>Added model <code>ZeroconfResponse</code> class that contains Zeroconf basic response variables.</li>
1637
+ <li>Added model <code>ZeroconfGetInfo</code> class that contains Zeroconf action=getInfo response variables.</li>
1638
+ <li>Added model <code>ZeroconfGetInfoAlias</code> class that contains Zeroconf action=getInfo Alias response variables.</li>
1639
+ <li>Added model <code>ZeroconfGetInfoDrmMediaFormat</code> class that contains Zeroconf action=getInfo DRM Media format response variables.</li>
1640
+ <li>Added logic to handle <code>503 Server Error</code> responses from the Spotify Web API.</li>
1641
+ <li>Added support for Spotify DJ playlist retrieval. As the Spotify Web API does not support retrieving the DJ playlist (<code>spotify:playlist:37i9dQZF1EYkqdzj48dyYq</code>), it simply returns a manually built representation of the playlist. Note that playlist tracks cannot be retrieved either for the DJ playlist, as the Spotify Web API does not support it.</li>
1642
+ </ul>
1643
+
1644
+ <h6 id="1043-20240421">[ 1.0.43 ] - 2024/04/21</h6>
1645
+
1646
+ <ul>
1647
+ <li>Added device name support to the following player methods that take a <code>deviceId</code> argument for player functions. You can now specify either a device id or device name in the <code>deviceId</code> argument to target a specific Spotify Connect Player device. <code>SpotifyClient</code> methods updated were: <code>AddPlayerQueueItem</code>, <code>PlayerMediaPause</code>, <code>PlayerMediaPlayContext</code>, <code>PlayerMediaPlayTrackFavorites</code>, <code>PlayerMediaPlayTracks</code>, <code>PlayerMediaResume</code>, <code>PlayerMediaSeek</code>, <code>PlayerMediaSkipNext</code>, <code>PlayerMediaSkipPrevious</code>, <code>PlayerSetRepeatMode</code>, <code>PlayerSetShuffleMode</code>, <code>PlayerSetVolume</code>, <code>PlayerTransferPlayback</code>.</li>
1648
+ <li>Added <code>SpotifyClient.PlayerConvertDeviceNameToId</code> method that converts a Spotify Connect player device name to it's equivalent id value if the value is a device name. If the value is a device id, then the value is returned as-is.</li>
1649
+ </ul>
1650
+
1651
+ <h6 id="1042-20240405">[ 1.0.42 ] - 2024/04/05</h6>
1652
+
1653
+ <ul>
1654
+ <li>Added <code>Device.IsMuted</code> property to indicate if volume is zero (muted) or not (unmuted).</li>
1655
+ <li>Added <code>PlayerPlayState.IsMuted</code> property to indicate if player device volume is zero (muted) or not (unmuted).</li>
1656
+ <li>Updated <code>SpotifyClient.PlayerMediaPlayTrackFavorites</code> method to set the shuffle mode prior to starting play of the track list. Prior to this change, the first track would always play first regardless of the shuffle setting; now it is part of the shuffle.</li>
1657
+ </ul>
1658
+
1659
+ <h6 id="1041-20240402">[ 1.0.41 ] - 2024/04/02</h6>
1660
+
1661
+ <ul>
1662
+ <li>Added <code>ArtistInfo</code> model that contains artist bio information.</li>
1663
+ <li>Added <code>ArtistInfoTourEvent</code> model that contains artist on tour event information.</li>
1664
+ <li>Added <code>SpotifyClient.GetArtistInfo</code> method to retrieve artist bio information for a specified Artist id.</li>
1665
+ <li>Added <code>SpotifyClient.PlayerMediaPlayTrackFavorites</code> method to play all tracks contained in the current users track favorites.</li>
1666
+ <li>Added <code>SpotifyClient.RemovePlaylist</code> method to remove a playlist by calling the <code>UnfollowPlaylist</code> method.</li>
1667
+ </ul>
1668
+
1669
+ <h6 id="1040-20240326">[ 1.0.40 ] - 2024/03/26</h6>
1670
+
1671
+ <ul>
1672
+ <li>Updated <code>SpotifyClient.PlayerVerifyDeviceDefault</code> method to check for a null <code>Device.Id</code> value when determining if an active device was set.</li>
1673
+ <li>Added <code>delay</code> argument to various <code>SpotifyClient</code> player command-related methods, which allows the Spotify Web API a little bit of time to process the change before returning from the method. Methods updated: <code>PlayerMediaPause</code>, <code>PlayerMediaPlayContext</code>, <code>PlayerMediaPlayTracks</code>, <code>PlayerMediaResume</code>, <code>PlayerMediaSeek</code>, <code>PlayerMediaSkipNext</code>, <code>PlayerMediaSkipPrevious</code>, <code>PlayerSetRepeatMode</code>, <code>PlayerSetShuffleMode</code>, <code>PlayerSetVolume</code>, <code>PlayerTransferPlayback</code>, <code>PlayerVerifyDeviceDefault</code>. Default delay is 250 milliseconds, but you can adjust accordingly (including removing the delay if you wish).</li>
1674
+ </ul>
1675
+
1676
+ <h6 id="1039-20240326">[ 1.0.39 ] - 2024/03/26</h6>
1677
+
1678
+ <ul>
1679
+ <li>Updated <code>PlayerPlayState.__init__</code> model to properly parse the Actions property.</li>
1680
+ </ul>
1681
+
1682
+ <h6 id="1038-20240326">[ 1.0.38 ] - 2024/03/26</h6>
1683
+
1684
+ <ul>
1685
+ <li>Updated <code>Device.__init__</code> model to validate the following properties were initialized from Spotify Web API results, and to set defaults if not: IsActive = False, IsPrivateSession = False, IsRestricted = False, SupportsVolume = False, VolumePercent = 0.</li>
1686
+ <li>Updated <code>PlayerPlayState.__init__</code> model to validate the following properties were initialized from Spotify Web API results, and to set defaults if not: Actions = PlayerActions(), Device = Device(), CurrentlyPlayingType = 'unknown', IsPlaying = False, ProgressMS = 0, RepeatState = 'off', ShuffleState = 'off', SmartShuffle = 'off', Timestamp = 0.</li>
1687
+ <li>Updated <code>PlayerActions.__init__</code> model to validate the following properties were initialized from Spotify Web API results, and to set defaults if not: InterruptingPlayback = False, Pausing = False, Resuming = False, Seeking = False, SkippingNext = False, SkippingPrev = False, TogglingRepeatContext = False, TogglingRepeatTrack = False, TogglingShuffle = False, TransferringPlayback = False.</li>
1688
+ </ul>
1689
+
1690
+ <h6 id="1037-20240319">[ 1.0.37 ] - 2024/03/19</h6>
1691
+
1692
+ <ul>
1693
+ <li>Updated <code>SpotifyClient.FollowArtists</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing track artist id value is used instead.</li>
1694
+ <li>Updated <code>SpotifyClient.UnfollowArtists</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing track artist id value is used instead.</li>
1695
+ <li>Updated <code>SpotifyClient.SaveAlbumFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing track album id value is used instead.</li>
1696
+ <li>Updated <code>SpotifyClient.RemoveAlbumFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing track album id value is used instead.</li>
1697
+ <li>Updated <code>SpotifyClient.CreatePlaylist</code> method to add the <code>imagePath</code> argument, which assigns an image to the created playlist.</li>
1698
+ <li>Updated <code>SpotifyClient.ChangePlaylistDetails</code> method to add the <code>imagePath</code> argument, which assigns an image to the updated playlist details.</li>
1699
+ </ul>
1700
+
1701
+ <h6 id="1036-20240319">[ 1.0.36 ] - 2024/03/19</h6>
1702
+
1703
+ <ul>
1704
+ <li>Fixed <code>SpotifyClient.SaveTrackFavorites</code> method for a bug introduced with v1.0.35 update causeing 'object of type 'bool' has no len()' exceptions.</li>
1705
+ <li>Fixed <code>SpotifyClient.RemoveTrackFavorites</code> method for a bug introduced with v1.0.35 update causeing 'object of type 'bool' has no len()' exceptions.</li>
1706
+ <li>Fixed <code>SpotifyClient.AddPlaylistItems</code> method for a bug introduced with v1.0.35 update causeing 'object of type 'bool' has no len()' exceptions.</li>
1707
+ <li>Fixed <code>SpotifyClient.RemovePlaylistItems</code> method for a bug introduced with v1.0.35 update causeing 'object of type 'bool' has no len()' exceptions.</li>
1708
+ </ul>
1709
+
1710
+ <h6 id="1035-20240318">[ 1.0.35 ] - 2024/03/18</h6>
1711
+
1712
+ <ul>
1713
+ <li>Updated <code>SpotifyClient.SaveTrackFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing id value is used instead.</li>
1714
+ <li>Updated <code>SpotifyClient.RemoveTrackFavorites</code> method to make the <code>ids</code> argument optional; if not supplied, the currently playing id value is used instead.</li>
1715
+ <li>Updated <code>SpotifyClient.AddPlaylistItems</code> method to make the <code>uris</code> argument optional; if not supplied, the currently playing uri value is used instead.</li>
1716
+ <li>Updated <code>SpotifyClient.RemovePlaylistItems</code> method to make the <code>uris</code> argument optional; if not supplied, the currently playing uri value is used instead.</li>
1717
+ </ul>
1718
+
1719
+ <h6 id="1034-20240318">[ 1.0.34 ] - 2024/03/18</h6>
1720
+
1721
+ <ul>
1722
+ <li>Fixed <code>SpotifyClient.CreatePlaylist</code> method to properly pass the Public and Collaborative parameters to the Spotify Web API. Prior to this, any created playlists were being marked with Public=True.</li>
1723
+ </ul>
1724
+
1725
+ <h6 id="1033-20240302">[ 1.0.33 ] - 2024/03/02</h6>
1726
+
1727
+ <ul>
1728
+ <li>Added <code>Device.SelectItemNameAndId</code> property to return a string that can be used in a selection list in the form of "Name (Id)".</li>
1729
+ <li>Added <code>Device.GetIdFromSelectItem</code> method to return the Id portion of a <code>SelectItemNameAndId</code> property value.</li>
1730
+ <li>Added <code>Device.GetNameFromSelectItem</code> method to return the Name portion of a <code>SelectItemNameAndId</code> property value.</li>
1731
+ </ul>
1732
+
1733
+ <h6 id="1032-20240228">[ 1.0.32 ] - 2024/02/28</h6>
1734
+
1735
+ <ul>
1736
+ <li>Updated <code>PlayerQueueInfo</code> to correctly return the <code>Summary</code> property value when the queue is empty.</li>
1737
+ <li>Removed <code>SpotifyClient.SearchPlaylists</code> method argument <code>spotifyOwnedOnly</code>, as it can be replaced by other functionality (e.g. <code>GetCategoryPlaylists</code>).</li>
1738
+ </ul>
1739
+
1740
+ <h6 id="1031-20240227">[ 1.0.31 ] - 2024/02/27</h6>
1741
+
1742
+ <ul>
1743
+ <li>Updated all models that used a <code>root.get('...',[])</code> syntax to use <code>root.get('...',None)</code> instead, as Spotify Web API will sometimes return a <code>null</code> instead of an <code>[]</code> (empty array) for a key item value. This was causing methods to fail with <code>'NoneType' object is not iterable</code> errors.</li>
1744
+ </ul>
1745
+
1746
+ <h6 id="1030-20240223">[ 1.0.30 ] - 2024/02/23</h6>
1747
+
1748
+ <ul>
1749
+ <li>Updated <code>SpotifyClient.SearchPlaylists</code> method with argument <code>spotifyOwnedOnly</code> to filter found items by owner. This simulates the spotify "content generated for you" functionality provided by the Spotify AI engine.</li>
1750
+ </ul>
1751
+
1752
+ <h6 id="1029-20240223">[ 1.0.29 ] - 2024/02/23</h6>
1753
+
1754
+ <ul>
1755
+ <li>Added <code>ContainsId</code> method to the following classes: <code>AlbumPageSimplified</code>, <code>AudiobookPageSimplified</code>, <code>ChapterPageSimplified</code>, <code>EpisodePageSimplified</code>, <code>PlaylistPageSimplified</code>, <code>ShowPageSimplified</code>, and <code>TrackPageSimplified</code>.</li>
1756
+ <li>Updated <code>SpotifyClient.GetPlayerRecentTracks</code> method with auto-pagination support to retrieve ALL available items (or up to a limit total).</li>
1757
+ </ul>
1758
+
1759
+ <h6 id="1028-20240221">[ 1.0.28 ] - 2024/02/21</h6>
1760
+
1761
+ <ul>
1762
+ <li>Added <code>SpotifyClient.SearchAlbums</code> method to search Spotify for matching Album criteria.</li>
1763
+ <li>Added <code>SpotifyClient.SearchArtists</code> method to search Spotify for matching Artist criteria.</li>
1764
+ <li>Added <code>SpotifyClient.SearchAudiobooks</code> method to search Spotify for matching Audiobook criteria.</li>
1765
+ <li>Added <code>SpotifyClient.SearchEpisodes</code> method to search Spotify for matching Episode criteria.</li>
1766
+ <li>Added <code>SpotifyClient.SearchPlaylists</code> method to search Spotify for matching Playlist criteria.</li>
1767
+ <li>Added <code>SpotifyClient.SearchShows</code> method to search Spotify for matching Show criteria.</li>
1768
+ <li>Added <code>SpotifyClient.SearchTracks</code> method to search Spotify for matching Track criteria.</li>
1769
+ <li>Updated <code>SpotifyClient</code> methods to add auto-pagination to retrieve ALL available items (or up to a limit total). Methods modified were: <code>GetAlbumFavorites</code>, <code>GetAlbumNewReleases</code>, <code>GetArtistAlbums</code>, <code>GetArtistsFollowed</code>, <code>GetCategoryPlaylists</code>, <code>GetFeaturedPlaylists</code>, <code>GetPlaylistFavorites</code>, <code>GetPlaylistsForUser</code>, <code>GetPlaylistItems</code>, <code>GetAlbumTracks</code>, <code>GetAudiobookChapters</code>, <code>GetAudiobookFavorites</code>, <code>GetBrowseCategorys</code>, <code>GetEpisodeFavorites</code>, <code>GetShowEpisodes</code>, <code>GetShowFavorites</code>, <code>GetTrackFavorites</code>, <code>GetUsersTopArtists</code>, <code>GetUsersTopTracks</code>.</li>
1770
+ <li>Renamed <code>SpotifyClient.GetBrowseCategorys</code> method to <code>GetBrowseCategorysList</code>.</li>
1771
+ <li>Renamed <code>SpotifyClient.GetBrowseCategorysByPage</code> method to <code>GetBrowseCategorys</code>.</li>
1772
+ <li>Added <code>Category.Uri</code> property to simulate a Spotify-like Uri value for a category. This is a helper property - no value with this name is returned from the Spotify Web API.</li>
1773
+ <li>Updated <code>PageObject</code> model with property setters for the <code>CursorBefore</code>, <code>CursorAfter</code>, <code>Limit</code>, <code>Offset</code> and <code>Total</code> properties. This allows a user to modify the values when performing custom paging operations.</li>
1774
+ <li>Updated all <code>SpotifyClient</code> methods that utilize a <code>market</code> argument to ensure that a market value was either supplied or implied (using an authorization access token with a user profile). The Spotify Web API was returning null results for some methods that did not supply a market value while using a public access token (e.g. no country code default).</li>
1775
+ </ul>
1776
+
1777
+ <h6 id="1027-20240220">[ 1.0.27 ] - 2024/02/20</h6>
1778
+
1779
+ <ul>
1780
+ <li>Updated <code>SpotifyClient.GetPlayerRecentTracks</code> method to retrieve the last 24 hours of play history if neither <code>after</code> or <code>before</code> arguments were specified.</li>
1781
+ </ul>
1782
+
1783
+ <h6 id="1026-20240215">[ 1.0.26 ] - 2024/02/15</h6>
1784
+
1785
+ <ul>
1786
+ <li>Added <code>SpotifyClient.ToString</code> method to display a string representation of the class.</li>
1787
+ <li>Added <code>SpotifyClient.ConfigurationCache</code> property to store static configuration objects.</li>
1788
+ <li>Added <code>SpotifyClient.ClearConfigurationCache</code> method to clear the configuration cache.</li>
1789
+ <li>Updated <code>SpotifyClient</code> methods to add returned results to the <code>ConfigurationCache</code> for faster access: <code>GetBrowseCategory</code>, <code>GetBrowseCategorys</code>, <code>GetGenres</code>, <code>GetMarkets</code>, <code>GetPlayerDevice</code>, <code>GetPlayerDevices</code>, <code>GetUsersCurrentProfile</code>. This increases performance when accessing Spotify information that rarely changes.</li>
1790
+ </ul>
1791
+
1792
+ <h6 id="1025-20240210">[ 1.0.25 ] - 2024/02/10</h6>
1793
+
1794
+ <ul>
1795
+ <li>Updated urllib3 requirements to "urllib3>=1.21.1,&lt;1.27", to ensure urllib3 version 2.0 is not used. Home Assistant requires urllib3 version less than 2. This was causing intermittent issues with calling requests resulting in **kwargs errors when used in Home Assistant!</li>
1796
+ </ul>
1797
+
1798
+ <h6 id="1024-20240210">[ 1.0.24 ] - 2024/02/10</h6>
1799
+
1800
+ <ul>
1801
+ <li>Updated <code>SpotifyClient.MakeRequest</code> method to pass ALL parameters in the various request methods. Prior to this fix, there were urllib3 request issues with **KWARGS while using the api in a Home Assistant integration.</li>
1802
+ </ul>
1803
+
1804
+ <h6 id="1023-20240209">[ 1.0.23 ] - 2024/02/09</h6>
1805
+
1806
+ <ul>
1807
+ <li>Updated <code>SpotifyClient.MakeRequest</code> method to use json library to create JSON request body, instead of the urllib3 <code>request(...,json=...)</code> method. The urllib3 <code>request</code> class seems to have issues processing json data.</li>
1808
+ </ul>
1809
+
1810
+ <h6 id="1022-20240209">[ 1.0.22 ] - 2024/02/09</h6>
1811
+
1812
+ <ul>
1813
+ <li>Added <code>SpotifyClient.GetIdFromUri</code> method to return the Id portion of a Uri value.</li>
1814
+ <li>Added <code>SpotifyClient.GetTypeFromUri</code> method to return the Type portion of a Uri value.</li>
1815
+ <li>Updated <code>SpotifyClient.GetPlayerDevice</code> method to return a selected device by id or name.</li>
1816
+ <li>Added <code>SpotifyDiscovery</code> class that discovers Spotify Connect devices via Zeroconf.</li>
1817
+ <li>Updated <code>UserProfileSimplified</code> method to default the <code>DisplayName</code> property to the <code>Id</code> property value if a display name was not set.</li>
1818
+ </ul>
1819
+
1820
+ <h6 id="1021-20240208">[ 1.0.21 ] - 2024/02/08</h6>
1821
+
1822
+ <ul>
1823
+ <li>Added <code>SearchResponse.GetSpotifyOwnedPlaylists</code> method that gets a list of all playlist items in the underlying search response that have an owner of <code>spotify:user:spotify</code>. These are playlists that are generated for you by the spotify ai engine.</li>
1824
+ <li>Added <code>additionalTypes</code> argument to <code>SpotifyClient.GetPlayerPlaybackState</code> method.</li>
1825
+ <li>Added <code>additionalTypes</code> argument to <code>SpotifyClient.GetPlayerNowPlaying</code> method.</li>
1826
+ <li>Updated <code>SpotifyClient.GetPlayerDevices</code> method to return the list of devices in sorted order by Name.</li>
1827
+ </ul>
1828
+
1829
+ <h6 id="1020-20240207">[ 1.0.20 ] - 2024/02/07</h6>
1830
+
1831
+ <ul>
1832
+ <li>Added <code>PlayHistoryPage.GetTracks</code> method that gets a list of all tracks contained in the underlying <code>PlayHistory</code> list. This is a convenience method so one does not have to loop through the <code>PlayHistory</code> array of <code>Track</code> objects to get the list of tracks.</li>
1833
+ </ul>
1834
+
1835
+ <h6 id="1019-20240207">[ 1.0.19 ] - 2024/02/07</h6>
1836
+
1837
+ <ul>
1838
+ <li>Updated <code>TrackPageSaved</code> model to parse a <code>Track</code> object instead of a <code>TrackSimplified</code> object. The <code>Track</code> object contains the extra <code>Album</code>, <code>ExternalIds</code> and <code>Popularity</code> properties.</li>
1839
+ <li>Updated <code>TrackRecommendations</code> model to parse a <code>Track</code> object instead of a <code>TrackSimplified</code> object. The <code>Track</code> object contains the extra <code>Album</code>, <code>ExternalIds</code> and <code>Popularity</code> properties.</li>
1840
+ <li>Added <code>AlbumPageSaved.GetAlbums</code> method that gets a list of all albums contained in the underlying <code>Items</code> list. This is a convenience method so one does not have to loop through the <code>Items</code> array of <code>AlbumSaved</code> objects to get the list of albums.</li>
1841
+ <li>Added <code>TrackPageSaved.GetTracks</code> method that gets a list of all tracks contained in the underlying <code>Items</code> list. This is a convenience method so one does not have to loop through the <code>Items</code> array of <code>TrackSaved</code> objects to get the list of tracks.</li>
1842
+ <li>Added <code>EpisodePageSaved.GetEpisodes</code> method that gets a list of all episodes contained in the underlying <code>Items</code> list. This is a convenience method so one does not have to loop through the <code>Items</code> array of <code>EpisodeSaved</code> objects to get the list of episodes.</li>
1843
+ <li>Added <code>ShowPageSaved.GetShows</code> method that gets a list of all shows contained in the underlying <code>Items</code> list. This is a convenience method so one does not have to loop through the <code>Items</code> array of <code>ShowSaved</code> objects to get the list of shows.</li>
1844
+ <li>Added an <code>ImageUrl</code> property to all models that have an <code>Images</code> collection. The new property returns the first image url in the <code>Images</code> list, if images are defined; otherwise, null. This is a convenience method so one does not have to loop through the <code>Images</code> array of <code>ImageObject</code> objects to get an image url.</li>
1845
+ </ul>
1846
+
1847
+ <h6 id="1018-20240205">[ 1.0.18 ] - 2024/02/05</h6>
1848
+
1849
+ <ul>
1850
+ <li>Updated <code>SpotifyClient</code> methods to set the request header authorization key directly, rather than assigning a new dictionary to the value.</li>
1851
+ <li>Updated <code>SpotifyClient.MakeRequest</code> method to apply token refresh changes to the request authorization header if present. Prior to this fix, the request was still referencing the expired token value.</li>
1852
+ <li>Added <code>SpotifyAuthToken.HeaderKey</code> property for request header access.</li>
1853
+ <li>Added <code>SpotifyAuthToken.HeaderValue</code> property for request header access.</li>
1854
+ <li>Removed <code>SpotifyAuthToken.GetHeaders</code> method, as it was no longer required.</li>
1855
+ </ul>
1856
+
1857
+ <h6 id="1017-20240204">[ 1.0.17 ] - 2024/02/04</h6>
1858
+
1859
+ <ul>
1860
+ <li>Updated <code>SpotifyClient</code> to correctly support the <code>tokenUpdater</code> callable to update a token for an external provider.</li>
1861
+ <li>Updated <code>AuthClient</code> to correctly support the <code>tokenUpdater</code> callable to update a token for an external provider.</li>
1862
+ </ul>
1863
+
1864
+ <h6 id="1016-20240202">[ 1.0.16 ] - 2024/02/02</h6>
1865
+
1866
+ <ul>
1867
+ <li>Updated numerous classes with a <code>ToDictionary</code> method to allow dictionary representation of data.</li>
1868
+ </ul>
1869
+
1870
+ <h6 id="1015-20240202">[ 1.0.15 ] - 2024/02/02</h6>
1871
+
1872
+ <ul>
1873
+ <li>Updated <code>SpotifyClient</code> methods with better logging information.</li>
1874
+ <li>Updated <code>AuthClient</code> methods with better logging information.</li>
1875
+ </ul>
1876
+
1877
+ <h6 id="1014-20240201">[ 1.0.14 ] - 2024/02/01</h6>
1878
+
1879
+ <ul>
1880
+ <li>Updated <code>SpotifyClient</code> methods to add basic validation for required parameter values.</li>
1881
+ </ul>
1882
+
1883
+ <h6 id="1013-20240201">[ 1.0.13 ] - 2024/02/01</h6>
1884
+
1885
+ <ul>
1886
+ <li>Updated <code>SpotifyClient._CheckResponseForErrors</code> method to use json library to parse JSON response, instead of the urllib3 <code>HTTPResponse.json()</code> method. The urllib3 <code>HTTPResponse</code> class can return missing attributes and methods when processing redirects.</li>
1887
+ </ul>
1888
+
1889
+ <h6 id="1012-20240201">[ 1.0.12 ] - 2024/02/01</h6>
1890
+
1891
+ <ul>
1892
+ <li>Updated <code>SpotifyClient._CheckResponseForErrors</code> method with better logging information.</li>
1893
+ </ul>
1894
+
1895
+ <h6 id="1011-20240201">[ 1.0.11 ] - 2024/02/01</h6>
1896
+
1897
+ <ul>
1898
+ <li>Updated <code>SpotifyClient._CheckResponseForErrors</code> method with better logging information.</li>
1899
+ </ul>
1900
+
1901
+ <h6 id="1010-20240201">[ 1.0.10 ] - 2024/02/01</h6>
1902
+
1903
+ <ul>
1904
+ <li>Added <code>SpotifyClient.SetAuthTokenFromToken</code> method to allow the authorization token to be used from an existing OAuth2 token.</li>
1905
+ <li>Removed <code>SpotifyClient.SetAuthTokenFromSession</code> method in favor of the <code>SetAuthTokenFromToken</code> method.</li>
1906
+ <li>Updated scope processing to pass a space-delimited string of scopes instead of an array of strings. It appears that the Spotify Web API will accept both, but API documentation states that a space-delimited string is preferred.</li>
1907
+ </ul>
1908
+
1909
+ <h6 id="109-20240131">[ 1.0.9 ] - 2024/01/31</h6>
1910
+
1911
+ <ul>
1912
+ <li>Updated <code>SpotifyClient.SetAuthTokenFromSession</code> method to correct a bug related to Home Assistant OAuth2Session object.</li>
1913
+ </ul>
1914
+
1915
+ <h6 id="108-20240131">[ 1.0.8 ] - 2024/01/31</h6>
1916
+
1917
+ <ul>
1918
+ <li>Added <code>SpotifyClient.SetAuthTokenFromSession</code> method to allow the authorization token to be used from an existing OAuth2Session.</li>
1919
+ </ul>
1920
+
1921
+ <h6 id="107-20240129">[ 1.0.7 ] - 2024/01/29</h6>
1922
+
1923
+ <ul>
1924
+ <li>Allow customization of the redirect uri host and port values in the token authorization process.</li>
1925
+ </ul>
1926
+
1927
+ <h6 id="106-20240129">[ 1.0.6 ] - 2024/01/29</h6>
1928
+
1929
+ <ul>
1930
+ <li>Changed urllib3 requirements to a non-specific version so it could run with Home Assistant addons.</li>
1931
+ </ul>
1932
+
1933
+ <h6 id="105-20240129">[ 1.0.5 ] - 2024/01/29</h6>
1934
+
1935
+ <ul>
1936
+ <li>Changed Development Status to 5 - Production / Stable.</li>
1937
+ </ul>
1938
+
1939
+ <h6 id="104-20240129">[ 1.0.4 ] - 2024/01/29</h6>
1940
+
1941
+ <ul>
1942
+ <li>Removed invalid requirement from setup.py.</li>
1943
+ </ul>
1944
+
1945
+ <h6 id="103-20240129">[ 1.0.3 ] - 2024/01/29</h6>
1946
+
1947
+ <ul>
1948
+ <li>Added <code>SpotifyAuthToken.ProfileId</code> property that indicates the token profile that was loaded.</li>
1949
+ </ul>
1950
+
1951
+ <h6 id="102-20240129">[ 1.0.2 ] - 2024/01/29</h6>
1952
+
1953
+ <ul>
1954
+ <li>Corrected the <code>SpotifyClient.GetTrackRecommendations</code> method to process the <code>market</code>, <code>maxSpeechiness</code>, and <code>targetSpeechiness</code> arguments correctly.</li>
1955
+ <li>Updated <code>SpotifyClient.SetAuthTokenAuthorizationCode</code> method to use a 120 second timeout value while waiting for an authorize response from the user.</li>
1956
+ <li>Updated <code>SpotifyClient.SetAuthTokenAuthorizationCodePkce</code> method to use a 120 second timeout value while waiting for an authorize response from the user.</li>
1957
+ </ul>
1958
+
1959
+ <h6 id="101-20240117">[ 1.0.1 ] - 2024/01/17</h6>
1960
+
1961
+ <ul>
1962
+ <li>Version 1 initial release.</li>
1963
+ </ul>
1964
+
1965
+ <p></span>
1966
+ </details></p>
1967
+ </div>
1968
+
1969
+
1970
+
1971
+
1972
+ </section>
1973
+ </main>
1974
+ <script>
1975
+ function escapeHTML(html) {
1976
+ return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
1977
+ }
1978
+
1979
+ const originalContent = document.querySelector("main.pdoc");
1980
+ let currentContent = originalContent;
1981
+
1982
+ function setContent(innerHTML) {
1983
+ let elem;
1984
+ if (innerHTML) {
1985
+ elem = document.createElement("main");
1986
+ elem.classList.add("pdoc");
1987
+ elem.innerHTML = innerHTML;
1988
+ } else {
1989
+ elem = originalContent;
1990
+ }
1991
+ if (currentContent !== elem) {
1992
+ currentContent.replaceWith(elem);
1993
+ currentContent = elem;
1994
+ }
1995
+ }
1996
+
1997
+ function getSearchTerm() {
1998
+ return (new URL(window.location)).searchParams.get("search");
1999
+ }
2000
+
2001
+ const searchBox = document.querySelector(".pdoc input[type=search]");
2002
+ searchBox.addEventListener("input", function () {
2003
+ let url = new URL(window.location);
2004
+ if (searchBox.value.trim()) {
2005
+ url.hash = "";
2006
+ url.searchParams.set("search", searchBox.value);
2007
+ } else {
2008
+ url.searchParams.delete("search");
2009
+ }
2010
+ history.replaceState("", "", url.toString());
2011
+ onInput();
2012
+ });
2013
+ window.addEventListener("popstate", onInput);
2014
+
2015
+
2016
+ let search, searchErr;
2017
+
2018
+ async function initialize() {
2019
+ try {
2020
+ search = await new Promise((resolve, reject) => {
2021
+ const script = document.createElement("script");
2022
+ script.type = "text/javascript";
2023
+ script.async = true;
2024
+ script.onload = () => resolve(window.pdocSearch);
2025
+ script.onerror = (e) => reject(e);
2026
+ script.src = "search.js";
2027
+ document.getElementsByTagName("head")[0].appendChild(script);
2028
+ });
2029
+ } catch (e) {
2030
+ console.error("Cannot fetch pdoc search index");
2031
+ searchErr = "Cannot fetch search index.";
2032
+ }
2033
+ onInput();
2034
+
2035
+ document.querySelector("nav.pdoc").addEventListener("click", e => {
2036
+ if (e.target.hash) {
2037
+ searchBox.value = "";
2038
+ searchBox.dispatchEvent(new Event("input"));
2039
+ }
2040
+ });
2041
+ }
2042
+
2043
+ function onInput() {
2044
+ setContent((() => {
2045
+ const term = getSearchTerm();
2046
+ if (!term) {
2047
+ return null
2048
+ }
2049
+ if (searchErr) {
2050
+ return `<h3>Error: ${searchErr}</h3>`
2051
+ }
2052
+ if (!search) {
2053
+ return "<h3>Searching...</h3>"
2054
+ }
2055
+
2056
+ window.scrollTo({top: 0, left: 0, behavior: 'auto'});
2057
+
2058
+ const results = search(term);
2059
+
2060
+ let html;
2061
+ if (results.length === 0) {
2062
+ html = `No search results for '${escapeHTML(term)}'.`
2063
+ } else {
2064
+ html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
2065
+ }
2066
+ for (let result of results.slice(0, 10)) {
2067
+ let doc = result.doc;
2068
+ let url = `${doc.modulename.replaceAll(".", "/")}.html`;
2069
+ if (doc.qualname) {
2070
+ url += `#${doc.qualname}`;
2071
+ }
2072
+
2073
+ let heading;
2074
+ switch (result.doc.kind) {
2075
+ case "function":
2076
+ if (doc.fullname.endsWith(".__init__")) {
2077
+ heading = `<span class="name">${doc.fullname.replace(/\.__init__$/, "")}</span>${doc.signature}`;
2078
+ } else {
2079
+ heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span>${doc.signature}`;
2080
+ }
2081
+ break;
2082
+ case "class":
2083
+ heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
2084
+ if (doc.bases)
2085
+ heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
2086
+ heading += `:`;
2087
+ break;
2088
+ case "variable":
2089
+ heading = `<span class="name">${doc.fullname}</span>`;
2090
+ if (doc.annotation)
2091
+ heading += `<span class="annotation">${doc.annotation}</span>`;
2092
+ if (doc.default_value)
2093
+ heading += `<span class="default_value"> = ${doc.default_value}</span>`;
2094
+ break;
2095
+ default:
2096
+ heading = `<span class="name">${doc.fullname}</span>`;
2097
+ break;
2098
+ }
2099
+ html += `
2100
+ <section class="search-result">
2101
+ <a href="${url}" class="attr ${doc.kind}">${heading}</a>
2102
+ <div class="docstring">${doc.doc}</div>
2103
+ </section>
2104
+ `;
2105
+
2106
+ }
2107
+ return html;
2108
+ })());
2109
+ }
2110
+
2111
+ if (getSearchTerm()) {
2112
+ initialize();
2113
+ searchBox.value = getSearchTerm();
2114
+ onInput();
2115
+ } else {
2116
+ searchBox.addEventListener("focus", initialize, {once: true});
2117
+ }
2118
+
2119
+ searchBox.addEventListener("keydown", e => {
2120
+ if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
2121
+ let focused = currentContent.querySelector(".search-result.focused");
2122
+ if (!focused) {
2123
+ currentContent.querySelector(".search-result").classList.add("focused");
2124
+ } else if (
2125
+ e.key === "ArrowDown"
2126
+ && focused.nextElementSibling
2127
+ && focused.nextElementSibling.classList.contains("search-result")
2128
+ ) {
2129
+ focused.classList.remove("focused");
2130
+ focused.nextElementSibling.classList.add("focused");
2131
+ focused.nextElementSibling.scrollIntoView({
2132
+ behavior: "smooth",
2133
+ block: "nearest",
2134
+ inline: "nearest"
2135
+ });
2136
+ } else if (
2137
+ e.key === "ArrowUp"
2138
+ && focused.previousElementSibling
2139
+ && focused.previousElementSibling.classList.contains("search-result")
2140
+ ) {
2141
+ focused.classList.remove("focused");
2142
+ focused.previousElementSibling.classList.add("focused");
2143
+ focused.previousElementSibling.scrollIntoView({
2144
+ behavior: "smooth",
2145
+ block: "nearest",
2146
+ inline: "nearest"
2147
+ });
2148
+ } else if (
2149
+ e.key === "Enter"
2150
+ ) {
2151
+ focused.querySelector("a").click();
2152
+ }
2153
+ }
2154
+ });
2155
+ </script></body>
2156
+ </html>