mockspotify 0.1.9 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -25
- data/.gitmodules +3 -0
- data/Rakefile +2 -1
- data/ext/extconf.rb +5 -0
- data/{src → ext/libmockspotify/src}/Makefile.am +0 -0
- data/{src → ext/libmockspotify/src}/album.c +0 -0
- data/{src → ext/libmockspotify/src}/albumbrowse.c +0 -0
- data/{src → ext/libmockspotify/src}/artist.c +0 -0
- data/{src → ext/libmockspotify/src}/artistbrowse.c +0 -0
- data/{src → ext/libmockspotify/src}/error.c +0 -0
- data/{src → ext/libmockspotify/src}/image.c +0 -0
- data/{src → ext/libmockspotify/src}/libmockspotify.h +0 -0
- data/{src → ext/libmockspotify/src}/libspotify/api.h +130 -38
- data/{src → ext/libmockspotify/src}/link.c +0 -0
- data/{src → ext/libmockspotify/src}/playlist.c +0 -0
- data/{src → ext/libmockspotify/src}/search.c +0 -0
- data/{src → ext/libmockspotify/src}/session.c +10 -1
- data/{src → ext/libmockspotify/src}/track.c +5 -3
- data/{src → ext/libmockspotify/src}/user.c +0 -0
- data/{src → ext/libmockspotify/src}/util.c +7 -0
- data/{src → ext/libmockspotify/src}/util.h +1 -0
- data/lib/mockspotify.rb +5 -3
- data/lib/mockspotify/version.rb +1 -1
- data/mockspotify.gemspec +8 -5
- metadata +27 -31
- data/Makefile.am +0 -3
- data/README.rst +0 -55
- data/autogen.sh +0 -4
- data/configure.ac +0 -10
- data/src/extconf.rb +0 -5
data/.gitignore
CHANGED
@@ -1,28 +1,6 @@
|
|
1
|
-
Makefile
|
2
|
-
Makefile.in
|
3
|
-
aclocal.m4
|
4
|
-
autom4te.cache/
|
5
|
-
config.guess
|
6
|
-
config.h
|
7
|
-
config.h.in
|
8
|
-
config.log
|
9
|
-
config.status
|
10
|
-
config.sub
|
11
|
-
configure
|
12
|
-
depcomp
|
13
|
-
install-sh
|
14
|
-
libtool
|
15
|
-
ltmain.sh
|
16
|
-
m4/
|
17
|
-
missing
|
18
|
-
src/.deps/
|
19
|
-
src/.libs/
|
20
|
-
src/*.o
|
21
|
-
src/*.la
|
22
|
-
src/*.lo
|
23
|
-
src/Makefile
|
24
|
-
src/Makefile.in
|
25
|
-
stamp-h1
|
26
1
|
*.bundle
|
27
2
|
pkg/
|
28
3
|
Gemfile.lock
|
4
|
+
ext/*
|
5
|
+
!ext/libmockspotify
|
6
|
+
!ext/extconf.rb
|
data/.gitmodules
ADDED
data/Rakefile
CHANGED
data/ext/extconf.rb
ADDED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -97,25 +97,25 @@ typedef enum sp_error {
|
|
97
97
|
SP_ERROR_BAD_API_VERSION = 1, ///< The library version targeted does not match the one you claim you support
|
98
98
|
SP_ERROR_API_INITIALIZATION_FAILED = 2, ///< Initialization of library failed - are cache locations etc. valid?
|
99
99
|
SP_ERROR_TRACK_NOT_PLAYABLE = 3, ///< The track specified for playing cannot be played
|
100
|
-
SP_ERROR_RESOURCE_NOT_LOADED = 4, ///< One or several of the supplied resources is not yet loaded
|
101
100
|
SP_ERROR_BAD_APPLICATION_KEY = 5, ///< The application key is invalid
|
102
101
|
SP_ERROR_BAD_USERNAME_OR_PASSWORD = 6, ///< Login failed because of bad username and/or password
|
103
102
|
SP_ERROR_USER_BANNED = 7, ///< The specified username is banned
|
104
103
|
SP_ERROR_UNABLE_TO_CONTACT_SERVER = 8, ///< Cannot connect to the Spotify backend system
|
105
104
|
SP_ERROR_CLIENT_TOO_OLD = 9, ///< Client is too old, library will need to be updated
|
106
|
-
SP_ERROR_OTHER_PERMANENT = 10, ///< Some other error
|
105
|
+
SP_ERROR_OTHER_PERMANENT = 10, ///< Some other error occurred, and it is permanent (e.g. trying to relogin will not help)
|
107
106
|
SP_ERROR_BAD_USER_AGENT = 11, ///< The user agent string is invalid or too long
|
108
107
|
SP_ERROR_MISSING_CALLBACK = 12, ///< No valid callback registered to handle events
|
109
108
|
SP_ERROR_INVALID_INDATA = 13, ///< Input data was either missing or invalid
|
110
109
|
SP_ERROR_INDEX_OUT_OF_RANGE = 14, ///< Index out of range
|
111
110
|
SP_ERROR_USER_NEEDS_PREMIUM = 15, ///< The specified user needs a premium account
|
112
|
-
SP_ERROR_OTHER_TRANSIENT = 16, ///< A transient error
|
111
|
+
SP_ERROR_OTHER_TRANSIENT = 16, ///< A transient error occurred.
|
113
112
|
SP_ERROR_IS_LOADING = 17, ///< The resource is currently loading
|
114
113
|
SP_ERROR_NO_STREAM_AVAILABLE = 18, ///< Could not find any suitable stream to play
|
115
114
|
SP_ERROR_PERMISSION_DENIED = 19, ///< Requested operation is not allowed
|
116
115
|
SP_ERROR_INBOX_IS_FULL = 20, ///< Target inbox is full
|
117
116
|
SP_ERROR_NO_CACHE = 21, ///< Cache is not enabled
|
118
117
|
SP_ERROR_NO_SUCH_USER = 22, ///< Requested user does not exist
|
118
|
+
SP_ERROR_NO_CREDENTIALS = 23, ///< No credentials are stored
|
119
119
|
} sp_error;
|
120
120
|
|
121
121
|
/**
|
@@ -147,7 +147,7 @@ SP_LIBEXPORT(const char*) sp_error_message(sp_error error);
|
|
147
147
|
* returned from sp_session_create(). Future versions of the library will provide you with some kind of mechanism
|
148
148
|
* to request an updated version of the library.
|
149
149
|
*/
|
150
|
-
#define SPOTIFY_API_VERSION
|
150
|
+
#define SPOTIFY_API_VERSION 9
|
151
151
|
|
152
152
|
/**
|
153
153
|
* Describes the current state of the connection
|
@@ -157,6 +157,7 @@ typedef enum sp_connectionstate {
|
|
157
157
|
SP_CONNECTION_STATE_LOGGED_IN = 1, ///< Logged in against a Spotify access point
|
158
158
|
SP_CONNECTION_STATE_DISCONNECTED = 2, ///< Was logged in, but has now been disconnected
|
159
159
|
SP_CONNECTION_STATE_UNDEFINED = 3, ///< The connection state is undefined
|
160
|
+
SP_CONNECTION_STATE_OFFLINE = 4 ///< Logged in in offline mode
|
160
161
|
} sp_connectionstate;
|
161
162
|
|
162
163
|
|
@@ -195,7 +196,7 @@ typedef enum sp_playlist_type {
|
|
195
196
|
SP_PLAYLIST_TYPE_PLACEHOLDER = 3, ///< Unknown entry.
|
196
197
|
} sp_playlist_type;
|
197
198
|
|
198
|
-
|
199
|
+
/**
|
199
200
|
* Playlist offline status
|
200
201
|
*/
|
201
202
|
typedef enum sp_playlist_offline_status {
|
@@ -217,7 +218,7 @@ typedef struct sp_audio_buffer_stats {
|
|
217
218
|
* List of subscribers returned by sp_playlist_subscribers()
|
218
219
|
*/
|
219
220
|
typedef struct sp_subscribers {
|
220
|
-
unsigned int count;
|
221
|
+
unsigned int count; ///< Number of elements in 'subscribers'
|
221
222
|
char *subscribers[1]; ///< Actual size is 'count'. Array of pointers to canonical usernames
|
222
223
|
} sp_subscribers;
|
223
224
|
|
@@ -388,7 +389,7 @@ typedef struct sp_session_callbacks {
|
|
388
389
|
* @param[in] format Audio format descriptor sp_audioformat
|
389
390
|
* @param[in] frames Points to raw PCM data as described by \p format
|
390
391
|
* @param[in] num_frames Number of available samples in \p frames.
|
391
|
-
* If this is 0, a discontinuity has
|
392
|
+
* If this is 0, a discontinuity has occurred (such as after a seek). The application
|
392
393
|
* should flush its audio fifos, etc.
|
393
394
|
*
|
394
395
|
* @return Number of frames consumed.
|
@@ -503,11 +504,14 @@ typedef struct sp_session_callbacks {
|
|
503
504
|
typedef struct sp_session_config {
|
504
505
|
int api_version; ///< The version of the Spotify API your application is compiled with. Set to #SPOTIFY_API_VERSION
|
505
506
|
const char *cache_location; /**< The location where Spotify will write cache files.
|
506
|
-
* This cache include tracks, cached browse results and coverarts
|
507
|
+
* This cache include tracks, cached browse results and coverarts.
|
507
508
|
* Set to empty string ("") to disable cache
|
508
509
|
*/
|
509
510
|
const char *settings_location; /**< The location where Spotify will write setting files and per-user
|
510
|
-
* cache items. This includes playlists, track metadata, etc
|
511
|
+
* cache items. This includes playlists, track metadata, etc.
|
512
|
+
* 'settings_location' may be the same path as 'cache_location'.
|
513
|
+
* 'settings_location' folder will not be created (unlike 'cache_location'),
|
514
|
+
* if you don't want to create the folder yourself, you can set 'settings_location' to 'cache_location'.
|
511
515
|
*/
|
512
516
|
const void *application_key; ///< Your application key
|
513
517
|
size_t application_key_size; ///< The size of the application key in bytes
|
@@ -525,7 +529,7 @@ typedef struct sp_session_config {
|
|
525
529
|
|
526
530
|
/**
|
527
531
|
* Don't save metadata for local copies of playlists
|
528
|
-
* Reduces disk space usage at the
|
532
|
+
* Reduces disk space usage at the expense of needing
|
529
533
|
* to request metadata from Spotify backend when loading list
|
530
534
|
*/
|
531
535
|
bool dont_save_metadata_for_playlists;
|
@@ -540,6 +544,7 @@ typedef struct sp_session_config {
|
|
540
544
|
/**
|
541
545
|
* Initialize a session. The session returned will be initialized, but you will need
|
542
546
|
* to log in before you can perform any other operation
|
547
|
+
* Currently it is not supported to have multiple active sessions, and it's recommended to only call this once per process.
|
543
548
|
*
|
544
549
|
* Here is a snippet from \c spshell.c:
|
545
550
|
* @dontinclude spshell.c
|
@@ -565,21 +570,65 @@ SP_LIBEXPORT(sp_error) sp_session_create(const sp_session_config *config, sp_ses
|
|
565
570
|
*/
|
566
571
|
SP_LIBEXPORT(void) sp_session_release(sp_session *sess);
|
567
572
|
|
573
|
+
|
568
574
|
/**
|
569
|
-
* Logs in the specified username/password combo. This initiates the
|
575
|
+
* Logs in the specified username/password combo. This initiates the login in the background.
|
570
576
|
* A callback is called when login is complete
|
571
577
|
*
|
578
|
+
* An application MUST NEVER store the user's password in clear text.
|
579
|
+
* If automatic relogin is required, use sp_session_relogin()
|
580
|
+
*
|
572
581
|
* Here is a snippet from \c spshell.c:
|
573
582
|
* @dontinclude spshell.c
|
574
583
|
* @skip sp_session_login
|
575
584
|
* @until }
|
576
585
|
*
|
577
|
-
* @param[in] session
|
578
|
-
* @param[in] username
|
579
|
-
* @param[in] password
|
586
|
+
* @param[in] session Your session object
|
587
|
+
* @param[in] username The username to log in
|
588
|
+
* @param[in] password The password for the specified username
|
589
|
+
* @param[in] remember_me If set, the username / password will be remembered by libspotify
|
590
|
+
*
|
591
|
+
*/
|
592
|
+
SP_LIBEXPORT(void) sp_session_login(sp_session *session, const char *username, const char *password, bool remember_me);
|
593
|
+
|
594
|
+
|
595
|
+
/**
|
596
|
+
* Log in the remembered user if last user that logged in logged in with remember_me set.
|
597
|
+
* If no credentials are stored, this will return SP_ERROR_NO_CREDENTIALS.
|
598
|
+
*
|
599
|
+
* @param[in] session Your session object
|
600
|
+
*
|
601
|
+
* @return One of the following errors, from ::sp_error
|
602
|
+
* SP_ERROR_OK
|
603
|
+
* SP_ERROR_NO_CREDENTIALS
|
604
|
+
*/
|
605
|
+
SP_LIBEXPORT(sp_error) sp_session_relogin(sp_session *session);
|
606
|
+
|
607
|
+
|
608
|
+
/**
|
609
|
+
* Get username of the user that will be logged in via sp_session_relogin()
|
610
|
+
*
|
611
|
+
* @param[in] session Your session object
|
612
|
+
* @param[out] buffer The buffer to hold the username
|
613
|
+
* @param[in] buffer_size The max size of the buffer that will hold the username.
|
614
|
+
* The resulting string is guaranteed to always be null terminated if
|
615
|
+
* buffer_size > 0
|
580
616
|
*
|
617
|
+
* @return The number of characters in the username.
|
618
|
+
* If value is greater or equal than \p buffer_size, output was truncated.
|
619
|
+
* If returned value is -1 no credentials are stored in libspotify.
|
581
620
|
*/
|
582
|
-
SP_LIBEXPORT(
|
621
|
+
SP_LIBEXPORT(int) sp_session_remembered_user(sp_session *session, char *buffer, size_t buffer_size);
|
622
|
+
|
623
|
+
|
624
|
+
/**
|
625
|
+
* Remove stored credentials in libspotify. If no credentials are currently stored, nothing will happen.
|
626
|
+
*
|
627
|
+
* @param[in] session Your session object
|
628
|
+
*
|
629
|
+
*/
|
630
|
+
SP_LIBEXPORT(void) sp_session_forget_me(sp_session *session);
|
631
|
+
|
583
632
|
|
584
633
|
/**
|
585
634
|
* Fetches the currently logged in user
|
@@ -716,7 +765,7 @@ SP_LIBEXPORT(sp_playlistcontainer *) sp_session_playlistcontainer(sp_session *se
|
|
716
765
|
*
|
717
766
|
* @param[in] session Session object
|
718
767
|
*
|
719
|
-
* @return A playlist
|
768
|
+
* @return A playlist or NULL if no user is logged in
|
720
769
|
* @note You need to release the playlist when you are done with it.
|
721
770
|
* @see sp_playlist_release()
|
722
771
|
*/
|
@@ -727,7 +776,7 @@ SP_LIBEXPORT(sp_playlist *) sp_session_inbox_create(sp_session *session);
|
|
727
776
|
*
|
728
777
|
* @param[in] session Session object
|
729
778
|
*
|
730
|
-
* @return A playlist
|
779
|
+
* @return A playlist or NULL if no user is logged in
|
731
780
|
* @note You need to release the playlist when you are done with it.
|
732
781
|
* @see sp_playlist_release()
|
733
782
|
*/
|
@@ -739,7 +788,7 @@ SP_LIBEXPORT(sp_playlist *) sp_session_starred_create(sp_session *session);
|
|
739
788
|
* @param[in] session Session object
|
740
789
|
* @param[in] canonical_username Canonical username
|
741
790
|
*
|
742
|
-
* @return A playlist
|
791
|
+
* @return A playlist or NULL if no user is logged in
|
743
792
|
* @note You need to release the playlist when you are done with it.
|
744
793
|
* @see sp_playlist_release()
|
745
794
|
*/
|
@@ -755,7 +804,7 @@ SP_LIBEXPORT(sp_playlist *) sp_session_starred_for_user_create(sp_session *sessi
|
|
755
804
|
* @param[in] session Your session object.
|
756
805
|
* @param[in] canonical_username The canonical username, or NULL.
|
757
806
|
*
|
758
|
-
* @return Playlist container object, NULL if not logged in
|
807
|
+
* @return Playlist container object, NULL if not logged in.
|
759
808
|
*/
|
760
809
|
SP_LIBEXPORT(sp_playlistcontainer *) sp_session_publishedcontainer_for_user_create(sp_session *session, const char *canonical_username);
|
761
810
|
|
@@ -856,8 +905,21 @@ SP_LIBEXPORT(int) sp_offline_num_playlists(sp_session *session);
|
|
856
905
|
* @param[in] session Session object
|
857
906
|
* @param[out] status Status object that will be filled with info
|
858
907
|
*
|
908
|
+
* @return false if no synching is in progress (in which case the contents
|
909
|
+
* of status is undefined)
|
910
|
+
*
|
911
|
+
*/
|
912
|
+
SP_LIBEXPORT(bool) sp_offline_sync_get_status(sp_session *session, sp_offline_sync_status *status);
|
913
|
+
|
914
|
+
/**
|
915
|
+
* Return remaining time (in seconds) until the offline key store expires
|
916
|
+
* and the user is required to relogin
|
917
|
+
*
|
918
|
+
* @param[in] session Session object
|
919
|
+
* @return Seconds until expiration
|
920
|
+
*
|
859
921
|
*/
|
860
|
-
SP_LIBEXPORT(
|
922
|
+
SP_LIBEXPORT(int) sp_offline_time_left(sp_session *session);
|
861
923
|
|
862
924
|
/**
|
863
925
|
* Get currently logged in users country
|
@@ -961,6 +1023,20 @@ SP_LIBEXPORT(sp_link *) sp_link_create_from_album_cover(sp_album *album);
|
|
961
1023
|
*/
|
962
1024
|
SP_LIBEXPORT(sp_link *) sp_link_create_from_artist(sp_artist *artist);
|
963
1025
|
|
1026
|
+
/**
|
1027
|
+
* Creates a link object pointing to an artist portrait
|
1028
|
+
*
|
1029
|
+
* @param[in] artist Artist browse object
|
1030
|
+
*
|
1031
|
+
* @return A link object representing an image
|
1032
|
+
*
|
1033
|
+
* @note You need to release the link when you are done with it.
|
1034
|
+
* @see sp_link_release()
|
1035
|
+
* @see sp_artistbrowse_num_portraits()
|
1036
|
+
*/
|
1037
|
+
SP_LIBEXPORT(sp_link *) sp_link_create_from_artist_portrait(sp_artist *artist);
|
1038
|
+
|
1039
|
+
|
964
1040
|
/**
|
965
1041
|
* Creates a link object from an artist portrait
|
966
1042
|
*
|
@@ -972,8 +1048,13 @@ SP_LIBEXPORT(sp_link *) sp_link_create_from_artist(sp_artist *artist);
|
|
972
1048
|
* @note You need to release the link when you are done with it.
|
973
1049
|
* @see sp_link_release()
|
974
1050
|
* @see sp_artistbrowse_num_portraits()
|
1051
|
+
*
|
1052
|
+
* @note The difference from sp_link_create_from_artist_portrait() is
|
1053
|
+
* that the artist browse object may contain multiple portraits.
|
1054
|
+
*
|
975
1055
|
*/
|
976
|
-
SP_LIBEXPORT(sp_link *)
|
1056
|
+
SP_LIBEXPORT(sp_link *) sp_link_create_from_artistbrowse_portrait(sp_artistbrowse *arb, int index);
|
1057
|
+
|
977
1058
|
|
978
1059
|
/**
|
979
1060
|
* Generate a link object representing the current search
|
@@ -1065,7 +1146,7 @@ SP_LIBEXPORT(sp_track *) sp_link_as_track(sp_link *link);
|
|
1065
1146
|
* The track and offset into track representation for the given link
|
1066
1147
|
*
|
1067
1148
|
* @param[in] link The Spotify link whose track you are interested in
|
1068
|
-
* @param[out] offset Pointer to offset into track (in
|
1149
|
+
* @param[out] offset Pointer to offset into track (in milliseconds). If the link
|
1069
1150
|
* does not contain an offset this will be set to 0.
|
1070
1151
|
*
|
1071
1152
|
* @return The track representation of the given track link
|
@@ -1135,7 +1216,7 @@ SP_LIBEXPORT(void) sp_link_release(sp_link *link);
|
|
1135
1216
|
*
|
1136
1217
|
* @return True if track is loaded
|
1137
1218
|
*
|
1138
|
-
* @note This is
|
1219
|
+
* @note This is equivalent to checking if sp_track_error() not returns SP_ERROR_IS_LOADING.
|
1139
1220
|
*/
|
1140
1221
|
SP_LIBEXPORT(bool) sp_track_is_loaded(sp_track *track);
|
1141
1222
|
|
@@ -1214,7 +1295,7 @@ SP_LIBEXPORT(bool) sp_track_is_starred(sp_session *session, sp_track *track);
|
|
1214
1295
|
* @note This will fail silently if playlists are disabled.
|
1215
1296
|
* @see sp_set_playlists_enabled()
|
1216
1297
|
*/
|
1217
|
-
SP_LIBEXPORT(void) sp_track_set_starred(sp_session *session,
|
1298
|
+
SP_LIBEXPORT(void) sp_track_set_starred(sp_session *session, sp_track *const*tracks, int num_tracks, bool star);
|
1218
1299
|
|
1219
1300
|
/**
|
1220
1301
|
* The number of artists performing on the specified track
|
@@ -1274,7 +1355,7 @@ SP_LIBEXPORT(int) sp_track_duration(sp_track *track);
|
|
1274
1355
|
*
|
1275
1356
|
* @param[in] track A track object
|
1276
1357
|
*
|
1277
|
-
* @return Popularity in range 0 to 100, 0 if undefined
|
1358
|
+
* @return Popularity in range 0 to 100, 0 if undefined.
|
1278
1359
|
* If no metadata is available for the track yet, this function returns 0.
|
1279
1360
|
*/
|
1280
1361
|
SP_LIBEXPORT(int) sp_track_popularity(sp_track *track);
|
@@ -1960,7 +2041,7 @@ SP_LIBEXPORT(void) sp_image_release(sp_image *image);
|
|
1960
2041
|
|
1961
2042
|
|
1962
2043
|
/**
|
1963
|
-
* @defgroup search Search
|
2044
|
+
* @defgroup search Search subsystem
|
1964
2045
|
* @{
|
1965
2046
|
*/
|
1966
2047
|
|
@@ -2501,7 +2582,7 @@ SP_LIBEXPORT(bool) sp_playlist_is_collaborative(sp_playlist *playlist);
|
|
2501
2582
|
/**
|
2502
2583
|
* Set collaborative status for a playlist.
|
2503
2584
|
*
|
2504
|
-
* A playlist in collaborative state can be
|
2585
|
+
* A playlist in collaborative state can be modified by all users, not only the user owning the list
|
2505
2586
|
*
|
2506
2587
|
* @param[in] playlist Playlist object
|
2507
2588
|
* @param[in] collaborative True or false
|
@@ -2570,7 +2651,7 @@ SP_LIBEXPORT(bool) sp_playlist_has_pending_changes(sp_playlist *playlist);
|
|
2570
2651
|
* SP_ERROR_INVALID_INDATA - position is > current playlist length
|
2571
2652
|
* SP_ERROR_PERMISSION_DENIED
|
2572
2653
|
*/
|
2573
|
-
SP_LIBEXPORT(sp_error) sp_playlist_add_tracks(sp_playlist *playlist,
|
2654
|
+
SP_LIBEXPORT(sp_error) sp_playlist_add_tracks(sp_playlist *playlist, sp_track *const*tracks, int num_tracks, int position, sp_session *session);
|
2574
2655
|
|
2575
2656
|
/**
|
2576
2657
|
* Remove tracks from a playlist
|
@@ -2667,7 +2748,7 @@ SP_LIBEXPORT(void) sp_playlist_update_subscribers(sp_session *session, sp_playli
|
|
2667
2748
|
* There is one caveat tough: If libspotify has never seen the
|
2668
2749
|
* playlist before this metadata will also be unset.
|
2669
2750
|
* In order for libspotify to get the metadata the playlist
|
2670
|
-
* needs to be loaded
|
2751
|
+
* needs to be loaded at least once.
|
2671
2752
|
* In order words, if libspotify starts with an empty playlist
|
2672
2753
|
* cache and the application has set 'initially_unload_playlists'
|
2673
2754
|
* config parameter to True all playlists will be empty.
|
@@ -2705,7 +2786,8 @@ SP_LIBEXPORT(void) sp_playlist_set_in_ram(sp_session *session, sp_playlist *play
|
|
2705
2786
|
SP_LIBEXPORT(sp_playlist *) sp_playlist_create(sp_session *session, sp_link *link);
|
2706
2787
|
|
2707
2788
|
/**
|
2708
|
-
* Mark a playlist to be synchronized for offline playback
|
2789
|
+
* Mark a playlist to be synchronized for offline playback.
|
2790
|
+
* The playlist must be in the users playlistcontainer
|
2709
2791
|
*
|
2710
2792
|
* @param[in] session Session object
|
2711
2793
|
* @param[in] playlist Playlist object
|
@@ -2734,6 +2816,7 @@ SP_LIBEXPORT(sp_playlist_offline_status) sp_playlist_get_offline_status(sp_sessi
|
|
2734
2816
|
* @param[in] playlist Playlist object
|
2735
2817
|
*
|
2736
2818
|
* @return Value from 0 - 100 that indicates amount of playlist that is downloaded
|
2819
|
+
* or 0 if the playlist is not in the SP_PLAYLIST_OFFLINE_STATUS_DOWNLOADING mode.
|
2737
2820
|
*
|
2738
2821
|
* @see sp_playlist_offline_status()
|
2739
2822
|
*/
|
@@ -2812,7 +2895,7 @@ typedef struct sp_playlistcontainer_callbacks {
|
|
2812
2895
|
* @param[in] callbacks Callbacks, see sp_playlistcontainer_callbacks
|
2813
2896
|
* @param[in] userdata Opaque value passed to callbacks.
|
2814
2897
|
*
|
2815
|
-
* @note Every sp_playlistcontainer_add_callbacks() needs to be
|
2898
|
+
* @note Every sp_playlistcontainer_add_callbacks() needs to be paired with a corresponding
|
2816
2899
|
* sp_playlistcontainer_remove_callbacks() that is invoked before releasing the
|
2817
2900
|
* last reference you own for the container. In other words, you must make sure
|
2818
2901
|
* to have removed all the callbacks before the container gets destroyed.
|
@@ -2863,7 +2946,7 @@ SP_LIBEXPORT(bool) sp_playlistcontainer_is_loaded(sp_playlistcontainer *pc);
|
|
2863
2946
|
* @param[in] pc Playlist container
|
2864
2947
|
* @param[in] index Index in playlist container. Should be in the interval [0, sp_playlistcontainer_num_playlists() - 1]
|
2865
2948
|
*
|
2866
|
-
* @return
|
2949
|
+
* @return The playlist object
|
2867
2950
|
*
|
2868
2951
|
* @sa sp_session_playlistcontainer()
|
2869
2952
|
*/
|
@@ -2885,11 +2968,12 @@ SP_LIBEXPORT(sp_playlist_type) sp_playlistcontainer_playlist_type(sp_playlistcon
|
|
2885
2968
|
* Return the folder name at @a index
|
2886
2969
|
*
|
2887
2970
|
* @param[in] pc Playlist container
|
2888
|
-
* @param[in] index Index in playlist container. Should be in the interval [0, sp_playlistcontainer_num_playlists() - 1]
|
2971
|
+
* @param[in] index Index in playlist container. Should be in the interval [0, sp_playlistcontainer_num_playlists() - 1].
|
2972
|
+
* Index should point at a start-folder entry, otherwise the empty string is written to buffer.
|
2889
2973
|
* @param[in] buffer Pointer to char[] where to store folder name
|
2890
2974
|
* @param[in] buffer_size Size of array
|
2891
2975
|
*
|
2892
|
-
* @return
|
2976
|
+
* @return One of the following errors, from ::sp_error
|
2893
2977
|
* SP_ERROR_OK
|
2894
2978
|
* SP_ERROR_INDEX_OUT_OF_RANGE
|
2895
2979
|
*
|
@@ -2903,7 +2987,7 @@ SP_LIBEXPORT(sp_error) sp_playlistcontainer_playlist_folder_name(sp_playlistcont
|
|
2903
2987
|
* @param[in] pc Playlist container
|
2904
2988
|
* @param[in] index Index in playlist container. Should be in the interval [0, sp_playlistcontainer_num_playlists() - 1]
|
2905
2989
|
*
|
2906
|
-
* @return The group ID
|
2990
|
+
* @return The group ID of the folder. Returns 0 on index out of range, pc being NULL or indexed item not being a folder
|
2907
2991
|
*
|
2908
2992
|
* @sa sp_session_playlistcontainer()
|
2909
2993
|
*/
|
@@ -3122,7 +3206,7 @@ typedef enum {
|
|
3122
3206
|
* country codes (in uppercase) encoded in an integer. There are also some reserved
|
3123
3207
|
* codes used to denote non-country regions. See sp_toplistregion
|
3124
3208
|
*
|
3125
|
-
* Example: SP_TOPLIST_REGION('S', 'E')
|
3209
|
+
* Example: SP_TOPLIST_REGION('S', 'E') for Sweden
|
3126
3210
|
*/
|
3127
3211
|
#define SP_TOPLIST_REGION(a, b) ((a) << 8 | (b))
|
3128
3212
|
|
@@ -3270,7 +3354,7 @@ SP_LIBEXPORT(sp_track *) sp_toplistbrowse_track(sp_toplistbrowse *tlb, int index
|
|
3270
3354
|
/** @} */
|
3271
3355
|
|
3272
3356
|
/**
|
3273
|
-
* @defgroup inbox Inbox
|
3357
|
+
* @defgroup inbox Inbox subsystem
|
3274
3358
|
* @{
|
3275
3359
|
*/
|
3276
3360
|
|
@@ -3291,7 +3375,7 @@ typedef void SP_CALLCONV inboxpost_complete_cb(sp_inbox *result, void *userdata)
|
|
3291
3375
|
*
|
3292
3376
|
* @param[in] session Session object
|
3293
3377
|
* @param[in] user Canonical username of recipient
|
3294
|
-
* @param[in] tracks Array of
|
3378
|
+
* @param[in] tracks Array of tracks to post
|
3295
3379
|
* @param[in] num_tracks Number of tracks in \p tracks
|
3296
3380
|
* @param[in] message Message to attach to tracks. UTF-8
|
3297
3381
|
* @param[in] callback Callback to be invoked when the request has completed
|
@@ -3334,6 +3418,14 @@ SP_LIBEXPORT(void) sp_inbox_release(sp_inbox *inbox);
|
|
3334
3418
|
|
3335
3419
|
/** @} */
|
3336
3420
|
|
3421
|
+
/**
|
3422
|
+
* Return the libspotify build ID
|
3423
|
+
*
|
3424
|
+
* This might be useful to have available for display somewhere in your
|
3425
|
+
* user interface.
|
3426
|
+
*/
|
3427
|
+
SP_LIBEXPORT(const char *) sp_build_id(void);
|
3428
|
+
|
3337
3429
|
|
3338
3430
|
#ifdef __cplusplus
|
3339
3431
|
}
|
File without changes
|
File without changes
|
File without changes
|
@@ -2,6 +2,11 @@
|
|
2
2
|
|
3
3
|
/*** Spotify API ***/
|
4
4
|
|
5
|
+
const char * sp_build_id(void)
|
6
|
+
{
|
7
|
+
return "9.1.32.g8edbd53c Release (Core: 0.5.3.425.g18537e22)";
|
8
|
+
}
|
9
|
+
|
5
10
|
sp_error
|
6
11
|
sp_session_create(const sp_session_config * config, sp_session ** sess)
|
7
12
|
{
|
@@ -52,9 +57,13 @@ sp_session_userdata(sp_session *session)
|
|
52
57
|
}
|
53
58
|
|
54
59
|
void
|
55
|
-
sp_session_login(sp_session *session, const char *username, const char *password)
|
60
|
+
sp_session_login(sp_session *session, const char *username, const char *password, bool remember_me)
|
56
61
|
{
|
57
62
|
session->connectionstate = SP_CONNECTION_STATE_LOGGED_IN;
|
63
|
+
if (remember_me)
|
64
|
+
{
|
65
|
+
my_strncpy(session->username, username, 1024);
|
66
|
+
}
|
58
67
|
}
|
59
68
|
|
60
69
|
void
|
@@ -126,12 +126,14 @@ sp_track_is_starred(sp_session *s, sp_track *t)
|
|
126
126
|
}
|
127
127
|
|
128
128
|
void
|
129
|
-
sp_track_set_starred(sp_session *s,
|
129
|
+
sp_track_set_starred(sp_session *s, sp_track *const*tracks, int num_tracks, bool starred)
|
130
130
|
{
|
131
131
|
int i;
|
132
132
|
|
133
|
-
for (i = 0; i <
|
134
|
-
|
133
|
+
for (i = 0; i < num_tracks; i++)
|
134
|
+
{
|
135
|
+
tracks[i]->starred = starred;
|
136
|
+
}
|
135
137
|
}
|
136
138
|
|
137
139
|
void
|
File without changes
|
data/lib/mockspotify.rb
CHANGED
@@ -6,7 +6,7 @@ module Spotify
|
|
6
6
|
module Mock
|
7
7
|
# @return [String] path to the libmockspotify C extension binary.
|
8
8
|
def self.path
|
9
|
-
File.expand_path('../../
|
9
|
+
File.expand_path('../../ext/libmockspotify.', __FILE__) << Config::MAKEFILE_CONFIG['DLEXT']
|
10
10
|
end
|
11
11
|
|
12
12
|
# Overridden to always ffi_lib the mock path.
|
@@ -26,7 +26,8 @@ module Spotify
|
|
26
26
|
extend Mock
|
27
27
|
require 'spotify'
|
28
28
|
|
29
|
-
$VERBOSE = true
|
29
|
+
old_verbose, $VERBOSE = $VERBOSE, true
|
30
|
+
|
30
31
|
attach_function :mock_user, :mocksp_user_create, [:string, :string, :string, :string, :relation_type, :bool], :user
|
31
32
|
attach_function :mock_track, :mocksp_track_create, [:string, :int, :array, :pointer, :int, :int, :int, :int, :error, :bool], :track
|
32
33
|
attach_function :mock_image, :mocksp_image_create, [:image_id, :imageformat, :size_t, :buffer_in, :error], :image
|
@@ -36,5 +37,6 @@ module Spotify
|
|
36
37
|
attach_function :mock_artistbrowse, :mocksp_artistbrowse_create, [:artist, :bool], :artistbrowse
|
37
38
|
|
38
39
|
attach_function :mock_playlist_event, :mocksp_playlist_event, [:int, :playlist], :void
|
39
|
-
|
40
|
+
|
41
|
+
$VERBOSE = old_verbose
|
40
42
|
end
|
data/lib/mockspotify/version.rb
CHANGED
data/mockspotify.gemspec
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
2
|
+
libpath = File.expand_path('../lib', __FILE__)
|
3
|
+
$:.unshift libpath unless $:.include?(libpath)
|
4
|
+
require 'mockspotify/version'
|
3
5
|
|
4
6
|
Gem::Specification.new do |gem|
|
5
7
|
gem.name = "mockspotify"
|
6
|
-
gem.summary = %Q{
|
7
|
-
gem.homepage = "https://github.com/Burgestrand/
|
8
|
+
gem.summary = %Q{FFI bindings to the mockspotify C library}
|
9
|
+
gem.homepage = "https://github.com/Burgestrand/mockspotify"
|
8
10
|
gem.authors = ["Kim Burgestrand"]
|
9
11
|
gem.email = 'kim@burgestrand.se'
|
10
12
|
|
11
13
|
gem.files = `git ls-files`.split("\n")
|
14
|
+
gem.files += `cd ext/libmockspotify && git ls-files src/`.split("\n").map { |path| "ext/libmockspotify/#{path}" }
|
12
15
|
gem.executables = []
|
13
|
-
gem.require_paths = ["lib"
|
14
|
-
gem.extensions << '
|
16
|
+
gem.require_paths = ["lib"]
|
17
|
+
gem.extensions << 'ext/extconf.rb'
|
15
18
|
|
16
19
|
gem.add_dependency 'spotify'
|
17
20
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mockspotify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-09-02 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: spotify
|
16
|
-
requirement: &
|
16
|
+
requirement: &2157780240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,50 +21,46 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2157780240
|
25
25
|
description:
|
26
26
|
email: kim@burgestrand.se
|
27
27
|
executables: []
|
28
28
|
extensions:
|
29
|
-
-
|
29
|
+
- ext/extconf.rb
|
30
30
|
extra_rdoc_files: []
|
31
31
|
files:
|
32
32
|
- .gitignore
|
33
|
+
- .gitmodules
|
33
34
|
- Gemfile
|
34
|
-
- Makefile.am
|
35
|
-
- README.rst
|
36
35
|
- Rakefile
|
37
|
-
-
|
38
|
-
- configure.ac
|
36
|
+
- ext/extconf.rb
|
39
37
|
- lib/mockspotify.rb
|
40
38
|
- lib/mockspotify/version.rb
|
41
39
|
- mockspotify.gemspec
|
42
|
-
- src/Makefile.am
|
43
|
-
- src/album.c
|
44
|
-
- src/albumbrowse.c
|
45
|
-
- src/artist.c
|
46
|
-
- src/artistbrowse.c
|
47
|
-
- src/error.c
|
48
|
-
- src/extconf.rb
|
49
|
-
- src/image.c
|
50
|
-
- src/libmockspotify.h
|
51
|
-
- src/libspotify/api.h
|
52
|
-
- src/link.c
|
53
|
-
- src/playlist.c
|
54
|
-
- src/search.c
|
55
|
-
- src/session.c
|
56
|
-
- src/track.c
|
57
|
-
- src/user.c
|
58
|
-
- src/util.c
|
59
|
-
- src/util.h
|
60
40
|
- test/mockspotify_spec.rb
|
61
|
-
|
41
|
+
- ext/libmockspotify/src/Makefile.am
|
42
|
+
- ext/libmockspotify/src/album.c
|
43
|
+
- ext/libmockspotify/src/albumbrowse.c
|
44
|
+
- ext/libmockspotify/src/artist.c
|
45
|
+
- ext/libmockspotify/src/artistbrowse.c
|
46
|
+
- ext/libmockspotify/src/error.c
|
47
|
+
- ext/libmockspotify/src/image.c
|
48
|
+
- ext/libmockspotify/src/libmockspotify.h
|
49
|
+
- ext/libmockspotify/src/libspotify/api.h
|
50
|
+
- ext/libmockspotify/src/link.c
|
51
|
+
- ext/libmockspotify/src/playlist.c
|
52
|
+
- ext/libmockspotify/src/search.c
|
53
|
+
- ext/libmockspotify/src/session.c
|
54
|
+
- ext/libmockspotify/src/track.c
|
55
|
+
- ext/libmockspotify/src/user.c
|
56
|
+
- ext/libmockspotify/src/util.c
|
57
|
+
- ext/libmockspotify/src/util.h
|
58
|
+
homepage: https://github.com/Burgestrand/mockspotify
|
62
59
|
licenses: []
|
63
60
|
post_install_message:
|
64
61
|
rdoc_options: []
|
65
62
|
require_paths:
|
66
63
|
- lib
|
67
|
-
- src
|
68
64
|
required_ruby_version: !ruby/object:Gem::Requirement
|
69
65
|
none: false
|
70
66
|
requirements:
|
@@ -79,8 +75,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
75
|
version: '0'
|
80
76
|
requirements: []
|
81
77
|
rubyforge_project:
|
82
|
-
rubygems_version: 1.8.
|
78
|
+
rubygems_version: 1.8.6
|
83
79
|
signing_key:
|
84
80
|
specification_version: 3
|
85
|
-
summary:
|
81
|
+
summary: FFI bindings to the mockspotify C library
|
86
82
|
test_files: []
|
data/Makefile.am
DELETED
data/README.rst
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
libmockspotify
|
2
|
-
==============
|
3
|
-
|
4
|
-
A mock of libspotify for use in development of language bindings.
|
5
|
-
|
6
|
-
This project was started in July 2011 with the goal of splitting out
|
7
|
-
pyspotify's mock of libspotify, so that it could be reused by the developers of
|
8
|
-
the Node.js and Ruby bindings for libspotify.
|
9
|
-
|
10
|
-
Coordination of the development efforts happens on GitHub and #spotify on
|
11
|
-
Freenode.
|
12
|
-
|
13
|
-
Note about my fork
|
14
|
-
------------------
|
15
|
-
To ease usage in my own development, I’ve turned this project into a
|
16
|
-
Ruby gem. This allows you to install it as a gem, and also allows you
|
17
|
-
to retrieve the path to the compiled binary.
|
18
|
-
|
19
|
-
Installing it as a gem:
|
20
|
-
|
21
|
-
::
|
22
|
-
|
23
|
-
gem install mockspotify
|
24
|
-
|
25
|
-
Using its’ API (one method):
|
26
|
-
|
27
|
-
::
|
28
|
-
|
29
|
-
require 'mockspotify'
|
30
|
-
MockSpotify.lib_path # => path/to/gem/src/libmockspotify.extension
|
31
|
-
|
32
|
-
You can then use this to bind this library using Ruby FFI:
|
33
|
-
|
34
|
-
::
|
35
|
-
|
36
|
-
require 'ffi'
|
37
|
-
require 'mockspotify'
|
38
|
-
|
39
|
-
module Spotify
|
40
|
-
extend FFI::Library
|
41
|
-
ffi_lib MockSpotify.lib_path
|
42
|
-
|
43
|
-
attach_function …, etc
|
44
|
-
end
|
45
|
-
|
46
|
-
Manual compilation
|
47
|
-
------------------
|
48
|
-
If you ever want to do it, here you go:
|
49
|
-
|
50
|
-
::
|
51
|
-
|
52
|
-
$ ./autogen.sh
|
53
|
-
$ ./configure
|
54
|
-
$ make
|
55
|
-
# make install
|
data/autogen.sh
DELETED
data/configure.ac
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
AC_INIT([libmockspotify], [0.1], [http://github.com/mopidy/libmockspotify])
|
2
|
-
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
|
3
|
-
|
4
|
-
AC_PROG_CC
|
5
|
-
AC_PROG_LIBTOOL
|
6
|
-
|
7
|
-
AC_CONFIG_MACRO_DIR([m4])
|
8
|
-
AC_CONFIG_HEADERS([config.h])
|
9
|
-
AC_CONFIG_FILES([Makefile src/Makefile])
|
10
|
-
AC_OUTPUT
|