spotifywebapiPython 1.0.36__py3-none-any.whl → 1.0.38__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of spotifywebapiPython might be problematic. Click here for more details.

Files changed (23) hide show
  1. {spotifywebapiPython-1.0.36.dist-info → spotifywebapiPython-1.0.38.dist-info}/METADATA +1 -1
  2. {spotifywebapiPython-1.0.36.dist-info → spotifywebapiPython-1.0.38.dist-info}/RECORD +23 -23
  3. spotifywebapipython/const.py +1 -1
  4. spotifywebapipython/docs/__init__.html +21 -2
  5. spotifywebapipython/docs/index.html +2 -2
  6. spotifywebapipython/docs/search.js +1 -1
  7. spotifywebapipython/docs/spotifywebapiPython/const.html +3 -3
  8. spotifywebapipython/docs/spotifywebapiPython/saappmessages.html +2 -2
  9. spotifywebapipython/docs/spotifywebapiPython/sautils.html +2 -2
  10. spotifywebapipython/docs/spotifywebapiPython/spotifyapierror.html +2 -2
  11. spotifywebapipython/docs/spotifywebapiPython/spotifyapimessage.html +2 -2
  12. spotifywebapipython/docs/spotifywebapiPython/spotifyauthtoken.html +2 -2
  13. spotifywebapipython/docs/spotifywebapiPython/spotifyclient.html +72 -13
  14. spotifywebapipython/docs/spotifywebapiPython/spotifydiscovery.html +2 -2
  15. spotifywebapipython/docs/spotifywebapiPython/spotifywebapiauthenticationerror.html +2 -2
  16. spotifywebapipython/docs/spotifywebapiPython/spotifywebapierror.html +2 -2
  17. spotifywebapipython/models/device.py +20 -0
  18. spotifywebapipython/models/playeractions.py +32 -10
  19. spotifywebapipython/models/playerplaystate.py +56 -10
  20. spotifywebapipython/spotifyclient.py +118 -8
  21. {spotifywebapiPython-1.0.36.dist-info → spotifywebapiPython-1.0.38.dist-info}/LICENSE +0 -0
  22. {spotifywebapiPython-1.0.36.dist-info → spotifywebapiPython-1.0.38.dist-info}/WHEEL +0 -0
  23. {spotifywebapiPython-1.0.36.dist-info → spotifywebapiPython-1.0.38.dist-info}/top_level.txt +0 -0
@@ -9,7 +9,7 @@
9
9
  </title>
10
10
  <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
11
11
  <!-- build env - Package Name = "spotifywebapiPython" -->
12
- <!-- build env - Package Version = "1.0.36" -->
12
+ <!-- build env - Package Version = "1.0.38" -->
13
13
  <!-- pdoc module.modulename = "spotifywebapipython.spotifywebapierror" -->
14
14
  <!-- pdoc module.is_package = "False" -->
15
15
  <!-- pdoc root_module_name = "None" -->
@@ -71,7 +71,7 @@
71
71
 
72
72
  <footer class="footertext">
73
73
  spotifywebapiPython</br>
74
- Version 1.0.36</br>
74
+ Version 1.0.38</br>
75
75
  <a href="https://developer.spotify.com/documentation/web-api" target="_blank">
76
76
  <img src="../spotifywebapipython.ico" alt="brand icon" style="width:32px; height:32px; padding:4px;"/>
77
77
  A Spotify Web Api Client
@@ -43,6 +43,18 @@ class Device:
43
43
  self._Type = root.get('type', None)
44
44
  self._VolumePercent = root.get('volume_percent', None)
45
45
 
46
+ # post load validations.
47
+ if self._IsActive is None:
48
+ self._IsActive = False
49
+ if self._IsPrivateSession is None:
50
+ self._IsPrivateSession = False
51
+ if self._IsRestricted is None:
52
+ self._IsRestricted = False
53
+ if self._SupportsVolume is None:
54
+ self._SupportsVolume = False
55
+ if self._VolumePercent is None:
56
+ self._VolumePercent = 0
57
+
46
58
 
47
59
  def __repr__(self) -> str:
48
60
  return self.ToString()
@@ -141,6 +153,14 @@ class Device:
141
153
  """
142
154
  return self._VolumePercent
143
155
 
156
+ @VolumePercent.setter
157
+ def VolumePercent(self, value:int):
158
+ """
159
+ Sets the VolumePercent property value.
160
+ """
161
+ if isinstance(value, int):
162
+ self._VolumePercent = value
163
+
144
164
 
145
165
  @staticmethod
146
166
  def GetIdFromSelectItem(value:str) -> str:
@@ -36,16 +36,38 @@ class PlayerActions:
36
36
 
37
37
  else:
38
38
 
39
- self._InterruptingPlayback:bool = root.get('interrupting_playback', None)
40
- self._Pausing:bool = root.get('pausing', None)
41
- self._Resuming:bool = root.get('resuming', None)
42
- self._Seeking:bool = root.get('seeking', None)
43
- self._SkippingNext:bool = root.get('skipping_next', None)
44
- self._SkippingPrev:bool = root.get('skipping_prev', None)
45
- self._TogglingRepeatContext:bool = root.get('toggling_repeat_context', None)
46
- self._TogglingRepeatTrack:bool = root.get('toggling_shuffle', None)
47
- self._TogglingShuffle:bool = root.get('toggling_repeat_track', None)
48
- self._TransferringPlayback:bool = root.get('transferring_playback', None)
39
+ self._InterruptingPlayback = root.get('interrupting_playback', None)
40
+ self._Pausing = root.get('pausing', None)
41
+ self._Resuming = root.get('resuming', None)
42
+ self._Seeking = root.get('seeking', None)
43
+ self._SkippingNext = root.get('skipping_next', None)
44
+ self._SkippingPrev = root.get('skipping_prev', None)
45
+ self._TogglingRepeatContext = root.get('toggling_repeat_context', None)
46
+ self._TogglingRepeatTrack = root.get('toggling_shuffle', None)
47
+ self._TogglingShuffle = root.get('toggling_repeat_track', None)
48
+ self._TransferringPlayback = root.get('transferring_playback', None)
49
+
50
+ # post load validations.
51
+ if self._InterruptingPlayback is None:
52
+ self._InterruptingPlayback = False
53
+ if self._Pausing is None:
54
+ self._Pausing = False
55
+ if self._Resuming is None:
56
+ self._Resuming = False
57
+ if self._Seeking is None:
58
+ self._Seeking = False
59
+ if self._SkippingNext is None:
60
+ self._SkippingNext = False
61
+ if self._SkippingPrev is None:
62
+ self._SkippingPrev = False
63
+ if self._TogglingRepeatContext is None:
64
+ self._TogglingRepeatContext = False
65
+ if self._TogglingRepeatTrack is None:
66
+ self._TogglingRepeatTrack = False
67
+ if self._TogglingShuffle is None:
68
+ self._TogglingShuffle = False
69
+ if self._TransferringPlayback is None:
70
+ self._TransferringPlayback = False
49
71
 
50
72
 
51
73
  def __repr__(self) -> str:
@@ -34,8 +34,8 @@ class PlayerPlayState:
34
34
  self._IsPlaying:bool = None
35
35
  self._ProgressMS:int = None
36
36
  self._RepeatState:str = None
37
- self._ShuffleState:bool = None
38
- self._SmartShuffle:bool = None
37
+ self._ShuffleState:str = None
38
+ self._SmartShuffle:str = None
39
39
  self._Timestamp:int = None
40
40
 
41
41
  if (root is None):
@@ -72,7 +72,27 @@ class PlayerPlayState:
72
72
  elif self._CurrentlyPlayingType == 'episode':
73
73
  self._Item = Episode(root=item)
74
74
 
75
-
75
+ # post load validations.
76
+ if self._Actions is None:
77
+ self._Actions = PlayerActions()
78
+ if self._Device is None:
79
+ self._Device = Device()
80
+ if self._CurrentlyPlayingType is None:
81
+ self._CurrentlyPlayingType = 'unknown'
82
+ if self._IsPlaying is None:
83
+ self._IsPlaying = False
84
+ if self._ProgressMS is None:
85
+ self._ProgressMS = 0
86
+ if self._RepeatState is None:
87
+ self._RepeatState = 'off'
88
+ if self._ShuffleState is None:
89
+ self._ShuffleState = 'off'
90
+ if self._SmartShuffle is None:
91
+ self._SmartShuffle = 'off'
92
+ if self._Timestamp is None:
93
+ self._Timestamp = 0
94
+
95
+
76
96
  def __repr__(self) -> str:
77
97
  return self.ToString()
78
98
 
@@ -148,7 +168,7 @@ class PlayerPlayState:
148
168
  """
149
169
  Sets the IsPlaying property value.
150
170
  """
151
- if value is None or isinstance(value, bool):
171
+ if isinstance(value, bool):
152
172
  self._IsPlaying = value
153
173
 
154
174
 
@@ -159,9 +179,9 @@ class PlayerPlayState:
159
179
 
160
180
  The `RepeatState` property contains the actual repeat setting.
161
181
  """
162
- if self._RepeatState is None or self._RepeatState == 'off':
163
- return False
164
- return True
182
+ if self._RepeatState is not 'off':
183
+ return True
184
+ return False
165
185
 
166
186
 
167
187
  @property
@@ -169,9 +189,19 @@ class PlayerPlayState:
169
189
  """
170
190
  True if shuffle play is enabled; otherwise, False.
171
191
  """
172
- if self.ShuffleState is None or self.ShuffleState == 'off':
173
- return False
174
- return True
192
+ if self.ShuffleState == 'on':
193
+ return True
194
+ return False
195
+
196
+
197
+ @property
198
+ def IsSmartShuffleEnabled(self) -> bool:
199
+ """
200
+ True if smart shuffle play is enabled; otherwise, False.
201
+ """
202
+ if self.SmartShuffle == 'on':
203
+ return True
204
+ return False
175
205
 
176
206
 
177
207
  @property
@@ -181,6 +211,14 @@ class PlayerPlayState:
181
211
  """
182
212
  return self._ProgressMS
183
213
 
214
+ @ProgressMS.setter
215
+ def ProgressMS(self, value:int):
216
+ """
217
+ Sets the ProgressMS property value.
218
+ """
219
+ if isinstance(value, int):
220
+ self._ProgressMS = value
221
+
184
222
 
185
223
  @property
186
224
  def RepeatState(self) -> str:
@@ -237,6 +275,14 @@ class PlayerPlayState:
237
275
  """
238
276
  return self._Timestamp
239
277
 
278
+ @Timestamp.setter
279
+ def Timestamp(self, value:int):
280
+ """
281
+ Sets the Timestamp property value.
282
+ """
283
+ if isinstance(value, int):
284
+ self._Timestamp = value
285
+
240
286
 
241
287
  def ToDictionary(self) -> dict:
242
288
  """
@@ -484,6 +484,50 @@ class SpotifyClient:
484
484
  msg.ResponseData = responseData
485
485
 
486
486
 
487
+ def _GetPlayerNowPlayingAlbumUri(self) -> str:
488
+ """
489
+ Returns the album uri value of the currently playing media if something is
490
+ playing; otherwise, null is returned.
491
+ """
492
+ result:str = None
493
+
494
+ # get nowplaying status.
495
+ _logsi.LogVerbose("Querying NowPlaying status of Spotify player")
496
+ nowPlaying:PlayerPlayState = self.GetPlayerNowPlaying()
497
+
498
+ # is a track playing? if so, return the album uri value.
499
+ if nowPlaying is not None:
500
+ _logsi.LogVerbose("NowPlaying data: %s" % str(nowPlaying))
501
+ if nowPlaying.CurrentlyPlayingType in ['track']:
502
+ trackItem:Track = nowPlaying.Item
503
+ if (trackItem is not None) and (trackItem.Album is not None):
504
+ result = trackItem.Album.Uri
505
+
506
+ return result
507
+
508
+
509
+ def _GetPlayerNowPlayingArtistUri(self) -> str:
510
+ """
511
+ Returns the artist uri value of the currently playing media if something is
512
+ playing; otherwise, null is returned.
513
+ """
514
+ result:str = None
515
+
516
+ # get nowplaying status.
517
+ _logsi.LogVerbose("Querying NowPlaying status of Spotify player")
518
+ nowPlaying:PlayerPlayState = self.GetPlayerNowPlaying()
519
+
520
+ # is a track playing? if so, return the artist uri value.
521
+ if nowPlaying is not None:
522
+ _logsi.LogVerbose("NowPlaying data: %s" % str(nowPlaying))
523
+ if nowPlaying.CurrentlyPlayingType in ['track']:
524
+ trackItem:Track = nowPlaying.Item
525
+ if (trackItem is not None) and (len(trackItem.Artists) > 0):
526
+ result = trackItem.Artists[0].Uri
527
+
528
+ return result
529
+
530
+
487
531
  def _GetPlayerNowPlayingUri(self) -> str:
488
532
  """
489
533
  Returns the uri value of the currently playing media if something is
@@ -977,7 +1021,8 @@ class SpotifyClient:
977
1021
  name:str=None,
978
1022
  description:str=None,
979
1023
  public:bool=None,
980
- collaborative:bool=None
1024
+ collaborative:bool=None,
1025
+ imagePath:str=None
981
1026
  ) -> None:
982
1027
  """
983
1028
  Change a playlist's details (name, description, and public / private state).
@@ -1001,6 +1046,9 @@ class SpotifyClient:
1001
1046
  If true, the playlist will become collaborative and other users will be able to modify
1002
1047
  the playlist in their Spotify client.
1003
1048
  Note: You can only set collaborative to true on non-public playlists.
1049
+ imagePath (str):
1050
+ A fully-qualified path of an image to display for the playlist.
1051
+ The image must be in JPEG format, and cannot exceed 256KB in Base64 encoded size.
1004
1052
 
1005
1053
  The user must own the playlist.
1006
1054
 
@@ -1021,6 +1069,9 @@ class SpotifyClient:
1021
1069
  A playlist can also be made collaborative by setting the `collaborative` argument to true.
1022
1070
  This means that anyone with the link can add to or remove a track from it.
1023
1071
 
1072
+ If the `imagePath` argument is specified, the `AddPlaylistCoverImage` method is called to
1073
+ upload the image after the playlist details are updated.
1074
+
1024
1075
  <details>
1025
1076
  <summary>Sample Code</summary>
1026
1077
  ```python
@@ -1040,6 +1091,7 @@ class SpotifyClient:
1040
1091
  apiMethodParms.AppendKeyValue("description", description)
1041
1092
  apiMethodParms.AppendKeyValue("public", public)
1042
1093
  apiMethodParms.AppendKeyValue("collaborative", collaborative)
1094
+ apiMethodParms.AppendKeyValue("imagePath", imagePath)
1043
1095
  _logsi.LogMethodParmList(SILevel.Verbose, "Change a playlist details", apiMethodParms)
1044
1096
 
1045
1097
  # if collaborative is True, then force public to false as Spotify requires it.
@@ -1067,6 +1119,13 @@ class SpotifyClient:
1067
1119
  msg.RequestJson = reqData
1068
1120
  self.MakeRequest('PUT', msg)
1069
1121
 
1122
+ # was a playlist image path specified? if so, then assign the image.
1123
+ if imagePath is not None:
1124
+ try:
1125
+ self.AddPlaylistCoverImage(playlistId, imagePath)
1126
+ except Exception as ex:
1127
+ pass # ignore exceptions, as they are already logged.
1128
+
1070
1129
  # process results.
1071
1130
  # no results to process - this is pass or fail.
1072
1131
  return
@@ -1871,7 +1930,8 @@ class SpotifyClient:
1871
1930
  name:str=None,
1872
1931
  description:str=None,
1873
1932
  public:bool=True,
1874
- collaborative:bool=False
1933
+ collaborative:bool=False,
1934
+ imagePath:str=None
1875
1935
  ) -> Playlist:
1876
1936
  """
1877
1937
  Create an empty playlist for a Spotify user.
@@ -1900,6 +1960,9 @@ class SpotifyClient:
1900
1960
  To create collaborative playlists you must have granted `playlist-modify-private`
1901
1961
  and `playlist-modify-public` scope.
1902
1962
  Defaults to false.
1963
+ imagePath (str):
1964
+ A fully-qualified path of an image to display for the playlist.
1965
+ The image must be in JPEG format, and cannot exceed 256KB in Base64 encoded size.
1903
1966
 
1904
1967
  The playlist will be empty until you add tracks.
1905
1968
 
@@ -1912,6 +1975,9 @@ class SpotifyClient:
1912
1975
  This means that anyone with the link can add to or remove a track from it.
1913
1976
 
1914
1977
  Each user is generally limited to a maximum of 11,000 playlists.
1978
+
1979
+ If the `imagePath` argument is specified, the `AddPlaylistCoverImage` method is called to
1980
+ upload the image after the playlist is created.
1915
1981
 
1916
1982
  Returns:
1917
1983
  A `Playlist` object that contains the playlist details.
@@ -1943,6 +2009,7 @@ class SpotifyClient:
1943
2009
  apiMethodParms.AppendKeyValue("description", description)
1944
2010
  apiMethodParms.AppendKeyValue("public", public)
1945
2011
  apiMethodParms.AppendKeyValue("collaborative", collaborative)
2012
+ apiMethodParms.AppendKeyValue("imagePath", imagePath)
1946
2013
  _logsi.LogMethodParmList(SILevel.Verbose, "Create an empty playlist for a user", apiMethodParms)
1947
2014
 
1948
2015
  # if userId is not supplied, then use profile value.
@@ -1970,6 +2037,13 @@ class SpotifyClient:
1970
2037
 
1971
2038
  # process results.
1972
2039
  result = Playlist(root=msg.ResponseData)
2040
+
2041
+ # was a playlist image path specified? if so, then assign the image.
2042
+ if imagePath is not None:
2043
+ try:
2044
+ self.AddPlaylistCoverImage(result.Id, imagePath)
2045
+ except Exception as ex:
2046
+ pass # ignore exceptions, as they are already logged.
1973
2047
 
1974
2048
  # trace.
1975
2049
  _logsi.LogObject(SILevel.Verbose, TRACE_METHOD_RESULT_TYPE % (apiMethodName, type(result).__name__), result, excludeNonPublic=True)
@@ -1989,7 +2063,7 @@ class SpotifyClient:
1989
2063
 
1990
2064
 
1991
2065
  def FollowArtists(self,
1992
- ids:str,
2066
+ ids:str=None,
1993
2067
  ) -> None:
1994
2068
  """
1995
2069
  Add the current user as a follower of one or more artists.
@@ -2001,6 +2075,7 @@ class SpotifyClient:
2001
2075
  A comma-separated list of the Spotify artist IDs.
2002
2076
  A maximum of 50 IDs can be sent in one request.
2003
2077
  Example: `2CIMQHirSU0MQqyYHq0eOx,1IQ2e1buppatiN1bxUVkrk`
2078
+ If null, the currently playing track artist uri id value is used.
2004
2079
 
2005
2080
  Raises:
2006
2081
  SpotifyWebApiError:
@@ -2027,7 +2102,15 @@ class SpotifyClient:
2027
2102
  apiMethodParms = _logsi.EnterMethodParmList(SILevel.Debug, apiMethodName)
2028
2103
  apiMethodParms.AppendKeyValue("ids", ids)
2029
2104
  _logsi.LogMethodParmList(SILevel.Verbose, "Add the current user as a follower of one or more artists", apiMethodParms)
2030
-
2105
+
2106
+ # if ids not specified, then return currently playing artist id value.
2107
+ if (ids is None) or (len(ids.strip()) == 0):
2108
+ uri = self._GetPlayerNowPlayingArtistUri()
2109
+ if uri is not None:
2110
+ ids = SpotifyClient.GetIdFromUri(uri)
2111
+ else:
2112
+ raise SpotifyApiError(SAAppMessages.ARGUMENT_REQUIRED_ERROR % (apiMethodName, 'ids'), logsi=_logsi)
2113
+
2031
2114
  # build a list of all item id's.
2032
2115
  # remove any leading / trailing spaces in case user put a space between the items.
2033
2116
  arrIds:list[str] = ids.split(',')
@@ -5697,7 +5780,7 @@ class SpotifyClient:
5697
5780
  properly handles cases of new types in the future by checking against the type field of each object.
5698
5781
 
5699
5782
  Returns:
5700
- A `PlayerPlayState` object that contains the currently playing media, or null if nothing is playing.
5783
+ A `PlayerPlayState` object that contains the currently playing media state.
5701
5784
 
5702
5785
  Raises:
5703
5786
  SpotifyWebApiError:
@@ -9486,7 +9569,7 @@ class SpotifyClient:
9486
9569
 
9487
9570
 
9488
9571
  def RemoveAlbumFavorites(self,
9489
- ids:str
9572
+ ids:str=None
9490
9573
  ) -> None:
9491
9574
  """
9492
9575
  Remove one or more albums from the current user's 'Your Library'.
@@ -9498,6 +9581,7 @@ class SpotifyClient:
9498
9581
  A comma-separated list of the Spotify IDs for the albums.
9499
9582
  Maximum: 50 IDs.
9500
9583
  Example: `6vc9OTcyd3hyzabCmsdnwE,382ObEPsp2rxGrnsizN5TX`
9584
+ If null, the currently playing track album uri id value is used.
9501
9585
 
9502
9586
  Raises:
9503
9587
  SpotifyWebApiError:
@@ -9529,6 +9613,14 @@ class SpotifyClient:
9529
9613
  apiMethodParms.AppendKeyValue("ids", ids)
9530
9614
  _logsi.LogMethodParmList(SILevel.Verbose, "Remove album(s) from user favorites", apiMethodParms)
9531
9615
 
9616
+ # if ids not specified, then return currently playing album id value.
9617
+ if (ids is None) or (len(ids.strip()) == 0):
9618
+ uri = self._GetPlayerNowPlayingAlbumUri()
9619
+ if uri is not None:
9620
+ ids = SpotifyClient.GetIdFromUri(uri)
9621
+ else:
9622
+ raise SpotifyApiError(SAAppMessages.ARGUMENT_REQUIRED_ERROR % (apiMethodName, 'ids'), logsi=_logsi)
9623
+
9532
9624
  # build a list of all item id's.
9533
9625
  # remove any leading / trailing spaces in case user put a space between the items.
9534
9626
  arrIds:list[str] = ids.split(',')
@@ -10203,7 +10295,7 @@ class SpotifyClient:
10203
10295
 
10204
10296
 
10205
10297
  def SaveAlbumFavorites(self,
10206
- ids:str
10298
+ ids:str=None
10207
10299
  ) -> None:
10208
10300
  """
10209
10301
  Save one or more albums to the current user's 'Your Library'.
@@ -10215,6 +10307,7 @@ class SpotifyClient:
10215
10307
  A comma-separated list of the Spotify IDs for the albums.
10216
10308
  Maximum: 50 IDs.
10217
10309
  Example: `6vc9OTcyd3hyzabCmsdnwE,382ObEPsp2rxGrnsizN5TX,2noRn2Aes5aoNVsU6iWThc`
10310
+ If null, the currently playing track album uri id value is used.
10218
10311
 
10219
10312
  Raises:
10220
10313
  SpotifyWebApiError:
@@ -10246,6 +10339,14 @@ class SpotifyClient:
10246
10339
  apiMethodParms.AppendKeyValue("ids", ids)
10247
10340
  _logsi.LogMethodParmList(SILevel.Verbose, "Save album(s) to user favorites", apiMethodParms)
10248
10341
 
10342
+ # if ids not specified, then return currently playing album id value.
10343
+ if (ids is None) or (len(ids.strip()) == 0):
10344
+ uri = self._GetPlayerNowPlayingAlbumUri()
10345
+ if uri is not None:
10346
+ ids = SpotifyClient.GetIdFromUri(uri)
10347
+ else:
10348
+ raise SpotifyApiError(SAAppMessages.ARGUMENT_REQUIRED_ERROR % (apiMethodName, 'ids'), logsi=_logsi)
10349
+
10249
10350
  # build a list of all item id's.
10250
10351
  # remove any leading / trailing spaces in case user put a space between the items.
10251
10352
  arrIds:list[str] = ids.split(',')
@@ -12681,7 +12782,7 @@ class SpotifyClient:
12681
12782
 
12682
12783
 
12683
12784
  def UnfollowArtists(self,
12684
- ids:str,
12785
+ ids:str=None,
12685
12786
  ) -> None:
12686
12787
  """
12687
12788
  Remove the current user as a follower of one or more artists.
@@ -12693,6 +12794,7 @@ class SpotifyClient:
12693
12794
  A comma-separated list of Spotify artist IDs.
12694
12795
  A maximum of 50 IDs can be sent in one request.
12695
12796
  Example: `2CIMQHirSU0MQqyYHq0eOx,1IQ2e1buppatiN1bxUVkrk`
12797
+ If null, the currently playing track artist uri id value is used.
12696
12798
 
12697
12799
  Raises:
12698
12800
  SpotifyWebApiError:
@@ -12720,6 +12822,14 @@ class SpotifyClient:
12720
12822
  apiMethodParms.AppendKeyValue("ids", ids)
12721
12823
  _logsi.LogMethodParmList(SILevel.Verbose, "Remove the current user as a follower of one or more artists", apiMethodParms)
12722
12824
 
12825
+ # if ids not specified, then return currently playing artist id value.
12826
+ if (ids is None) or (len(ids.strip()) == 0):
12827
+ uri = self._GetPlayerNowPlayingArtistUri()
12828
+ if uri is not None:
12829
+ ids = SpotifyClient.GetIdFromUri(uri)
12830
+ else:
12831
+ raise SpotifyApiError(SAAppMessages.ARGUMENT_REQUIRED_ERROR % (apiMethodName, 'ids'), logsi=_logsi)
12832
+
12723
12833
  # build a list of all item id's.
12724
12834
  # remove any leading / trailing spaces in case user put a space between the items.
12725
12835
  arrIds:list[str] = ids.split(',')