spotify 12.0.2 → 12.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@ __v12.1.0__
2
2
  -----------
3
3
  - erroneously released (wrong version number, does not follow version policy)
4
4
 
5
+ [v12.0.3][]
6
+ -----------
7
+ - add support for search_playlist (retrieves a playlist object directly from a search)
8
+
5
9
  [v12.0.2][]
6
10
  -----------
7
11
  - use error checking in Spotify::Pointer add_ref and release
@@ -122,6 +126,7 @@ v0.0.0
122
126
  ------
123
127
  - release to register rubygems.org name
124
128
 
129
+ [v12.0.3]: https://github.com/Burgestrand/libspotify-ruby/compare/v12.0.2...v12.0.3
125
130
  [v12.0.2]: https://github.com/Burgestrand/libspotify-ruby/compare/v12.0.1...v12.0.2
126
131
  [v12.0.1]: https://github.com/Burgestrand/libspotify-ruby/compare/v12.0.0...v12.0.1
127
132
  [v12.0.0]: https://github.com/Burgestrand/libspotify-ruby/compare/v11.0.2...v12.0.0
data/Rakefile CHANGED
@@ -18,5 +18,9 @@ task :gen do
18
18
  sh 'gccxml spec/api.h -fxml=spec/api.h.xml'
19
19
  end
20
20
 
21
+ task :console do
22
+ exec "irb", "-Ilib", "-rspotify"
23
+ end
24
+
21
25
  task :spec => :test
22
26
  task :default => :test
@@ -509,6 +509,7 @@ module Spotify
509
509
  attach_function :search_num_artists, :sp_search_num_artists, [ :search ], :int
510
510
  attach_function :search_artist, :sp_search_artist, [ :search, :int ], :artist
511
511
  attach_function :search_num_playlists, :sp_search_num_playlists, [ :search ], :int
512
+ attach_function :search_playlist, :sp_search_playlist, [ :search, :int ], :playlist
512
513
  attach_function :search_playlist_name, :sp_search_playlist_name, [ :search, :int ], :utf8_string
513
514
  attach_function :search_playlist_uri, :sp_search_playlist_uri, [ :search, :int ], :utf8_string
514
515
  attach_function :search_playlist_image_uri, :sp_search_playlist_image_uri, [ :search, :int ], :utf8_string
@@ -81,6 +81,7 @@ module Spotify
81
81
  wrap_function :search_track, :track
82
82
  wrap_function :search_album, :album
83
83
  wrap_function :search_artist, :artist
84
+ wrap_function :search_playlist, :playlist
84
85
 
85
86
  wrap_function :playlist_track, :track
86
87
  wrap_function :playlist_track_creator, :user
@@ -1,4 +1,4 @@
1
1
  module Spotify
2
2
  # See README for versioning policy.
3
- VERSION = [12, 0, 2].join('.')
3
+ VERSION = [12, 0, 3].join('.')
4
4
  end
data/spec/api.h CHANGED
@@ -93,42 +93,42 @@ typedef struct sp_inbox sp_inbox; ///< Add to inbox request handle
93
93
  * Error codes returned by various functions
94
94
  */
95
95
  typedef enum sp_error {
96
- SP_ERROR_OK = 0, ///< No errors encountered
97
- SP_ERROR_BAD_API_VERSION = 1, ///< The library version targeted does not match the one you claim you support
98
- SP_ERROR_API_INITIALIZATION_FAILED = 2, ///< Initialization of library failed - are cache locations etc. valid?
99
- SP_ERROR_TRACK_NOT_PLAYABLE = 3, ///< The track specified for playing cannot be played
100
- SP_ERROR_BAD_APPLICATION_KEY = 5, ///< The application key is invalid
101
- SP_ERROR_BAD_USERNAME_OR_PASSWORD = 6, ///< Login failed because of bad username and/or password
102
- SP_ERROR_USER_BANNED = 7, ///< The specified username is banned
103
- SP_ERROR_UNABLE_TO_CONTACT_SERVER = 8, ///< Cannot connect to the Spotify backend system
104
- SP_ERROR_CLIENT_TOO_OLD = 9, ///< Client is too old, library will need to be updated
105
- SP_ERROR_OTHER_PERMANENT = 10, ///< Some other error occurred, and it is permanent (e.g. trying to relogin will not help)
106
- SP_ERROR_BAD_USER_AGENT = 11, ///< The user agent string is invalid or too long
107
- SP_ERROR_MISSING_CALLBACK = 12, ///< No valid callback registered to handle events
108
- SP_ERROR_INVALID_INDATA = 13, ///< Input data was either missing or invalid
109
- SP_ERROR_INDEX_OUT_OF_RANGE = 14, ///< Index out of range
110
- SP_ERROR_USER_NEEDS_PREMIUM = 15, ///< The specified user needs a premium account
111
- SP_ERROR_OTHER_TRANSIENT = 16, ///< A transient error occurred.
112
- SP_ERROR_IS_LOADING = 17, ///< The resource is currently loading
113
- SP_ERROR_NO_STREAM_AVAILABLE = 18, ///< Could not find any suitable stream to play
114
- SP_ERROR_PERMISSION_DENIED = 19, ///< Requested operation is not allowed
115
- SP_ERROR_INBOX_IS_FULL = 20, ///< Target inbox is full
116
- SP_ERROR_NO_CACHE = 21, ///< Cache is not enabled
117
- SP_ERROR_NO_SUCH_USER = 22, ///< Requested user does not exist
118
- SP_ERROR_NO_CREDENTIALS = 23, ///< No credentials are stored
119
- SP_ERROR_NETWORK_DISABLED = 24, ///< Network disabled
120
- SP_ERROR_INVALID_DEVICE_ID = 25, ///< Invalid device ID
121
- SP_ERROR_CANT_OPEN_TRACE_FILE = 26, ///< Unable to open trace file
122
- SP_ERROR_APPLICATION_BANNED = 27, ///< This application is no longer allowed to use the Spotify service
123
- SP_ERROR_OFFLINE_TOO_MANY_TRACKS = 31, ///< Reached the device limit for number of tracks to download
124
- SP_ERROR_OFFLINE_DISK_CACHE = 32, ///< Disk cache is full so no more tracks can be downloaded to offline mode
125
- SP_ERROR_OFFLINE_EXPIRED = 33, ///< Offline key has expired, the user needs to go online again
126
- SP_ERROR_OFFLINE_NOT_ALLOWED = 34, ///< This user is not allowed to use offline mode
127
- SP_ERROR_OFFLINE_LICENSE_LOST = 35, ///< The license for this device has been lost. Most likely because the user used offline on three other device
128
- SP_ERROR_OFFLINE_LICENSE_ERROR = 36, ///< The Spotify license server does not respond correctly
129
- SP_ERROR_LASTFM_AUTH_ERROR = 39, ///< A LastFM scrobble authentication error has occurred
130
- SP_ERROR_INVALID_ARGUMENT = 40, ///< An invalid argument was specified
131
- SP_ERROR_SYSTEM_FAILURE = 41, ///< An operating system error
96
+ SP_ERROR_OK = 0, ///< No errors encountered
97
+ SP_ERROR_BAD_API_VERSION = 1, ///< The library version targeted does not match the one you claim you support
98
+ SP_ERROR_API_INITIALIZATION_FAILED = 2, ///< Initialization of library failed - are cache locations etc. valid?
99
+ SP_ERROR_TRACK_NOT_PLAYABLE = 3, ///< The track specified for playing cannot be played
100
+ SP_ERROR_BAD_APPLICATION_KEY = 5, ///< The application key is invalid
101
+ SP_ERROR_BAD_USERNAME_OR_PASSWORD = 6, ///< Login failed because of bad username and/or password
102
+ SP_ERROR_USER_BANNED = 7, ///< The specified username is banned
103
+ SP_ERROR_UNABLE_TO_CONTACT_SERVER = 8, ///< Cannot connect to the Spotify backend system
104
+ SP_ERROR_CLIENT_TOO_OLD = 9, ///< Client is too old, library will need to be updated
105
+ SP_ERROR_OTHER_PERMANENT = 10, ///< Some other error occurred, and it is permanent (e.g. trying to relogin will not help)
106
+ SP_ERROR_BAD_USER_AGENT = 11, ///< The user agent string is invalid or too long
107
+ SP_ERROR_MISSING_CALLBACK = 12, ///< No valid callback registered to handle events
108
+ SP_ERROR_INVALID_INDATA = 13, ///< Input data was either missing or invalid
109
+ SP_ERROR_INDEX_OUT_OF_RANGE = 14, ///< Index out of range
110
+ SP_ERROR_USER_NEEDS_PREMIUM = 15, ///< The specified user needs a premium account
111
+ SP_ERROR_OTHER_TRANSIENT = 16, ///< A transient error occurred.
112
+ SP_ERROR_IS_LOADING = 17, ///< The resource is currently loading
113
+ SP_ERROR_NO_STREAM_AVAILABLE = 18, ///< Could not find any suitable stream to play
114
+ SP_ERROR_PERMISSION_DENIED = 19, ///< Requested operation is not allowed
115
+ SP_ERROR_INBOX_IS_FULL = 20, ///< Target inbox is full
116
+ SP_ERROR_NO_CACHE = 21, ///< Cache is not enabled
117
+ SP_ERROR_NO_SUCH_USER = 22, ///< Requested user does not exist
118
+ SP_ERROR_NO_CREDENTIALS = 23, ///< No credentials are stored
119
+ SP_ERROR_NETWORK_DISABLED = 24, ///< Network disabled
120
+ SP_ERROR_INVALID_DEVICE_ID = 25, ///< Invalid device ID
121
+ SP_ERROR_CANT_OPEN_TRACE_FILE = 26, ///< Unable to open trace file
122
+ SP_ERROR_APPLICATION_BANNED = 27, ///< This application is no longer allowed to use the Spotify service
123
+ SP_ERROR_OFFLINE_TOO_MANY_TRACKS = 31, ///< Reached the device limit for number of tracks to download
124
+ SP_ERROR_OFFLINE_DISK_CACHE = 32, ///< Disk cache is full so no more tracks can be downloaded to offline mode
125
+ SP_ERROR_OFFLINE_EXPIRED = 33, ///< Offline key has expired, the user needs to go online again
126
+ SP_ERROR_OFFLINE_NOT_ALLOWED = 34, ///< This user is not allowed to use offline mode
127
+ SP_ERROR_OFFLINE_LICENSE_LOST = 35, ///< The license for this device has been lost. Most likely because the user used offline on three other device
128
+ SP_ERROR_OFFLINE_LICENSE_ERROR = 36, ///< The Spotify license server does not respond correctly
129
+ SP_ERROR_LASTFM_AUTH_ERROR = 39, ///< A LastFM scrobble authentication error has occurred
130
+ SP_ERROR_INVALID_ARGUMENT = 40, ///< An invalid argument was specified
131
+ SP_ERROR_SYSTEM_FAILURE = 41, ///< An operating system error
132
132
  } sp_error;
133
133
 
134
134
  /**
@@ -168,11 +168,11 @@ SP_LIBEXPORT(const char*) sp_error_message(sp_error error);
168
168
  * Describes the current state of the connection
169
169
  */
170
170
  typedef enum sp_connectionstate {
171
- SP_CONNECTION_STATE_LOGGED_OUT = 0, ///< User not yet logged in
172
- SP_CONNECTION_STATE_LOGGED_IN = 1, ///< Logged in against a Spotify access point
173
- SP_CONNECTION_STATE_DISCONNECTED = 2, ///< Was logged in, but has now been disconnected
174
- SP_CONNECTION_STATE_UNDEFINED = 3, ///< The connection state is undefined
175
- SP_CONNECTION_STATE_OFFLINE = 4 ///< Logged in in offline mode
171
+ SP_CONNECTION_STATE_LOGGED_OUT = 0, ///< User not yet logged in
172
+ SP_CONNECTION_STATE_LOGGED_IN = 1, ///< Logged in against a Spotify access point
173
+ SP_CONNECTION_STATE_DISCONNECTED = 2, ///< Was logged in, but has now been disconnected
174
+ SP_CONNECTION_STATE_UNDEFINED = 3, ///< The connection state is undefined
175
+ SP_CONNECTION_STATE_OFFLINE = 4 ///< Logged in in offline mode
176
176
  } sp_connectionstate;
177
177
 
178
178
 
@@ -180,16 +180,16 @@ typedef enum sp_connectionstate {
180
180
  * Sample type descriptor
181
181
  */
182
182
  typedef enum sp_sampletype {
183
- SP_SAMPLETYPE_INT16_NATIVE_ENDIAN = 0, ///< 16-bit signed integer samples
183
+ SP_SAMPLETYPE_INT16_NATIVE_ENDIAN = 0, ///< 16-bit signed integer samples
184
184
  } sp_sampletype;
185
185
 
186
186
  /**
187
187
  * Audio format descriptor
188
188
  */
189
189
  typedef struct sp_audioformat {
190
- sp_sampletype sample_type; ///< Sample type enum,
191
- int sample_rate; ///< Audio sample rate, in samples per second.
192
- int channels; ///< Number of channels. Currently 1 or 2.
190
+ sp_sampletype sample_type; ///< Sample type enum,
191
+ int sample_rate; ///< Audio sample rate, in samples per second.
192
+ int channels; ///< Number of channels. Currently 1 or 2.
193
193
  } sp_audioformat;
194
194
 
195
195
  /**
@@ -205,10 +205,10 @@ typedef enum sp_bitrate {
205
205
  * Playlist types
206
206
  */
207
207
  typedef enum sp_playlist_type {
208
- SP_PLAYLIST_TYPE_PLAYLIST = 0, ///< A normal playlist.
209
- SP_PLAYLIST_TYPE_START_FOLDER = 1, ///< Marks a folder starting point,
210
- SP_PLAYLIST_TYPE_END_FOLDER = 2, ///< and ending point.
211
- SP_PLAYLIST_TYPE_PLACEHOLDER = 3, ///< Unknown entry.
208
+ SP_PLAYLIST_TYPE_PLAYLIST = 0, ///< A normal playlist.
209
+ SP_PLAYLIST_TYPE_START_FOLDER = 1, ///< Marks a folder starting point,
210
+ SP_PLAYLIST_TYPE_END_FOLDER = 2, ///< and ending point.
211
+ SP_PLAYLIST_TYPE_PLACEHOLDER = 3, ///< Unknown entry.
212
212
  } sp_playlist_type;
213
213
 
214
214
 
@@ -217,67 +217,67 @@ typedef enum sp_playlist_type {
217
217
  * Search types
218
218
  */
219
219
  typedef enum sp_search_type {
220
- SP_SEARCH_STANDARD = 0,
221
- SP_SEARCH_SUGGEST = 1,
220
+ SP_SEARCH_STANDARD = 0,
221
+ SP_SEARCH_SUGGEST = 1,
222
222
  } sp_search_type;
223
223
 
224
224
  /**
225
225
  * Playlist offline status
226
226
  */
227
227
  typedef enum sp_playlist_offline_status {
228
- SP_PLAYLIST_OFFLINE_STATUS_NO = 0, ///< Playlist is not offline enabled
229
- SP_PLAYLIST_OFFLINE_STATUS_YES = 1, ///< Playlist is synchronized to local storage
230
- SP_PLAYLIST_OFFLINE_STATUS_DOWNLOADING = 2, ///< This playlist is currently downloading. Only one playlist can be in this state any given time
231
- SP_PLAYLIST_OFFLINE_STATUS_WAITING = 3, ///< Playlist is queued for download
228
+ SP_PLAYLIST_OFFLINE_STATUS_NO = 0, ///< Playlist is not offline enabled
229
+ SP_PLAYLIST_OFFLINE_STATUS_YES = 1, ///< Playlist is synchronized to local storage
230
+ SP_PLAYLIST_OFFLINE_STATUS_DOWNLOADING = 2, ///< This playlist is currently downloading. Only one playlist can be in this state any given time
231
+ SP_PLAYLIST_OFFLINE_STATUS_WAITING = 3, ///< Playlist is queued for download
232
232
  } sp_playlist_offline_status;
233
233
 
234
234
  /**
235
235
  * Track availability
236
236
  */
237
237
  typedef enum sp_availability {
238
- SP_TRACK_AVAILABILITY_UNAVAILABLE = 0, ///< Track is not available
239
- SP_TRACK_AVAILABILITY_AVAILABLE = 1, ///< Track is available and can be played
240
- SP_TRACK_AVAILABILITY_NOT_STREAMABLE = 2, ///< Track can not be streamed using this account
241
- SP_TRACK_AVAILABILITY_BANNED_BY_ARTIST = 3, ///< Track not available on artist's reqeust
238
+ SP_TRACK_AVAILABILITY_UNAVAILABLE = 0, ///< Track is not available
239
+ SP_TRACK_AVAILABILITY_AVAILABLE = 1, ///< Track is available and can be played
240
+ SP_TRACK_AVAILABILITY_NOT_STREAMABLE = 2, ///< Track can not be streamed using this account
241
+ SP_TRACK_AVAILABILITY_BANNED_BY_ARTIST = 3, ///< Track not available on artist's reqeust
242
242
  } sp_track_availability;
243
243
 
244
244
  /**
245
245
  * Track offline status
246
246
  */
247
247
  typedef enum sp_track_offline_status {
248
- SP_TRACK_OFFLINE_NO = 0, ///< Not marked for offline
249
- SP_TRACK_OFFLINE_WAITING = 1, ///< Waiting for download
250
- SP_TRACK_OFFLINE_DOWNLOADING = 2, ///< Currently downloading
251
- SP_TRACK_OFFLINE_DONE = 3, ///< Downloaded OK and can be played
252
- SP_TRACK_OFFLINE_ERROR = 4, ///< Error during download
253
- SP_TRACK_OFFLINE_DONE_EXPIRED = 5, ///< Downloaded OK but not playable due to expiery
254
- SP_TRACK_OFFLINE_LIMIT_EXCEEDED = 6, ///< Waiting because device have reached max number of allowed tracks
255
- SP_TRACK_OFFLINE_DONE_RESYNC = 7, ///< Downloaded OK and available but scheduled for re-download
248
+ SP_TRACK_OFFLINE_NO = 0, ///< Not marked for offline
249
+ SP_TRACK_OFFLINE_WAITING = 1, ///< Waiting for download
250
+ SP_TRACK_OFFLINE_DOWNLOADING = 2, ///< Currently downloading
251
+ SP_TRACK_OFFLINE_DONE = 3, ///< Downloaded OK and can be played
252
+ SP_TRACK_OFFLINE_ERROR = 4, ///< Error during download
253
+ SP_TRACK_OFFLINE_DONE_EXPIRED = 5, ///< Downloaded OK but not playable due to expiery
254
+ SP_TRACK_OFFLINE_LIMIT_EXCEEDED = 6, ///< Waiting because device have reached max number of allowed tracks
255
+ SP_TRACK_OFFLINE_DONE_RESYNC = 7, ///< Downloaded OK and available but scheduled for re-download
256
256
  } sp_track_offline_status;
257
257
 
258
258
  /**
259
259
  * Image size
260
260
  */
261
261
  typedef enum sp_image_size {
262
- SP_IMAGE_SIZE_NORMAL = 0, ///< Normal image size
263
- SP_IMAGE_SIZE_SMALL = 1, ///< Small image size
264
- SP_IMAGE_SIZE_LARGE = 2, ///< Large image size
262
+ SP_IMAGE_SIZE_NORMAL = 0, ///< Normal image size
263
+ SP_IMAGE_SIZE_SMALL = 1, ///< Small image size
264
+ SP_IMAGE_SIZE_LARGE = 2, ///< Large image size
265
265
  } sp_image_size;
266
266
 
267
267
  /**
268
268
  * Buffer stats used by get_audio_buffer_stats callback
269
269
  */
270
270
  typedef struct sp_audio_buffer_stats {
271
- int samples; ///< Samples in buffer
272
- int stutter; ///< Number of stutters (audio dropouts) since last query
271
+ int samples; ///< Samples in buffer
272
+ int stutter; ///< Number of stutters (audio dropouts) since last query
273
273
  } sp_audio_buffer_stats;
274
274
 
275
275
  /**
276
276
  * List of subscribers returned by sp_playlist_subscribers()
277
277
  */
278
278
  typedef struct sp_subscribers {
279
- unsigned int count; ///< Number of elements in 'subscribers'
280
- char *subscribers[1]; ///< Actual size is 'count'. Array of pointers to canonical usernames
279
+ unsigned int count; ///< Number of elements in 'subscribers'
280
+ char *subscribers[1]; ///< Actual size is 'count'. Array of pointers to canonical usernames
281
281
  } sp_subscribers;
282
282
 
283
283
 
@@ -285,12 +285,12 @@ typedef struct sp_subscribers {
285
285
  * Current connection type set using sp_session_set_connection_type()
286
286
  */
287
287
  typedef enum sp_connection_type {
288
- SP_CONNECTION_TYPE_UNKNOWN = 0, ///< Connection type unknown (Default)
289
- SP_CONNECTION_TYPE_NONE = 1, ///< No connection
290
- SP_CONNECTION_TYPE_MOBILE = 2, ///< Mobile data (EDGE, 3G, etc)
291
- SP_CONNECTION_TYPE_MOBILE_ROAMING = 3, ///< Roamed mobile data (EDGE, 3G, etc)
292
- SP_CONNECTION_TYPE_WIFI = 4, ///< Wireless connection
293
- SP_CONNECTION_TYPE_WIRED = 5, ///< Ethernet cable, etc
288
+ SP_CONNECTION_TYPE_UNKNOWN = 0, ///< Connection type unknown (Default)
289
+ SP_CONNECTION_TYPE_NONE = 1, ///< No connection
290
+ SP_CONNECTION_TYPE_MOBILE = 2, ///< Mobile data (EDGE, 3G, etc)
291
+ SP_CONNECTION_TYPE_MOBILE_ROAMING = 3, ///< Roamed mobile data (EDGE, 3G, etc)
292
+ SP_CONNECTION_TYPE_WIFI = 4, ///< Wireless connection
293
+ SP_CONNECTION_TYPE_WIRED = 5, ///< Ethernet cable, etc
294
294
  } sp_connection_type;
295
295
 
296
296
 
@@ -300,10 +300,10 @@ typedef enum sp_connection_type {
300
300
  * The default is SP_CONNECTION_RULE_NETWORK | SP_CONNECTION_RULE_ALLOW_SYNC
301
301
  */
302
302
  typedef enum sp_connection_rules {
303
- SP_CONNECTION_RULE_NETWORK = 0x1, ///< Allow network traffic. When not set libspotify will force itself into offline mode
304
- SP_CONNECTION_RULE_NETWORK_IF_ROAMING = 0x2, ///< Allow network traffic even if roaming
305
- SP_CONNECTION_RULE_ALLOW_SYNC_OVER_MOBILE = 0x4, ///< Set to allow syncing of offline content over mobile connections
306
- SP_CONNECTION_RULE_ALLOW_SYNC_OVER_WIFI = 0x8, ///< Set to allow syncing of offline content over WiFi
303
+ SP_CONNECTION_RULE_NETWORK = 0x1, ///< Allow network traffic. When not set libspotify will force itself into offline mode
304
+ SP_CONNECTION_RULE_NETWORK_IF_ROAMING = 0x2, ///< Allow network traffic even if roaming
305
+ SP_CONNECTION_RULE_ALLOW_SYNC_OVER_MOBILE = 0x4, ///< Set to allow syncing of offline content over mobile connections
306
+ SP_CONNECTION_RULE_ALLOW_SYNC_OVER_WIFI = 0x8, ///< Set to allow syncing of offline content over WiFi
307
307
  } sp_connection_rules;
308
308
 
309
309
 
@@ -311,17 +311,17 @@ typedef enum sp_connection_rules {
311
311
  * Controls the type of data that will be included in artist browse queries
312
312
  */
313
313
  typedef enum sp_artistbrowse_type {
314
- SP_ARTISTBROWSE_FULL, /**< All information except tophit tracks
315
- This mode is deprecated and will removed in a future release */
316
- SP_ARTISTBROWSE_NO_TRACKS, /**< Only albums and data about them, no tracks.
317
- In other words, sp_artistbrowse_num_tracks() will return 0
318
- */
319
- SP_ARTISTBROWSE_NO_ALBUMS, /**< Only return data about the artist (artist name, similar artist
320
- biography, etc
321
- No tracks or album will be abailable.
322
- sp_artistbrowse_num_tracks() and sp_artistbrowse_num_albums()
323
- will both return 0
324
- */
314
+ SP_ARTISTBROWSE_FULL, /**< All information except tophit tracks
315
+ This mode is deprecated and will removed in a future release */
316
+ SP_ARTISTBROWSE_NO_TRACKS, /**< Only albums and data about them, no tracks.
317
+ In other words, sp_artistbrowse_num_tracks() will return 0
318
+ */
319
+ SP_ARTISTBROWSE_NO_ALBUMS, /**< Only return data about the artist (artist name, similar artist
320
+ biography, etc
321
+ No tracks or album will be abailable.
322
+ sp_artistbrowse_num_tracks() and sp_artistbrowse_num_albums()
323
+ will both return 0
324
+ */
325
325
  } sp_artistbrowse_type;
326
326
 
327
327
  typedef enum sp_social_provider {
@@ -343,43 +343,43 @@ typedef enum sp_scrobbling_state {
343
343
  * Offline sync status
344
344
  */
345
345
  typedef struct sp_offline_sync_status {
346
- /**
347
- * Queued tracks/bytes is things left to sync in current sync
348
- * operation
349
- */
350
- int queued_tracks;
351
- sp_uint64 queued_bytes;
352
-
353
- /**
354
- * Done tracks/bytes is things marked for sync that existed on
355
- * device before current sync operation
356
- */
357
- int done_tracks;
358
- sp_uint64 done_bytes;
359
-
360
- /**
361
- * Copied tracks/bytes is things that has been copied in
362
- * current sync operation
363
- */
364
- int copied_tracks;
365
- sp_uint64 copied_bytes;
366
-
367
- /**
368
- * Tracks that are marked as synced but will not be copied
369
- * (for various reasons)
370
- */
371
- int willnotcopy_tracks;
372
-
373
- /**
374
- * A track is counted as error when something goes wrong while
375
- * syncing the track
376
- */
377
- int error_tracks;
378
-
379
- /**
380
- * Set if sync operation is in progress
381
- */
382
- bool syncing;
346
+ /**
347
+ * Queued tracks/bytes is things left to sync in current sync
348
+ * operation
349
+ */
350
+ int queued_tracks;
351
+ sp_uint64 queued_bytes;
352
+
353
+ /**
354
+ * Done tracks/bytes is things marked for sync that existed on
355
+ * device before current sync operation
356
+ */
357
+ int done_tracks;
358
+ sp_uint64 done_bytes;
359
+
360
+ /**
361
+ * Copied tracks/bytes is things that has been copied in
362
+ * current sync operation
363
+ */
364
+ int copied_tracks;
365
+ sp_uint64 copied_bytes;
366
+
367
+ /**
368
+ * Tracks that are marked as synced but will not be copied
369
+ * (for various reasons)
370
+ */
371
+ int willnotcopy_tracks;
372
+
373
+ /**
374
+ * A track is counted as error when something goes wrong while
375
+ * syncing the track
376
+ */
377
+ int error_tracks;
378
+
379
+ /**
380
+ * Set if sync operation is in progress
381
+ */
382
+ bool syncing;
383
383
 
384
384
  } sp_offline_sync_status;
385
385
 
@@ -392,319 +392,319 @@ typedef struct sp_offline_sync_status {
392
392
  */
393
393
  typedef struct sp_session_callbacks {
394
394
 
395
- /**
396
- * Called when login has been processed and was successful
397
- *
398
- * @param[in] session Session
399
- * @param[in] error One of the following errors, from ::sp_error
400
- * SP_ERROR_OK
401
- * SP_ERROR_CLIENT_TOO_OLD
402
- * SP_ERROR_UNABLE_TO_CONTACT_SERVER
403
- * SP_ERROR_BAD_USERNAME_OR_PASSWORD
404
- * SP_ERROR_USER_BANNED
405
- * SP_ERROR_USER_NEEDS_PREMIUM
406
- * SP_ERROR_OTHER_TRANSIENT
407
- * SP_ERROR_OTHER_PERMANENT
408
- */
409
- void (SP_CALLCONV *logged_in)(sp_session *session, sp_error error);
410
-
411
- /**
412
- * Called when logout has been processed. Either called explicitly
413
- * if you initialize a logout operation, or implicitly if there
414
- * is a permanent connection error
415
- *
416
- * @param[in] session Session
417
- */
418
- void (SP_CALLCONV *logged_out)(sp_session *session);
419
- /**
420
- * Called whenever metadata has been updated
421
- *
422
- * If you have metadata cached outside of libspotify, you should purge
423
- * your caches and fetch new versions.
424
- *
425
- * @param[in] session Session
426
- */
427
- void (SP_CALLCONV *metadata_updated)(sp_session *session);
428
-
429
- /**
430
- * Called when there is a connection error, and the library has problems
431
- * reconnecting to the Spotify service. Could be called multiple times (as
432
- * long as the problem is present)
433
- *
434
- *
435
- * @param[in] session Session
436
- * @param[in] error One of the following errors, from ::sp_error
437
- * SP_ERROR_OK
438
- * SP_ERROR_CLIENT_TOO_OLD
439
- * SP_ERROR_UNABLE_TO_CONTACT_SERVER
440
- * SP_ERROR_BAD_USERNAME_OR_PASSWORD
441
- * SP_ERROR_USER_BANNED
442
- * SP_ERROR_USER_NEEDS_PREMIUM
443
- * SP_ERROR_OTHER_TRANSIENT
444
- * SP_ERROR_OTHER_PERMANENT
445
- */
446
- void (SP_CALLCONV *connection_error)(sp_session *session, sp_error error);
447
-
448
- /**
449
- * Called when the access point wants to display a message to the user
450
- *
451
- * In the desktop client, these are shown in a blueish toolbar just below the
452
- * search box.
453
- *
454
- * @param[in] session Session
455
- * @param[in] message String in UTF-8 format.
456
- */
457
- void (SP_CALLCONV *message_to_user)(sp_session *session, const char *message);
458
-
459
- /**
460
- * Called when processing needs to take place on the main thread.
461
- *
462
- * You need to call sp_session_process_events() in the main thread to get
463
- * libspotify to do more work. Failure to do so may cause request timeouts,
464
- * or a lost connection.
465
- *
466
- * @param[in] session Session
467
- *
468
- * @note This function is called from an internal session thread - you need to have proper synchronization!
469
- */
470
- void (SP_CALLCONV *notify_main_thread)(sp_session *session);
471
-
472
- /**
473
- * Called when there is decompressed audio data available.
474
- *
475
- * @param[in] session Session
476
- * @param[in] format Audio format descriptor sp_audioformat
477
- * @param[in] frames Points to raw PCM data as described by \p format
478
- * @param[in] num_frames Number of available samples in \p frames.
479
- * If this is 0, a discontinuity has occurred (such as after a seek). The application
480
- * should flush its audio fifos, etc.
481
- *
482
- * @return Number of frames consumed.
483
- * This value can be used to rate limit the output from the library if your
484
- * output buffers are saturated. The library will retry delivery in about 100ms.
485
- *
486
- * @note This function is called from an internal session thread - you need to have proper synchronization!
487
- *
488
- * @note This function must never block. If your output buffers are full you must return 0 to signal
489
- * that the library should retry delivery in a short while.
490
- */
491
- int (SP_CALLCONV *music_delivery)(sp_session *session, const sp_audioformat *format, const void *frames, int num_frames);
492
-
493
- /**
494
- * Music has been paused because an account only allows music
495
- * to be played from one location simultaneously.
496
- *
497
- * @note When this callback is invoked the application should
498
- * behave just as if the user pressed the pause
499
- * button. The application should also display a message
500
- * to the user indicating the playback has been paused
501
- * because another application is playing using the same
502
- * account.
503
- *
504
- * @note IT MUST NOT automatically resume playback but must
505
- * instead wait for the user to press play.
506
- *
507
- * @param[in] session Session
508
- */
509
- void (SP_CALLCONV *play_token_lost)(sp_session *session);
510
-
511
- /**
512
- * Logging callback.
513
- *
514
- * @param[in] session Session
515
- * @param[in] data Log data
516
- */
517
- void (SP_CALLCONV *log_message)(sp_session *session, const char *data);
518
-
519
- /**
520
- * End of track.
521
- * Called when the currently played track has reached its end.
522
- *
523
- * @note This function is invoked from the main thread
524
- *
525
- * @param[in] session Session
526
- */
527
- void (SP_CALLCONV *end_of_track)(sp_session *session);
528
-
529
- /**
530
- * Streaming error.
531
- * Called when streaming cannot start or continue.
532
- *
533
- * @note This function is invoked from the main thread
534
- *
535
- * @param[in] session Session
536
- * @param[in] error One of the following errors, from ::sp_error
537
- * SP_ERROR_NO_STREAM_AVAILABLE
538
- * SP_ERROR_OTHER_TRANSIENT
539
- * SP_ERROR_OTHER_PERMANENT
540
- */
541
- void (SP_CALLCONV *streaming_error)(sp_session *session, sp_error error);
542
-
543
- /**
544
- * Called after user info (anything related to sp_user objects) have been updated.
545
- *
546
- * @param[in] session Session
547
- */
548
- void (SP_CALLCONV *userinfo_updated)(sp_session *session);
549
-
550
- /**
551
- * Called when audio playback should start
552
- *
553
- * @note For this to work correctly the application must also implement get_audio_buffer_stats()
554
- *
555
- * @note This function is called from an internal session thread - you need to have proper synchronization!
556
- *
557
- * @note This function must never block.
558
- *
559
- * @param[in] session Session
560
- */
561
- void (SP_CALLCONV *start_playback)(sp_session *session);
562
-
563
-
564
- /**
565
- * Called when audio playback should stop
566
- *
567
- * @note For this to work correctly the application must also implement get_audio_buffer_stats()
568
- *
569
- * @note This function is called from an internal session thread - you need to have proper synchronization!
570
- *
571
- * @note This function must never block.
572
- *
573
- * @param[in] session Session
574
- */
575
- void (SP_CALLCONV *stop_playback)(sp_session *session);
576
-
577
- /**
578
- * Called to query application about its audio buffer
579
- *
580
- * @note This function is called from an internal session thread - you need to have proper synchronization!
581
- *
582
- * @note This function must never block.
583
- *
584
- * @param[in] session Session
585
- * @param[out] stats Stats struct to be filled by application
586
- */
587
- void (SP_CALLCONV *get_audio_buffer_stats)(sp_session *session, sp_audio_buffer_stats *stats);
588
-
589
- /**
590
- * Called when offline synchronization status is updated
591
- *
592
- * @param[in] session Session
593
- */
594
- void (SP_CALLCONV *offline_status_updated)(sp_session *session);
595
-
596
- /**
597
- * Called when offline synchronization status is updated
598
- *
599
- * @param[in] session Session
600
- * @param[in] error Offline error. Will be SP_ERROR_OK if the offline synchronization
601
- * error state has cleared
602
- */
603
- void (SP_CALLCONV *offline_error)(sp_session *session, sp_error error);
604
-
605
- /**
606
- * Called when storable credentials have been updated, usually called when
607
- * we have connected to the AP.
608
- *
609
- * @param[in] session Session
610
- * @param[in] blob Blob is a null-terminated string which contains
611
- * an encrypted token that can be stored safely on disk
612
- * instead of storing plaintext passwords.
613
- */
614
- void (SP_CALLCONV *credentials_blob_updated)(sp_session *session, const char *blob);
615
-
616
- /**
617
- * Called when the connection state has updated - such as when logging in, going offline, etc.
618
- *
619
- * @param[in] session Session
620
- */
621
- void (SP_CALLCONV *connectionstate_updated)(sp_session *session);
395
+ /**
396
+ * Called when login has been processed and was successful
397
+ *
398
+ * @param[in] session Session
399
+ * @param[in] error One of the following errors, from ::sp_error
400
+ * SP_ERROR_OK
401
+ * SP_ERROR_CLIENT_TOO_OLD
402
+ * SP_ERROR_UNABLE_TO_CONTACT_SERVER
403
+ * SP_ERROR_BAD_USERNAME_OR_PASSWORD
404
+ * SP_ERROR_USER_BANNED
405
+ * SP_ERROR_USER_NEEDS_PREMIUM
406
+ * SP_ERROR_OTHER_TRANSIENT
407
+ * SP_ERROR_OTHER_PERMANENT
408
+ */
409
+ void (SP_CALLCONV *logged_in)(sp_session *session, sp_error error);
410
+
411
+ /**
412
+ * Called when logout has been processed. Either called explicitly
413
+ * if you initialize a logout operation, or implicitly if there
414
+ * is a permanent connection error
415
+ *
416
+ * @param[in] session Session
417
+ */
418
+ void (SP_CALLCONV *logged_out)(sp_session *session);
419
+ /**
420
+ * Called whenever metadata has been updated
421
+ *
422
+ * If you have metadata cached outside of libspotify, you should purge
423
+ * your caches and fetch new versions.
424
+ *
425
+ * @param[in] session Session
426
+ */
427
+ void (SP_CALLCONV *metadata_updated)(sp_session *session);
428
+
429
+ /**
430
+ * Called when there is a connection error, and the library has problems
431
+ * reconnecting to the Spotify service. Could be called multiple times (as
432
+ * long as the problem is present)
433
+ *
434
+ *
435
+ * @param[in] session Session
436
+ * @param[in] error One of the following errors, from ::sp_error
437
+ * SP_ERROR_OK
438
+ * SP_ERROR_CLIENT_TOO_OLD
439
+ * SP_ERROR_UNABLE_TO_CONTACT_SERVER
440
+ * SP_ERROR_BAD_USERNAME_OR_PASSWORD
441
+ * SP_ERROR_USER_BANNED
442
+ * SP_ERROR_USER_NEEDS_PREMIUM
443
+ * SP_ERROR_OTHER_TRANSIENT
444
+ * SP_ERROR_OTHER_PERMANENT
445
+ */
446
+ void (SP_CALLCONV *connection_error)(sp_session *session, sp_error error);
447
+
448
+ /**
449
+ * Called when the access point wants to display a message to the user
450
+ *
451
+ * In the desktop client, these are shown in a blueish toolbar just below the
452
+ * search box.
453
+ *
454
+ * @param[in] session Session
455
+ * @param[in] message String in UTF-8 format.
456
+ */
457
+ void (SP_CALLCONV *message_to_user)(sp_session *session, const char *message);
458
+
459
+ /**
460
+ * Called when processing needs to take place on the main thread.
461
+ *
462
+ * You need to call sp_session_process_events() in the main thread to get
463
+ * libspotify to do more work. Failure to do so may cause request timeouts,
464
+ * or a lost connection.
465
+ *
466
+ * @param[in] session Session
467
+ *
468
+ * @note This function is called from an internal session thread - you need to have proper synchronization!
469
+ */
470
+ void (SP_CALLCONV *notify_main_thread)(sp_session *session);
471
+
472
+ /**
473
+ * Called when there is decompressed audio data available.
474
+ *
475
+ * @param[in] session Session
476
+ * @param[in] format Audio format descriptor sp_audioformat
477
+ * @param[in] frames Points to raw PCM data as described by \p format
478
+ * @param[in] num_frames Number of available samples in \p frames.
479
+ * If this is 0, a discontinuity has occurred (such as after a seek). The application
480
+ * should flush its audio fifos, etc.
481
+ *
482
+ * @return Number of frames consumed.
483
+ * This value can be used to rate limit the output from the library if your
484
+ * output buffers are saturated. The library will retry delivery in about 100ms.
485
+ *
486
+ * @note This function is called from an internal session thread - you need to have proper synchronization!
487
+ *
488
+ * @note This function must never block. If your output buffers are full you must return 0 to signal
489
+ * that the library should retry delivery in a short while.
490
+ */
491
+ int (SP_CALLCONV *music_delivery)(sp_session *session, const sp_audioformat *format, const void *frames, int num_frames);
492
+
493
+ /**
494
+ * Music has been paused because an account only allows music
495
+ * to be played from one location simultaneously.
496
+ *
497
+ * @note When this callback is invoked the application should
498
+ * behave just as if the user pressed the pause
499
+ * button. The application should also display a message
500
+ * to the user indicating the playback has been paused
501
+ * because another application is playing using the same
502
+ * account.
503
+ *
504
+ * @note IT MUST NOT automatically resume playback but must
505
+ * instead wait for the user to press play.
506
+ *
507
+ * @param[in] session Session
508
+ */
509
+ void (SP_CALLCONV *play_token_lost)(sp_session *session);
510
+
511
+ /**
512
+ * Logging callback.
513
+ *
514
+ * @param[in] session Session
515
+ * @param[in] data Log data
516
+ */
517
+ void (SP_CALLCONV *log_message)(sp_session *session, const char *data);
518
+
519
+ /**
520
+ * End of track.
521
+ * Called when the currently played track has reached its end.
522
+ *
523
+ * @note This function is invoked from the main thread
524
+ *
525
+ * @param[in] session Session
526
+ */
527
+ void (SP_CALLCONV *end_of_track)(sp_session *session);
528
+
529
+ /**
530
+ * Streaming error.
531
+ * Called when streaming cannot start or continue.
532
+ *
533
+ * @note This function is invoked from the main thread
534
+ *
535
+ * @param[in] session Session
536
+ * @param[in] error One of the following errors, from ::sp_error
537
+ * SP_ERROR_NO_STREAM_AVAILABLE
538
+ * SP_ERROR_OTHER_TRANSIENT
539
+ * SP_ERROR_OTHER_PERMANENT
540
+ */
541
+ void (SP_CALLCONV *streaming_error)(sp_session *session, sp_error error);
542
+
543
+ /**
544
+ * Called after user info (anything related to sp_user objects) have been updated.
545
+ *
546
+ * @param[in] session Session
547
+ */
548
+ void (SP_CALLCONV *userinfo_updated)(sp_session *session);
549
+
550
+ /**
551
+ * Called when audio playback should start
552
+ *
553
+ * @note For this to work correctly the application must also implement get_audio_buffer_stats()
554
+ *
555
+ * @note This function is called from an internal session thread - you need to have proper synchronization!
556
+ *
557
+ * @note This function must never block.
558
+ *
559
+ * @param[in] session Session
560
+ */
561
+ void (SP_CALLCONV *start_playback)(sp_session *session);
562
+
563
+
564
+ /**
565
+ * Called when audio playback should stop
566
+ *
567
+ * @note For this to work correctly the application must also implement get_audio_buffer_stats()
568
+ *
569
+ * @note This function is called from an internal session thread - you need to have proper synchronization!
570
+ *
571
+ * @note This function must never block.
572
+ *
573
+ * @param[in] session Session
574
+ */
575
+ void (SP_CALLCONV *stop_playback)(sp_session *session);
576
+
577
+ /**
578
+ * Called to query application about its audio buffer
579
+ *
580
+ * @note This function is called from an internal session thread - you need to have proper synchronization!
581
+ *
582
+ * @note This function must never block.
583
+ *
584
+ * @param[in] session Session
585
+ * @param[out] stats Stats struct to be filled by application
586
+ */
587
+ void (SP_CALLCONV *get_audio_buffer_stats)(sp_session *session, sp_audio_buffer_stats *stats);
588
+
589
+ /**
590
+ * Called when offline synchronization status is updated
591
+ *
592
+ * @param[in] session Session
593
+ */
594
+ void (SP_CALLCONV *offline_status_updated)(sp_session *session);
595
+
596
+ /**
597
+ * Called when offline synchronization status is updated
598
+ *
599
+ * @param[in] session Session
600
+ * @param[in] error Offline error. Will be SP_ERROR_OK if the offline synchronization
601
+ * error state has cleared
602
+ */
603
+ void (SP_CALLCONV *offline_error)(sp_session *session, sp_error error);
604
+
605
+ /**
606
+ * Called when storable credentials have been updated, usually called when
607
+ * we have connected to the AP.
608
+ *
609
+ * @param[in] session Session
610
+ * @param[in] blob Blob is a null-terminated string which contains
611
+ * an encrypted token that can be stored safely on disk
612
+ * instead of storing plaintext passwords.
613
+ */
614
+ void (SP_CALLCONV *credentials_blob_updated)(sp_session *session, const char *blob);
615
+
616
+ /**
617
+ * Called when the connection state has updated - such as when logging in, going offline, etc.
618
+ *
619
+ * @param[in] session Session
620
+ */
621
+ void (SP_CALLCONV *connectionstate_updated)(sp_session *session);
622
622
 
623
623
  /**
624
- * Called when there is a scrobble error event
625
- *
626
- * @param[in] session Session
627
- * @param[in] error Scrobble error. Currently SP_ERROR_LASTFM_AUTH_ERROR.
628
- */
629
- void (SP_CALLCONV *scrobble_error)(sp_session *session, sp_error error);
624
+ * Called when there is a scrobble error event
625
+ *
626
+ * @param[in] session Session
627
+ * @param[in] error Scrobble error. Currently SP_ERROR_LASTFM_AUTH_ERROR.
628
+ */
629
+ void (SP_CALLCONV *scrobble_error)(sp_session *session, sp_error error);
630
630
 
631
631
  /**
632
- * Called when there is a change in the private session mode
633
- *
634
- * @param[in] session Session
635
- * @param[in] isPrivate True if in private session, false otherwhise
636
- */
637
- void (SP_CALLCONV *private_session_mode_changed)(sp_session *session, bool is_private);
632
+ * Called when there is a change in the private session mode
633
+ *
634
+ * @param[in] session Session
635
+ * @param[in] isPrivate True if in private session, false otherwhise
636
+ */
637
+ void (SP_CALLCONV *private_session_mode_changed)(sp_session *session, bool is_private);
638
638
  } sp_session_callbacks;
639
639
 
640
640
  /**
641
641
  * Session config
642
642
  */
643
643
  typedef struct sp_session_config {
644
- int api_version; ///< The version of the Spotify API your application is compiled with. Set to #SPOTIFY_API_VERSION
645
- const char *cache_location; /**< The location where Spotify will write cache files.
646
- * This cache include tracks, cached browse results and coverarts.
647
- * Set to empty string ("") to disable cache
648
- */
649
- const char *settings_location; /**< The location where Spotify will write setting files and per-user
650
- * cache items. This includes playlists, track metadata, etc.
651
- * 'settings_location' may be the same path as 'cache_location'.
652
- * 'settings_location' folder will not be created (unlike 'cache_location'),
653
- * if you don't want to create the folder yourself, you can set 'settings_location' to 'cache_location'.
654
- */
655
- const void *application_key; ///< Your application key
656
- size_t application_key_size; ///< The size of the application key in bytes
657
- const char *user_agent; /**< "User-Agent" for your application - max 255 characters long
658
- The User-Agent should be a relevant, customer facing identification of your application
659
- */
660
-
661
- const sp_session_callbacks *callbacks; ///< Delivery callbacks for session events, or NULL if you are not interested in any callbacks (not recommended!)
662
- void *userdata; ///< User supplied data for your application
663
-
664
- /**
665
- * Compress local copy of playlists, reduces disk space usage
666
- */
667
- bool compress_playlists;
668
-
669
- /**
670
- * Don't save metadata for local copies of playlists
671
- * Reduces disk space usage at the expense of needing
672
- * to request metadata from Spotify backend when loading list
673
- */
674
- bool dont_save_metadata_for_playlists;
675
-
676
- /**
677
- * Avoid loading playlists into RAM on startup.
678
- * See sp_playlist_is_in_ram() for more details.
679
- */
680
- bool initially_unload_playlists;
681
-
682
- /**
683
- * Device ID for offline synchronization and logging purposes. The Device Id must be unique to the particular device instance,
684
- * i.e. no two units must supply the same Device ID. The Device ID must not change between sessions or power cycles.
685
- * Good examples is the device's MAC address or unique serial number.
686
- */
687
- const char *device_id;
688
-
689
- /**
690
- * Url to the proxy server that should be used.
691
- * The format is protocol://<host>:port (where protocal is http/https/socks4/socks5)
692
- */
693
- const char *proxy;
694
- /**
695
- * Username to authenticate with proxy server
696
- */
697
- const char *proxy_username;
698
- /**
699
- * Password to authenticate with proxy server
700
- */
701
- const char *proxy_password;
702
-
703
-
704
- /**
705
- * Path to API trace file
706
- */
707
- const char *tracefile;
644
+ int api_version; ///< The version of the Spotify API your application is compiled with. Set to #SPOTIFY_API_VERSION
645
+ const char *cache_location; /**< The location where Spotify will write cache files.
646
+ * This cache include tracks, cached browse results and coverarts.
647
+ * Set to empty string ("") to disable cache
648
+ */
649
+ const char *settings_location; /**< The location where Spotify will write setting files and per-user
650
+ * cache items. This includes playlists, track metadata, etc.
651
+ * 'settings_location' may be the same path as 'cache_location'.
652
+ * 'settings_location' folder will not be created (unlike 'cache_location'),
653
+ * if you don't want to create the folder yourself, you can set 'settings_location' to 'cache_location'.
654
+ */
655
+ const void *application_key; ///< Your application key
656
+ size_t application_key_size; ///< The size of the application key in bytes
657
+ const char *user_agent; /**< "User-Agent" for your application - max 255 characters long
658
+ The User-Agent should be a relevant, customer facing identification of your application
659
+ */
660
+
661
+ const sp_session_callbacks *callbacks; ///< Delivery callbacks for session events, or NULL if you are not interested in any callbacks (not recommended!)
662
+ void *userdata; ///< User supplied data for your application
663
+
664
+ /**
665
+ * Compress local copy of playlists, reduces disk space usage
666
+ */
667
+ bool compress_playlists;
668
+
669
+ /**
670
+ * Don't save metadata for local copies of playlists
671
+ * Reduces disk space usage at the expense of needing
672
+ * to request metadata from Spotify backend when loading list
673
+ */
674
+ bool dont_save_metadata_for_playlists;
675
+
676
+ /**
677
+ * Avoid loading playlists into RAM on startup.
678
+ * See sp_playlist_is_in_ram() for more details.
679
+ */
680
+ bool initially_unload_playlists;
681
+
682
+ /**
683
+ * Device ID for offline synchronization and logging purposes. The Device Id must be unique to the particular device instance,
684
+ * i.e. no two units must supply the same Device ID. The Device ID must not change between sessions or power cycles.
685
+ * Good examples is the device's MAC address or unique serial number.
686
+ */
687
+ const char *device_id;
688
+
689
+ /**
690
+ * Url to the proxy server that should be used.
691
+ * The format is protocol://<host>:port (where protocal is http/https/socks4/socks5)
692
+ */
693
+ const char *proxy;
694
+ /**
695
+ * Username to authenticate with proxy server
696
+ */
697
+ const char *proxy_username;
698
+ /**
699
+ * Password to authenticate with proxy server
700
+ */
701
+ const char *proxy_password;
702
+
703
+
704
+ /**
705
+ * Path to API trace file
706
+ */
707
+ const char *tracefile;
708
708
 
709
709
  } sp_session_config;
710
710
 
@@ -757,7 +757,7 @@ SP_LIBEXPORT(sp_error) sp_session_release(sp_session *sess);
757
757
  * @param[in] username The username to log in
758
758
  * @param[in] password The password for the specified username
759
759
  * @param[in] remember_me If set, the username / password will be remembered by libspotify
760
- * @param[in] blob If you have received a blob in the #credentials_blob_updated
760
+ * @param[in] blob If you have received a blob in the #credentials_blob_updated
761
761
  * you can pas this here instead of password
762
762
  * @return One of the following errors, from ::sp_error
763
763
  * SP_ERROR_OK
@@ -904,7 +904,7 @@ SP_LIBEXPORT(sp_error) sp_session_process_events(sp_session *session, int *next_
904
904
  * SP_ERROR_OK
905
905
  * SP_ERROR_MISSING_CALLBACK
906
906
  * SP_ERROR_TRACK_NOT_PLAYABLE
907
- *
907
+ *
908
908
  */
909
909
  SP_LIBEXPORT(sp_error) sp_session_player_load(sp_session *session, sp_track *track);
910
910
 
@@ -1005,7 +1005,7 @@ SP_LIBEXPORT(sp_playlist *) sp_session_starred_for_user_create(sp_session *sessi
1005
1005
  * Return the published container for a given @a canonical_username,
1006
1006
  * or the currently logged in user if @a canonical_username is NULL.
1007
1007
  *
1008
- * When done with the list you should call sp_playlistconatiner_release() to
1008
+ * When done with the list you should call sp_playlistconatiner_release() to
1009
1009
  * decrese the reference you own by having created it.
1010
1010
  *
1011
1011
  * @param[in] session Your session object.
@@ -1045,7 +1045,7 @@ SP_LIBEXPORT(sp_error) sp_session_preferred_offline_bitrate(sp_session *session,
1045
1045
  * Return status of volume normalization
1046
1046
  *
1047
1047
  * @param[in] session Session object
1048
- *
1048
+ *
1049
1049
  * @return true iff volume normalization is enabled
1050
1050
  *
1051
1051
  */
@@ -1248,16 +1248,16 @@ SP_LIBEXPORT(int) sp_session_user_country(sp_session *session);
1248
1248
  * Link types
1249
1249
  */
1250
1250
  typedef enum {
1251
- SP_LINKTYPE_INVALID = 0, ///< Link type not valid - default until the library has parsed the link, or when parsing failed
1252
- SP_LINKTYPE_TRACK = 1, ///< Link type is track
1253
- SP_LINKTYPE_ALBUM = 2, ///< Link type is album
1254
- SP_LINKTYPE_ARTIST = 3, ///< Link type is artist
1255
- SP_LINKTYPE_SEARCH = 4, ///< Link type is search
1256
- SP_LINKTYPE_PLAYLIST = 5, ///< Link type is playlist
1257
- SP_LINKTYPE_PROFILE = 6, ///< Link type is profile
1258
- SP_LINKTYPE_STARRED = 7, ///< Link type is starred
1259
- SP_LINKTYPE_LOCALTRACK = 8, ///< Link type is a local file
1260
- SP_LINKTYPE_IMAGE = 9, ///< Link type is an image
1251
+ SP_LINKTYPE_INVALID = 0, ///< Link type not valid - default until the library has parsed the link, or when parsing failed
1252
+ SP_LINKTYPE_TRACK = 1, ///< Link type is track
1253
+ SP_LINKTYPE_ALBUM = 2, ///< Link type is album
1254
+ SP_LINKTYPE_ARTIST = 3, ///< Link type is artist
1255
+ SP_LINKTYPE_SEARCH = 4, ///< Link type is search
1256
+ SP_LINKTYPE_PLAYLIST = 5, ///< Link type is playlist
1257
+ SP_LINKTYPE_PROFILE = 6, ///< Link type is profile
1258
+ SP_LINKTYPE_STARRED = 7, ///< Link type is starred
1259
+ SP_LINKTYPE_LOCALTRACK = 8, ///< Link type is a local file
1260
+ SP_LINKTYPE_IMAGE = 9, ///< Link type is an image
1261
1261
  } sp_linktype;
1262
1262
 
1263
1263
  /**
@@ -1773,10 +1773,10 @@ SP_LIBEXPORT(sp_error) sp_track_release(sp_track *track);
1773
1773
  * Album types
1774
1774
  */
1775
1775
  typedef enum {
1776
- SP_ALBUMTYPE_ALBUM = 0, ///< Normal album
1777
- SP_ALBUMTYPE_SINGLE = 1, ///< Single
1778
- SP_ALBUMTYPE_COMPILATION = 2, ///< Compilation
1779
- SP_ALBUMTYPE_UNKNOWN = 3, ///< Unknown type
1776
+ SP_ALBUMTYPE_ALBUM = 0, ///< Normal album
1777
+ SP_ALBUMTYPE_SINGLE = 1, ///< Single
1778
+ SP_ALBUMTYPE_COMPILATION = 2, ///< Compilation
1779
+ SP_ALBUMTYPE_UNKNOWN = 3, ///< Unknown type
1780
1780
  } sp_albumtype;
1781
1781
 
1782
1782
  /**
@@ -2332,8 +2332,8 @@ SP_LIBEXPORT(sp_error) sp_artistbrowse_release(sp_artistbrowse *arb);
2332
2332
  * Image format
2333
2333
  */
2334
2334
  typedef enum {
2335
- SP_IMAGE_FORMAT_UNKNOWN = -1, ///< Unknown image format
2336
- SP_IMAGE_FORMAT_JPEG = 0, ///< JPEG image
2335
+ SP_IMAGE_FORMAT_UNKNOWN = -1, ///< Unknown image format
2336
+ SP_IMAGE_FORMAT_JPEG = 0, ///< JPEG image
2337
2337
  } sp_imageformat;
2338
2338
 
2339
2339
  /**
@@ -2577,6 +2577,16 @@ SP_LIBEXPORT(sp_album *) sp_search_album(sp_search *search, int index);
2577
2577
  */
2578
2578
  SP_LIBEXPORT(int) sp_search_num_playlists(sp_search *search);
2579
2579
 
2580
+ /**
2581
+ * Load the playlist at the given index in the given search object
2582
+ *
2583
+ * @param[in] search Search object
2584
+ * @param[in] index Index of the wanted playlist. Should be in the interval [0, sp_search_num_playlists() - 1]
2585
+ *
2586
+ * @return A playlist object. This reference is owned by the caller and should be released with sp_playlist_release()
2587
+ */
2588
+ SP_LIBEXPORT(sp_playlist *) sp_search_playlist(sp_search *search, int index);
2589
+
2580
2590
  /**
2581
2591
  * Return the playlist at the given index in the given search object
2582
2592
  *
@@ -2731,142 +2741,142 @@ SP_LIBEXPORT(sp_error) sp_search_release(sp_search *search);
2731
2741
  */
2732
2742
  typedef struct sp_playlist_callbacks {
2733
2743
 
2734
- /**
2735
- * Called when one or more tracks have been added to a playlist
2736
- *
2737
- * @param[in] pl Playlist object
2738
- * @param[in] tracks Array of pointers to track objects
2739
- * @param[in] num_tracks Number of entries in \p tracks
2740
- * @param[in] position Position in the playlist for the first track.
2741
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2742
- */
2743
- void (SP_CALLCONV *tracks_added)(sp_playlist *pl, sp_track * const *tracks, int num_tracks, int position, void *userdata);
2744
-
2745
- /**
2746
- * Called when one or more tracks have been removed from a playlist
2747
- *
2748
- * @param[in] pl Playlist object
2749
- * @param[in] tracks Array of positions representing the tracks that were removed
2750
- * @param[in] num_tracks Number of entries in \p tracks
2751
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2752
- */
2753
- void (SP_CALLCONV *tracks_removed)(sp_playlist *pl, const int *tracks, int num_tracks, void *userdata);
2754
-
2755
- /**
2756
- * Called when one or more tracks have been moved within a playlist
2757
- *
2758
- * @param[in] pl Playlist object
2759
- * @param[in] tracks Array of positions representing the tracks that were moved
2760
- * @param[in] num_tracks Number of entries in \p tracks
2761
- * @param[in] position New position in the playlist for the first track.
2762
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2763
- */
2764
- void (SP_CALLCONV *tracks_moved)(sp_playlist *pl, const int *tracks, int num_tracks, int new_position, void *userdata);
2765
-
2766
- /**
2767
- * Called when a playlist has been renamed. sp_playlist_name() can be used to find out the new name
2768
- *
2769
- * @param[in] pl Playlist object
2770
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2771
- */
2772
- void (SP_CALLCONV *playlist_renamed)(sp_playlist *pl, void *userdata);
2773
-
2774
- /**
2775
- * Called when state changed for a playlist.
2776
- *
2777
- * There are three states that trigger this callback:
2778
- * - Collaboration for this playlist has been turned on or off
2779
- * - The playlist started having pending changes, or all pending changes have now been committed
2780
- * - The playlist started loading, or finished loading
2781
- *
2782
- * @param[in] pl Playlist object
2783
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2784
- * @sa sp_playlist_is_collaborative
2785
- * @sa sp_playlist_has_pending_changes
2786
- * @sa sp_playlist_is_loaded
2787
- */
2788
- void (SP_CALLCONV *playlist_state_changed)(sp_playlist *pl, void *userdata);
2789
-
2790
- /**
2791
- * Called when a playlist is updating or is done updating
2792
- *
2793
- * This is called before and after a series of changes are applied to the
2794
- * playlist. It allows e.g. the user interface to defer updating until the
2795
- * entire operation is complete.
2796
- *
2797
- * @param[in] pl Playlist object
2798
- * @param[in] done True iff the update is completed
2799
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2800
- */
2801
- void (SP_CALLCONV *playlist_update_in_progress)(sp_playlist *pl, bool done, void *userdata);
2802
-
2803
- /**
2804
- * Called when metadata for one or more tracks in a playlist has been updated.
2805
- *
2806
- * @param[in] pl Playlist object
2807
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2808
- */
2809
- void (SP_CALLCONV *playlist_metadata_updated)(sp_playlist *pl, void *userdata);
2810
-
2811
- /**
2812
- * Called when create time and/or creator for a playlist entry changes
2813
- *
2814
- * @param[in] pl Playlist object
2815
- * @param[in] position Position in playlist
2816
- * @param[in] user User object
2817
- * @param[in] time When entry was created, seconds since the unix epoch.
2818
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2819
- */
2820
- void (SP_CALLCONV *track_created_changed)(sp_playlist *pl, int position, sp_user *user, int when, void *userdata);
2821
-
2822
- /**
2823
- * Called when seen attribute for a playlist entry changes.
2824
- *
2825
- * @param[in] pl Playlist object
2826
- * @param[in] position Position in playlist
2827
- * @param[in] seen Set if entry it marked as seen
2828
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2829
- */
2830
- void (SP_CALLCONV *track_seen_changed)(sp_playlist *pl, int position, bool seen, void *userdata);
2831
-
2832
- /**
2833
- * Called when playlist description has changed
2834
- *
2835
- * @param[in] pl Playlist object
2836
- * @param[in] desc New description
2837
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2838
- */
2839
- void (SP_CALLCONV *description_changed)(sp_playlist *pl, const char *desc, void *userdata);
2840
-
2841
-
2842
- /**
2843
- * Called when playlist image has changed
2844
- *
2845
- * @param[in] pl Playlist object
2846
- * @param[in] image New image
2847
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2848
- */
2849
- void (SP_CALLCONV *image_changed)(sp_playlist *pl, const byte *image, void *userdata);
2850
-
2851
-
2852
- /**
2853
- * Called when message attribute for a playlist entry changes.
2854
- *
2855
- * @param[in] pl Playlist object
2856
- * @param[in] position Position in playlist
2857
- * @param[in] message UTF-8 encoded message
2858
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2859
- */
2860
- void (SP_CALLCONV *track_message_changed)(sp_playlist *pl, int position, const char *message, void *userdata);
2861
-
2862
-
2863
- /**
2864
- * Called when playlist subscribers changes (count or list of names)
2865
- *
2866
- * @param[in] pl Playlist object
2867
- * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2868
- */
2869
- void (SP_CALLCONV *subscribers_changed)(sp_playlist *pl, void *userdata);
2744
+ /**
2745
+ * Called when one or more tracks have been added to a playlist
2746
+ *
2747
+ * @param[in] pl Playlist object
2748
+ * @param[in] tracks Array of pointers to track objects
2749
+ * @param[in] num_tracks Number of entries in \p tracks
2750
+ * @param[in] position Position in the playlist for the first track.
2751
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2752
+ */
2753
+ void (SP_CALLCONV *tracks_added)(sp_playlist *pl, sp_track * const *tracks, int num_tracks, int position, void *userdata);
2754
+
2755
+ /**
2756
+ * Called when one or more tracks have been removed from a playlist
2757
+ *
2758
+ * @param[in] pl Playlist object
2759
+ * @param[in] tracks Array of positions representing the tracks that were removed
2760
+ * @param[in] num_tracks Number of entries in \p tracks
2761
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2762
+ */
2763
+ void (SP_CALLCONV *tracks_removed)(sp_playlist *pl, const int *tracks, int num_tracks, void *userdata);
2764
+
2765
+ /**
2766
+ * Called when one or more tracks have been moved within a playlist
2767
+ *
2768
+ * @param[in] pl Playlist object
2769
+ * @param[in] tracks Array of positions representing the tracks that were moved
2770
+ * @param[in] num_tracks Number of entries in \p tracks
2771
+ * @param[in] position New position in the playlist for the first track.
2772
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2773
+ */
2774
+ void (SP_CALLCONV *tracks_moved)(sp_playlist *pl, const int *tracks, int num_tracks, int new_position, void *userdata);
2775
+
2776
+ /**
2777
+ * Called when a playlist has been renamed. sp_playlist_name() can be used to find out the new name
2778
+ *
2779
+ * @param[in] pl Playlist object
2780
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2781
+ */
2782
+ void (SP_CALLCONV *playlist_renamed)(sp_playlist *pl, void *userdata);
2783
+
2784
+ /**
2785
+ * Called when state changed for a playlist.
2786
+ *
2787
+ * There are three states that trigger this callback:
2788
+ * - Collaboration for this playlist has been turned on or off
2789
+ * - The playlist started having pending changes, or all pending changes have now been committed
2790
+ * - The playlist started loading, or finished loading
2791
+ *
2792
+ * @param[in] pl Playlist object
2793
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2794
+ * @sa sp_playlist_is_collaborative
2795
+ * @sa sp_playlist_has_pending_changes
2796
+ * @sa sp_playlist_is_loaded
2797
+ */
2798
+ void (SP_CALLCONV *playlist_state_changed)(sp_playlist *pl, void *userdata);
2799
+
2800
+ /**
2801
+ * Called when a playlist is updating or is done updating
2802
+ *
2803
+ * This is called before and after a series of changes are applied to the
2804
+ * playlist. It allows e.g. the user interface to defer updating until the
2805
+ * entire operation is complete.
2806
+ *
2807
+ * @param[in] pl Playlist object
2808
+ * @param[in] done True iff the update is completed
2809
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2810
+ */
2811
+ void (SP_CALLCONV *playlist_update_in_progress)(sp_playlist *pl, bool done, void *userdata);
2812
+
2813
+ /**
2814
+ * Called when metadata for one or more tracks in a playlist has been updated.
2815
+ *
2816
+ * @param[in] pl Playlist object
2817
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2818
+ */
2819
+ void (SP_CALLCONV *playlist_metadata_updated)(sp_playlist *pl, void *userdata);
2820
+
2821
+ /**
2822
+ * Called when create time and/or creator for a playlist entry changes
2823
+ *
2824
+ * @param[in] pl Playlist object
2825
+ * @param[in] position Position in playlist
2826
+ * @param[in] user User object
2827
+ * @param[in] time When entry was created, seconds since the unix epoch.
2828
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2829
+ */
2830
+ void (SP_CALLCONV *track_created_changed)(sp_playlist *pl, int position, sp_user *user, int when, void *userdata);
2831
+
2832
+ /**
2833
+ * Called when seen attribute for a playlist entry changes.
2834
+ *
2835
+ * @param[in] pl Playlist object
2836
+ * @param[in] position Position in playlist
2837
+ * @param[in] seen Set if entry it marked as seen
2838
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2839
+ */
2840
+ void (SP_CALLCONV *track_seen_changed)(sp_playlist *pl, int position, bool seen, void *userdata);
2841
+
2842
+ /**
2843
+ * Called when playlist description has changed
2844
+ *
2845
+ * @param[in] pl Playlist object
2846
+ * @param[in] desc New description
2847
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2848
+ */
2849
+ void (SP_CALLCONV *description_changed)(sp_playlist *pl, const char *desc, void *userdata);
2850
+
2851
+
2852
+ /**
2853
+ * Called when playlist image has changed
2854
+ *
2855
+ * @param[in] pl Playlist object
2856
+ * @param[in] image New image
2857
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2858
+ */
2859
+ void (SP_CALLCONV *image_changed)(sp_playlist *pl, const byte *image, void *userdata);
2860
+
2861
+
2862
+ /**
2863
+ * Called when message attribute for a playlist entry changes.
2864
+ *
2865
+ * @param[in] pl Playlist object
2866
+ * @param[in] position Position in playlist
2867
+ * @param[in] message UTF-8 encoded message
2868
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2869
+ */
2870
+ void (SP_CALLCONV *track_message_changed)(sp_playlist *pl, int position, const char *message, void *userdata);
2871
+
2872
+
2873
+ /**
2874
+ * Called when playlist subscribers changes (count or list of names)
2875
+ *
2876
+ * @param[in] pl Playlist object
2877
+ * @param[in] userdata Userdata passed to sp_playlist_add_callbacks()
2878
+ */
2879
+ void (SP_CALLCONV *subscribers_changed)(sp_playlist *pl, void *userdata);
2870
2880
 
2871
2881
  } sp_playlist_callbacks;
2872
2882
 
@@ -3310,46 +3320,46 @@ SP_LIBEXPORT(sp_error) sp_playlist_release(sp_playlist *playlist);
3310
3320
  * @see sp_playlistcontainer_remove_callbacks
3311
3321
  */
3312
3322
  typedef struct sp_playlistcontainer_callbacks {
3313
- /**
3314
- * Called when a new playlist has been added to the playlist container.
3315
- *
3316
- * @param[in] pc Playlist container
3317
- * @param[in] playlist Playlist object.
3318
- * @param[in] position Position in list
3319
- * @param[in] userdata Userdata as set in sp_playlistcontainer_add_callbacks()
3320
- */
3321
- void (SP_CALLCONV *playlist_added)(sp_playlistcontainer *pc, sp_playlist *playlist, int position, void *userdata);
3322
-
3323
-
3324
- /**
3325
- * Called when a new playlist has been removed from playlist container
3326
- *
3327
- * @param[in] pc Playlist container
3328
- * @param[in] playlist Playlist object.
3329
- * @param[in] position Position in list
3330
- * @param[in] userdata Userdata as set in sp_playlistcontainer_add_callbacks()
3331
- */
3332
- void (SP_CALLCONV *playlist_removed)(sp_playlistcontainer *pc, sp_playlist *playlist, int position, void *userdata);
3333
-
3334
-
3335
- /**
3336
- * Called when a playlist has been moved in the playlist container
3337
- *
3338
- * @param[in] pc Playlist container
3339
- * @param[in] playlist Playlist object.
3340
- * @param[in] position Previous position in playlist container list
3341
- * @param[in] new_position New position in playlist container list
3342
- * @param[in] userdata Userdata as set in sp_playlistcontainer_add_callbacks()
3343
- */
3344
- void (SP_CALLCONV *playlist_moved)(sp_playlistcontainer *pc, sp_playlist *playlist, int position, int new_position, void *userdata);
3345
-
3346
- /**
3347
- * Called when the playlist container is loaded
3348
- *
3349
- * @param[in] pc Playlist container
3350
- * @param[in] userdata Userdata as set in sp_playlistcontainer_add_callbacks()
3351
- */
3352
- void (SP_CALLCONV *container_loaded)(sp_playlistcontainer *pc, void *userdata);
3323
+ /**
3324
+ * Called when a new playlist has been added to the playlist container.
3325
+ *
3326
+ * @param[in] pc Playlist container
3327
+ * @param[in] playlist Playlist object.
3328
+ * @param[in] position Position in list
3329
+ * @param[in] userdata Userdata as set in sp_playlistcontainer_add_callbacks()
3330
+ */
3331
+ void (SP_CALLCONV *playlist_added)(sp_playlistcontainer *pc, sp_playlist *playlist, int position, void *userdata);
3332
+
3333
+
3334
+ /**
3335
+ * Called when a new playlist has been removed from playlist container
3336
+ *
3337
+ * @param[in] pc Playlist container
3338
+ * @param[in] playlist Playlist object.
3339
+ * @param[in] position Position in list
3340
+ * @param[in] userdata Userdata as set in sp_playlistcontainer_add_callbacks()
3341
+ */
3342
+ void (SP_CALLCONV *playlist_removed)(sp_playlistcontainer *pc, sp_playlist *playlist, int position, void *userdata);
3343
+
3344
+
3345
+ /**
3346
+ * Called when a playlist has been moved in the playlist container
3347
+ *
3348
+ * @param[in] pc Playlist container
3349
+ * @param[in] playlist Playlist object.
3350
+ * @param[in] position Previous position in playlist container list
3351
+ * @param[in] new_position New position in playlist container list
3352
+ * @param[in] userdata Userdata as set in sp_playlistcontainer_add_callbacks()
3353
+ */
3354
+ void (SP_CALLCONV *playlist_moved)(sp_playlistcontainer *pc, sp_playlist *playlist, int position, int new_position, void *userdata);
3355
+
3356
+ /**
3357
+ * Called when the playlist container is loaded
3358
+ *
3359
+ * @param[in] pc Playlist container
3360
+ * @param[in] userdata Userdata as set in sp_playlistcontainer_add_callbacks()
3361
+ */
3362
+ void (SP_CALLCONV *container_loaded)(sp_playlistcontainer *pc, void *userdata);
3353
3363
  } sp_playlistcontainer_callbacks;
3354
3364
 
3355
3365
 
@@ -3539,7 +3549,7 @@ SP_LIBEXPORT(sp_error) sp_playlistcontainer_add_folder(sp_playlistcontainer *pc,
3539
3549
  * Return a pointer to the user object of the owner.
3540
3550
  *
3541
3551
  * @param[in] pc Playlist container.
3542
- * @return The user object or NULL if unknown or none.
3552
+ * @return The user object or NULL if unknown or none.
3543
3553
  */
3544
3554
  SP_LIBEXPORT(sp_user *) sp_playlistcontainer_owner(sp_playlistcontainer *pc);
3545
3555
 
@@ -3669,9 +3679,9 @@ SP_LIBEXPORT(sp_error) sp_user_release(sp_user *user);
3669
3679
  * Toplist types
3670
3680
  */
3671
3681
  typedef enum {
3672
- SP_TOPLIST_TYPE_ARTISTS = 0, ///< Top artists
3673
- SP_TOPLIST_TYPE_ALBUMS = 1, ///< Top albums
3674
- SP_TOPLIST_TYPE_TRACKS = 2, ///< Top tracks
3682
+ SP_TOPLIST_TYPE_ARTISTS = 0, ///< Top artists
3683
+ SP_TOPLIST_TYPE_ALBUMS = 1, ///< Top albums
3684
+ SP_TOPLIST_TYPE_TRACKS = 2, ///< Top tracks
3675
3685
  } sp_toplisttype;
3676
3686
 
3677
3687
 
@@ -3688,8 +3698,8 @@ typedef enum {
3688
3698
  * Special toplist regions
3689
3699
  */
3690
3700
  typedef enum {
3691
- SP_TOPLIST_REGION_EVERYWHERE = 0, ///< Global toplist
3692
- SP_TOPLIST_REGION_USER = 1, ///< Toplist for a given user
3701
+ SP_TOPLIST_REGION_EVERYWHERE = 0, ///< Global toplist
3702
+ SP_TOPLIST_REGION_USER = 1, ///< Toplist for a given user
3693
3703
  } sp_toplistregion;
3694
3704
 
3695
3705
 
@@ -3859,7 +3869,7 @@ SP_LIBEXPORT(int) sp_toplistbrowse_backend_request_duration(sp_toplistbrowse *tl
3859
3869
  typedef void SP_CALLCONV inboxpost_complete_cb(sp_inbox *result, void *userdata);
3860
3870
 
3861
3871
  /**
3862
- * Add to inbox
3872
+ * Add to inbox
3863
3873
  *
3864
3874
  * @param[in] session Session object
3865
3875
  * @param[in] user Canonical username of recipient