spotify 10.2.0 → 10.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +4 -0
- data/CHANGELOG.md +5 -0
- data/Rakefile +12 -3
- data/lib/spotify.rb +60 -35
- data/lib/spotify/version.rb +1 -1
- data/spec/spotify_spec.rb +42 -9
- data/spotify.gemspec +0 -2
- metadata +13 -34
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
[v10.2.1][]
|
2
|
+
-----------
|
3
|
+
- make all strings (both input and output) be in UTF8
|
4
|
+
|
1
5
|
[v10.2.0][]
|
2
6
|
-----------
|
3
7
|
- make :sampletypes an array of *actual* FFI types that can be read
|
@@ -77,6 +81,7 @@ v0.0.0
|
|
77
81
|
------
|
78
82
|
- release to register rubygems.org name
|
79
83
|
|
84
|
+
[v10.2.1]: https://github.com/Burgestrand/libspotify-ruby/compare/v10.2.0...v10.2.1
|
80
85
|
[v10.2.0]: https://github.com/Burgestrand/libspotify-ruby/compare/v10.1.1...v10.2.0
|
81
86
|
[v10.1.1]: https://github.com/Burgestrand/libspotify-ruby/compare/v10.1.0...v10.1.1
|
82
87
|
[v10.1.0]: https://github.com/Burgestrand/libspotify-ruby/compare/v10.0.0...v10.1.0
|
data/Rakefile
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
begin
|
2
|
+
require 'bundler'
|
3
|
+
Bundler::GemHelper.install_tasks
|
4
|
+
rescue LoadError
|
5
|
+
# do not require bundler rake tasks
|
6
|
+
end
|
3
7
|
|
4
8
|
require 'rake/testtask'
|
5
9
|
Rake::TestTask.new do |spec|
|
@@ -9,5 +13,10 @@ end
|
|
9
13
|
require 'yard'
|
10
14
|
YARD::Rake::YardocTask.new
|
11
15
|
|
16
|
+
desc "re-generate spec/api.h.xml"
|
17
|
+
task :gen do
|
18
|
+
sh 'gccxml spec/api.h -fxml=spec/api.h.xml'
|
19
|
+
end
|
20
|
+
|
12
21
|
task :spec => :test
|
13
|
-
task :default => :test
|
22
|
+
task :default => :test
|
data/lib/spotify.rb
CHANGED
@@ -12,6 +12,29 @@ module Spotify
|
|
12
12
|
extend FFI::Library
|
13
13
|
ffi_lib ['libspotify', '/Library/Frameworks/libspotify.framework/libspotify']
|
14
14
|
|
15
|
+
module UTF8String
|
16
|
+
extend FFI::DataConverter
|
17
|
+
native_type FFI::Type::STRING
|
18
|
+
|
19
|
+
# convert a Ruby string of any encoding to UTF-8 string
|
20
|
+
def self.to_native(value, ctx)
|
21
|
+
if value.respond_to?(:encode)
|
22
|
+
value.encode('UTF-8')
|
23
|
+
else
|
24
|
+
value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# converts encoding from native BINARY string to UTF-8
|
29
|
+
def self.from_native(value, ctx)
|
30
|
+
if value.respond_to?(:force_encoding)
|
31
|
+
value.force_encoding('UTF-8')
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
15
38
|
# Override FFI::Library#attach_function to always add the `:blocking` option.
|
16
39
|
#
|
17
40
|
# The reason for this is that which libspotify functions may call callbacks
|
@@ -19,7 +42,7 @@ module Spotify
|
|
19
42
|
def self.attach_function(*arguments, &block)
|
20
43
|
options = arguments.pop if arguments.last.is_a?(Hash)
|
21
44
|
options ||= {}
|
22
|
-
options = { blocking
|
45
|
+
options = { :blocking => true }.merge(options)
|
23
46
|
arguments << options
|
24
47
|
super(*arguments, &block)
|
25
48
|
end
|
@@ -49,6 +72,8 @@ module Spotify
|
|
49
72
|
typedef :pointer, :image_id
|
50
73
|
typedef :pointer, :array
|
51
74
|
|
75
|
+
typedef UTF8String, :utf8_string
|
76
|
+
|
52
77
|
#
|
53
78
|
# Error
|
54
79
|
#
|
@@ -80,13 +105,13 @@ module Spotify
|
|
80
105
|
#
|
81
106
|
# @method $1($3)
|
82
107
|
# @return [$4]
|
83
|
-
attach_function :error_message, :sp_error_message, [ :error ], :
|
108
|
+
attach_function :error_message, :sp_error_message, [ :error ], :utf8_string
|
84
109
|
|
85
110
|
#
|
86
111
|
# Miscellaneous
|
87
112
|
#
|
88
113
|
# These don’t fit anywhere else :(
|
89
|
-
attach_function :build_id, :sp_build_id, [], :
|
114
|
+
attach_function :build_id, :sp_build_id, [], :utf8_string
|
90
115
|
|
91
116
|
#
|
92
117
|
# Audio
|
@@ -128,11 +153,11 @@ module Spotify
|
|
128
153
|
# @attr [callback(:session):void] logged_out
|
129
154
|
# @attr [callback(:session):void] metadata_updated
|
130
155
|
# @attr [callback(:session, :error):void] connection_error
|
131
|
-
# @attr [callback(:session, :
|
156
|
+
# @attr [callback(:session, :utf8_string):void] message_to_user
|
132
157
|
# @attr [callback(:session):void] notify_main_thread
|
133
158
|
# @attr [callback(:session, AudioFormat, :frames, :int):int] music_delivery
|
134
159
|
# @attr [callback(:session):void] play_token_lost
|
135
|
-
# @attr [callback(:session, :
|
160
|
+
# @attr [callback(:session, :utf8_string):void] log_message
|
136
161
|
# @attr [callback(:session):void] end_of_track
|
137
162
|
# @attr [callback(:session, :error):void] streaming_error
|
138
163
|
# @attr [callback(:session):void] userinfo_updated
|
@@ -145,11 +170,11 @@ module Spotify
|
|
145
170
|
:logged_out, callback([ :session ], :void),
|
146
171
|
:metadata_updated, callback([ :session ], :void),
|
147
172
|
:connection_error, callback([ :session, :error ], :void),
|
148
|
-
:message_to_user, callback([ :session, :
|
173
|
+
:message_to_user, callback([ :session, :utf8_string ], :void),
|
149
174
|
:notify_main_thread, callback([ :session ], :void),
|
150
175
|
:music_delivery, callback([ :session, AudioFormat, :frames, :int ], :int),
|
151
176
|
:play_token_lost, callback([ :session ], :void),
|
152
|
-
:log_message, callback([ :session, :
|
177
|
+
:log_message, callback([ :session, :utf8_string ], :void),
|
153
178
|
:end_of_track, callback([ :session ], :void),
|
154
179
|
:streaming_error, callback([ :session, :error ], :void),
|
155
180
|
:userinfo_updated, callback([ :session ], :void),
|
@@ -226,7 +251,7 @@ module Spotify
|
|
226
251
|
attach_function :session_release, :sp_session_release, [ :session ], :void
|
227
252
|
|
228
253
|
attach_function :session_process_events, :sp_session_process_events, [ :session, :buffer_out ], :void
|
229
|
-
attach_function :session_login, :sp_session_login, [ :session, :
|
254
|
+
attach_function :session_login, :sp_session_login, [ :session, :utf8_string, :utf8_string, :bool ], :void
|
230
255
|
attach_function :session_relogin, :sp_session_relogin, [ :session ], :error
|
231
256
|
attach_function :session_forget_me, :sp_session_forget_me, [ :session ], :void
|
232
257
|
attach_function :session_remembered_user, :sp_session_remembered_user, [ :session, :buffer_out, :size_t ], :int
|
@@ -244,8 +269,8 @@ module Spotify
|
|
244
269
|
attach_function :session_playlistcontainer, :sp_session_playlistcontainer, [ :session ], :playlistcontainer
|
245
270
|
attach_function :session_inbox_create, :sp_session_inbox_create, [ :session ], :playlist
|
246
271
|
attach_function :session_starred_create, :sp_session_starred_create, [ :session ], :playlist
|
247
|
-
attach_function :session_starred_for_user_create, :sp_session_starred_for_user_create, [ :session, :
|
248
|
-
attach_function :session_publishedcontainer_for_user_create, :sp_session_publishedcontainer_for_user_create, [ :playlist, :
|
272
|
+
attach_function :session_starred_for_user_create, :sp_session_starred_for_user_create, [ :session, :utf8_string ], :playlist
|
273
|
+
attach_function :session_publishedcontainer_for_user_create, :sp_session_publishedcontainer_for_user_create, [ :playlist, :utf8_string ], :playlistcontainer
|
249
274
|
attach_function :session_preferred_bitrate, :sp_session_preferred_bitrate, [ :session, :bitrate ], :void
|
250
275
|
|
251
276
|
attach_function :session_set_connection_type, :sp_session_set_connection_type, [ :session, :connection_type ], :void
|
@@ -271,7 +296,7 @@ module Spotify
|
|
271
296
|
enum :linktype, [:invalid, :track, :album, :artist, :search,
|
272
297
|
:playlist, :profile, :starred, :localtrack, :image]
|
273
298
|
|
274
|
-
attach_function :link_create_from_string, :sp_link_create_from_string, [ :
|
299
|
+
attach_function :link_create_from_string, :sp_link_create_from_string, [ :utf8_string ], :link
|
275
300
|
attach_function :link_create_from_track, :sp_link_create_from_track, [ :track, :int ], :link
|
276
301
|
attach_function :link_create_from_album, :sp_link_create_from_album, [ :album ], :link
|
277
302
|
attach_function :link_create_from_artist, :sp_link_create_from_artist, [ :artist ], :link
|
@@ -314,7 +339,7 @@ module Spotify
|
|
314
339
|
attach_function :track_num_artists, :sp_track_num_artists, [ :track ], :int
|
315
340
|
attach_function :track_artist, :sp_track_artist, [ :track, :int ], :artist
|
316
341
|
attach_function :track_album, :sp_track_album, [ :track ], :album
|
317
|
-
attach_function :track_name, :sp_track_name, [ :track ], :
|
342
|
+
attach_function :track_name, :sp_track_name, [ :track ], :utf8_string
|
318
343
|
attach_function :track_duration, :sp_track_duration, [ :track ], :int
|
319
344
|
attach_function :track_popularity, :sp_track_popularity, [ :track ], :int
|
320
345
|
attach_function :track_disc, :sp_track_disc, [ :track ], :int
|
@@ -323,7 +348,7 @@ module Spotify
|
|
323
348
|
|
324
349
|
attach_function :track_offline_get_status, :sp_track_offline_get_status, [ :track ], :track_offline_status
|
325
350
|
|
326
|
-
attach_function :localtrack_create, :sp_localtrack_create, [ :
|
351
|
+
attach_function :localtrack_create, :sp_localtrack_create, [ :utf8_string, :utf8_string, :utf8_string, :int ], :track
|
327
352
|
|
328
353
|
attach_function :track_add_ref, :sp_track_add_ref, [ :track ], :void
|
329
354
|
attach_function :track_release, :sp_track_release, [ :track ], :void
|
@@ -340,7 +365,7 @@ module Spotify
|
|
340
365
|
attach_function :album_is_available, :sp_album_is_available, [ :album ], :bool
|
341
366
|
attach_function :album_artist, :sp_album_artist, [ :album ], :artist
|
342
367
|
attach_function :album_cover, :sp_album_cover, [ :album ], :image_id
|
343
|
-
attach_function :album_name, :sp_album_name, [ :album ], :
|
368
|
+
attach_function :album_name, :sp_album_name, [ :album ], :utf8_string
|
344
369
|
attach_function :album_year, :sp_album_year, [ :album ], :int
|
345
370
|
attach_function :album_type, :sp_album_type, [ :album ], :albumtype
|
346
371
|
|
@@ -360,10 +385,10 @@ module Spotify
|
|
360
385
|
attach_function :albumbrowse_album, :sp_albumbrowse_album, [ :albumbrowse ], :album
|
361
386
|
attach_function :albumbrowse_artist, :sp_albumbrowse_artist, [ :albumbrowse ], :artist
|
362
387
|
attach_function :albumbrowse_num_copyrights, :sp_albumbrowse_num_copyrights, [ :albumbrowse ], :int
|
363
|
-
attach_function :albumbrowse_copyright, :sp_albumbrowse_copyright, [ :albumbrowse, :int ], :
|
388
|
+
attach_function :albumbrowse_copyright, :sp_albumbrowse_copyright, [ :albumbrowse, :int ], :utf8_string
|
364
389
|
attach_function :albumbrowse_num_tracks, :sp_albumbrowse_num_tracks, [ :albumbrowse ], :int
|
365
390
|
attach_function :albumbrowse_track, :sp_albumbrowse_track, [ :albumbrowse, :int ], :track
|
366
|
-
attach_function :albumbrowse_review, :sp_albumbrowse_review, [ :albumbrowse ], :
|
391
|
+
attach_function :albumbrowse_review, :sp_albumbrowse_review, [ :albumbrowse ], :utf8_string
|
367
392
|
attach_function :albumbrowse_backend_request_duration, :sp_albumbrowse_backend_request_duration, [ :albumbrowse ], :int
|
368
393
|
|
369
394
|
attach_function :albumbrowse_add_ref, :sp_albumbrowse_add_ref, [ :albumbrowse ], :void
|
@@ -375,7 +400,7 @@ module Spotify
|
|
375
400
|
# @see http://developer.spotify.com/en/libspotify/docs/group__artist.html
|
376
401
|
|
377
402
|
#
|
378
|
-
attach_function :artist_name, :sp_artist_name, [ :artist ], :
|
403
|
+
attach_function :artist_name, :sp_artist_name, [ :artist ], :utf8_string
|
379
404
|
attach_function :artist_is_loaded, :sp_artist_is_loaded, [ :artist ], :bool
|
380
405
|
attach_function :artist_portrait, :sp_artist_portrait, [ :artist ], :image_id
|
381
406
|
|
@@ -403,7 +428,7 @@ module Spotify
|
|
403
428
|
attach_function :artistbrowse_album, :sp_artistbrowse_album, [ :artistbrowse, :int ], :album
|
404
429
|
attach_function :artistbrowse_num_similar_artists, :sp_artistbrowse_num_similar_artists, [ :artistbrowse ], :int
|
405
430
|
attach_function :artistbrowse_similar_artist, :sp_artistbrowse_similar_artist, [ :artistbrowse, :int ], :artist
|
406
|
-
attach_function :artistbrowse_biography, :sp_artistbrowse_biography, [ :artistbrowse ], :
|
431
|
+
attach_function :artistbrowse_biography, :sp_artistbrowse_biography, [ :artistbrowse ], :utf8_string
|
407
432
|
attach_function :artistbrowse_backend_request_duration, :sp_artistbrowse_backend_request_duration, [ :artistbrowse ], :int
|
408
433
|
|
409
434
|
attach_function :artistbrowse_add_ref, :sp_artistbrowse_add_ref, [ :artistbrowse ], :void
|
@@ -459,7 +484,7 @@ module Spotify
|
|
459
484
|
]
|
460
485
|
|
461
486
|
callback :search_complete_cb, [:search, :userdata], :void
|
462
|
-
attach_function :search_create, :sp_search_create, [ :session, :
|
487
|
+
attach_function :search_create, :sp_search_create, [ :session, :utf8_string, :int, :int, :int, :int, :int, :int, :search_complete_cb, :userdata ], :search
|
463
488
|
attach_function :radio_search_create, :sp_radio_search_create, [ :session, :uint, :uint, :radio_genre, :search_complete_cb, :userdata ], :search
|
464
489
|
attach_function :search_is_loaded, :sp_search_is_loaded, [ :search ], :bool
|
465
490
|
attach_function :search_error, :sp_search_error, [ :search ], :error
|
@@ -469,8 +494,8 @@ module Spotify
|
|
469
494
|
attach_function :search_album, :sp_search_album, [ :search, :int ], :album
|
470
495
|
attach_function :search_num_artists, :sp_search_num_artists, [ :search ], :int
|
471
496
|
attach_function :search_artist, :sp_search_artist, [ :search, :int ], :artist
|
472
|
-
attach_function :search_query, :sp_search_query, [ :search ], :
|
473
|
-
attach_function :search_did_you_mean, :sp_search_did_you_mean, [ :search ], :
|
497
|
+
attach_function :search_query, :sp_search_query, [ :search ], :utf8_string
|
498
|
+
attach_function :search_did_you_mean, :sp_search_did_you_mean, [ :search ], :utf8_string
|
474
499
|
attach_function :search_total_tracks, :sp_search_total_tracks, [ :search ], :int
|
475
500
|
attach_function :search_total_albums, :sp_search_total_albums, [ :search ], :int
|
476
501
|
attach_function :search_total_artists, :sp_search_total_artists, [ :search ], :int
|
@@ -494,9 +519,9 @@ module Spotify
|
|
494
519
|
# @attr [callback(:playlist, :userdata):void] playlist_metadata_updated
|
495
520
|
# @attr [callback(:playlist, :int, :user, :int, :userdata):void] track_created_changed
|
496
521
|
# @attr [callback(:playlist, :int, :bool, :userdata):void] track_seen_changed
|
497
|
-
# @attr [callback(:playlist, :
|
522
|
+
# @attr [callback(:playlist, :utf8_string, :userdata):void] description_changed
|
498
523
|
# @attr [callback(:playlist, :image_id, :userdata):void] image_changed
|
499
|
-
# @attr [callback(:playlist, :int, :
|
524
|
+
# @attr [callback(:playlist, :int, :utf8_string, :userdata):void] track_message_changed
|
500
525
|
# @attr [callback(:playlist, :userdata):void] subscribers_changed
|
501
526
|
class PlaylistCallbacks < FFI::Struct
|
502
527
|
layout :tracks_added, callback([ :playlist, :array, :int, :int, :userdata ], :void),
|
@@ -508,9 +533,9 @@ module Spotify
|
|
508
533
|
:playlist_metadata_updated, callback([ :playlist, :userdata ], :void),
|
509
534
|
:track_created_changed, callback([ :playlist, :int, :user, :int, :userdata ], :void),
|
510
535
|
:track_seen_changed, callback([ :playlist, :int, :bool, :userdata ], :void),
|
511
|
-
:description_changed, callback([ :playlist, :
|
536
|
+
:description_changed, callback([ :playlist, :utf8_string, :userdata ], :void),
|
512
537
|
:image_changed, callback([ :playlist, :image_id, :userdata ], :void),
|
513
|
-
:track_message_changed, callback([ :playlist, :int, :
|
538
|
+
:track_message_changed, callback([ :playlist, :int, :utf8_string, :userdata ], :void),
|
514
539
|
:subscribers_changed, callback([ :playlist, :userdata ], :void)
|
515
540
|
end
|
516
541
|
|
@@ -551,14 +576,14 @@ module Spotify
|
|
551
576
|
attach_function :playlist_track_creator, :sp_playlist_track_creator, [ :playlist, :int ], :user
|
552
577
|
attach_function :playlist_track_seen, :sp_playlist_track_seen, [ :playlist, :int ], :bool
|
553
578
|
attach_function :playlist_track_set_seen, :sp_playlist_track_set_seen, [ :playlist, :int, :bool ], :error
|
554
|
-
attach_function :playlist_track_message, :sp_playlist_track_message, [ :playlist, :int ], :
|
555
|
-
attach_function :playlist_name, :sp_playlist_name, [ :playlist ], :
|
556
|
-
attach_function :playlist_rename, :sp_playlist_rename, [ :playlist, :
|
579
|
+
attach_function :playlist_track_message, :sp_playlist_track_message, [ :playlist, :int ], :utf8_string
|
580
|
+
attach_function :playlist_name, :sp_playlist_name, [ :playlist ], :utf8_string
|
581
|
+
attach_function :playlist_rename, :sp_playlist_rename, [ :playlist, :utf8_string ], :error
|
557
582
|
attach_function :playlist_owner, :sp_playlist_owner, [ :playlist ], :user
|
558
583
|
attach_function :playlist_is_collaborative, :sp_playlist_is_collaborative, [ :playlist ], :bool
|
559
584
|
attach_function :playlist_set_collaborative, :sp_playlist_set_collaborative, [ :playlist, :bool ], :void
|
560
585
|
attach_function :playlist_set_autolink_tracks, :sp_playlist_set_autolink_tracks, [ :playlist, :bool ], :void
|
561
|
-
attach_function :playlist_get_description, :sp_playlist_get_description, [ :playlist ], :
|
586
|
+
attach_function :playlist_get_description, :sp_playlist_get_description, [ :playlist ], :utf8_string
|
562
587
|
attach_function :playlist_get_image, :sp_playlist_get_image, [ :playlist, :image_id ], :bool
|
563
588
|
attach_function :playlist_has_pending_changes, :sp_playlist_has_pending_changes, [ :playlist ], :bool
|
564
589
|
attach_function :playlist_add_tracks, :sp_playlist_add_tracks, [ :playlist, :array, :int, :int, :session ], :error
|
@@ -603,11 +628,11 @@ module Spotify
|
|
603
628
|
attach_function :playlistcontainer_playlist_type, :sp_playlistcontainer_playlist_type, [ :playlistcontainer, :int ], :playlist_type
|
604
629
|
attach_function :playlistcontainer_playlist_folder_name, :sp_playlistcontainer_playlist_folder_name, [ :playlistcontainer, :int, :buffer_out, :int ], :error
|
605
630
|
attach_function :playlistcontainer_playlist_folder_id, :sp_playlistcontainer_playlist_folder_id, [ :playlistcontainer, :int ], :uint64
|
606
|
-
attach_function :playlistcontainer_add_new_playlist, :sp_playlistcontainer_add_new_playlist, [ :playlistcontainer, :
|
631
|
+
attach_function :playlistcontainer_add_new_playlist, :sp_playlistcontainer_add_new_playlist, [ :playlistcontainer, :utf8_string ], :playlist
|
607
632
|
attach_function :playlistcontainer_add_playlist, :sp_playlistcontainer_add_playlist, [ :playlistcontainer, :link ], :playlist
|
608
633
|
attach_function :playlistcontainer_remove_playlist, :sp_playlistcontainer_remove_playlist, [ :playlistcontainer, :int ], :error
|
609
634
|
attach_function :playlistcontainer_move_playlist, :sp_playlistcontainer_move_playlist, [ :playlistcontainer, :int, :int, :bool ], :error
|
610
|
-
attach_function :playlistcontainer_add_folder, :sp_playlistcontainer_add_folder, [ :playlistcontainer, :int, :
|
635
|
+
attach_function :playlistcontainer_add_folder, :sp_playlistcontainer_add_folder, [ :playlistcontainer, :int, :utf8_string ], :error
|
611
636
|
attach_function :playlistcontainer_owner, :sp_playlistcontainer_owner, [ :playlistcontainer ], :user
|
612
637
|
attach_function :playlistcontainer_is_loaded, :sp_playlistcontainer_is_loaded, [ :playlistcontainer ], :bool
|
613
638
|
|
@@ -622,8 +647,8 @@ module Spotify
|
|
622
647
|
#
|
623
648
|
enum :relation_type, [:unknown, :none, :unidirectional, :bidirectional]
|
624
649
|
|
625
|
-
attach_function :user_canonical_name, :sp_user_canonical_name, [ :user ], :
|
626
|
-
attach_function :user_display_name, :sp_user_display_name, [ :user ], :
|
650
|
+
attach_function :user_canonical_name, :sp_user_canonical_name, [ :user ], :utf8_string
|
651
|
+
attach_function :user_display_name, :sp_user_display_name, [ :user ], :utf8_string
|
627
652
|
attach_function :user_is_loaded, :sp_user_is_loaded, [ :user ], :bool
|
628
653
|
|
629
654
|
attach_function :user_add_ref, :sp_user_add_ref, [ :user ], :void
|
@@ -639,7 +664,7 @@ module Spotify
|
|
639
664
|
enum :toplistregion, [:everywhere, :user]
|
640
665
|
|
641
666
|
callback :toplistbrowse_complete_cb, [:toplistbrowse, :userdata], :void
|
642
|
-
attach_function :toplistbrowse_create, :sp_toplistbrowse_create, [ :session, :toplisttype, :toplistregion, :
|
667
|
+
attach_function :toplistbrowse_create, :sp_toplistbrowse_create, [ :session, :toplisttype, :toplistregion, :utf8_string, :toplistbrowse_complete_cb, :userdata ], :toplistbrowse
|
643
668
|
attach_function :toplistbrowse_is_loaded, :sp_toplistbrowse_is_loaded, [ :toplistbrowse ], :bool
|
644
669
|
attach_function :toplistbrowse_error, :sp_toplistbrowse_error, [ :toplistbrowse ], :error
|
645
670
|
attach_function :toplistbrowse_num_artists, :sp_toplistbrowse_num_artists, [ :toplistbrowse ], :int
|
@@ -660,7 +685,7 @@ module Spotify
|
|
660
685
|
|
661
686
|
#
|
662
687
|
callback :inboxpost_complete_cb, [:inbox, :userdata], :void
|
663
|
-
attach_function :inbox_post_tracks, :sp_inbox_post_tracks, [ :session, :
|
688
|
+
attach_function :inbox_post_tracks, :sp_inbox_post_tracks, [ :session, :utf8_string, :array, :int, :utf8_string, :inboxpost_complete_cb, :userdata ], :inbox
|
664
689
|
attach_function :inbox_error, :sp_inbox_error, [ :inbox ], :error
|
665
690
|
|
666
691
|
attach_function :inbox_add_ref, :sp_inbox_add_ref, [ :inbox ], :void
|
data/lib/spotify/version.rb
CHANGED
data/spec/spotify_spec.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
rescue LoadError
|
4
|
-
retry if require 'rubygems'
|
5
|
-
end
|
1
|
+
# coding: utf-8
|
2
|
+
require 'rubygems' # needed for 1.8, does not matter in 1.9
|
6
3
|
|
4
|
+
require 'rbgccxml'
|
7
5
|
require 'minitest/autorun'
|
8
6
|
|
9
7
|
#
|
@@ -29,13 +27,23 @@ module Spotify
|
|
29
27
|
attr_reader :attached_methods
|
30
28
|
end
|
31
29
|
|
32
|
-
|
30
|
+
require 'spotify'
|
31
|
+
|
32
|
+
module C
|
33
|
+
extend FFI::Library
|
34
|
+
ffi_lib 'C'
|
35
|
+
|
36
|
+
typedef Spotify::UTF8String, :utf8_string
|
37
|
+
|
38
|
+
attach_function :strncpy, [ :pointer, :utf8_string, :size_t ], :utf8_string
|
39
|
+
end
|
33
40
|
|
34
41
|
#
|
35
42
|
# Utility
|
36
43
|
#
|
44
|
+
|
37
45
|
API_H_PATH = File.expand_path('../api.h', __FILE__)
|
38
|
-
API_H_SRC = File.read
|
46
|
+
API_H_SRC = File.read(API_H_PATH)
|
39
47
|
API_H_XML = RbGCCXML.parse(API_H_PATH)
|
40
48
|
|
41
49
|
#
|
@@ -96,6 +104,31 @@ describe Spotify do
|
|
96
104
|
end
|
97
105
|
end
|
98
106
|
end
|
107
|
+
|
108
|
+
describe "UTF8 string" do
|
109
|
+
let(:char) do
|
110
|
+
char = "\xC4"
|
111
|
+
char.force_encoding('ISO-8859-1') if char.respond_to?(:force_encoding)
|
112
|
+
char
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should convert any strings to UTF-8 before reading and writing" do
|
116
|
+
dest = FFI::MemoryPointer.new(:char, 3) # two bytes for the ä, one for the NULL
|
117
|
+
result = C.strncpy(dest, char, 3)
|
118
|
+
|
119
|
+
result.encoding.must_equal Encoding::UTF_8
|
120
|
+
result.must_equal "Ä"
|
121
|
+
result.bytesize.must_equal 2
|
122
|
+
end if "".respond_to?(:force_encoding)
|
123
|
+
|
124
|
+
it "should do nothing if strings does not respond to #encode or #force_encoding" do
|
125
|
+
dest = FFI::MemoryPointer.new(:char, 3) # two bytes for the ä, one for the NULL
|
126
|
+
result = C.strncpy(dest, char, 3)
|
127
|
+
|
128
|
+
result.must_equal "\xC4"
|
129
|
+
result.bytesize.must_equal 1
|
130
|
+
end unless "".respond_to?(:force_encoding)
|
131
|
+
end
|
99
132
|
end
|
100
133
|
|
101
134
|
describe "functions" do
|
@@ -106,7 +139,7 @@ describe "functions" do
|
|
106
139
|
def type_of(type, return_type = false)
|
107
140
|
return case type.to_cpp
|
108
141
|
when "const char*"
|
109
|
-
:
|
142
|
+
:utf8_string
|
110
143
|
when /\A(::)?(char|int|size_t|sp_session\*)\*/
|
111
144
|
return_type ? :pointer : :buffer_out
|
112
145
|
when /::(.+_cb)\*/
|
@@ -165,7 +198,7 @@ describe "enums" do
|
|
165
198
|
it "should match the definition" do
|
166
199
|
attached_enum_map = attached_enum.symbol_map
|
167
200
|
original_enum.each do |(name, value)|
|
168
|
-
a_name, a_value = attached_enum_map.
|
201
|
+
a_name, a_value = attached_enum_map.max_by { |(n, v)| (n.to_s.length if name.match(n.to_s)).to_i }
|
169
202
|
attached_enum_map.delete(a_name)
|
170
203
|
a_value.to_s.must_equal value
|
171
204
|
end
|
data/spotify.gemspec
CHANGED
@@ -27,7 +27,5 @@ Gem::Specification.new do |gem|
|
|
27
27
|
gem.add_development_dependency 'rake'
|
28
28
|
gem.add_development_dependency 'yard'
|
29
29
|
gem.add_development_dependency 'rbgccxml'
|
30
|
-
gem.add_development_dependency 'gccxml_gem', '!= 0.9.3'
|
31
30
|
gem.add_development_dependency 'minitest', '~> 2.0'
|
32
|
-
gem.add_development_dependency 'bundler', '~> 1.0'
|
33
31
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spotify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 10.2.
|
4
|
+
version: 10.2.1
|
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-
|
12
|
+
date: 2011-12-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
16
|
-
requirement: &
|
16
|
+
requirement: &70128859865560 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -24,10 +24,10 @@ dependencies:
|
|
24
24
|
version: 1.0.11
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
|
-
version_requirements: *
|
27
|
+
version_requirements: *70128859865560
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rake
|
30
|
-
requirement: &
|
30
|
+
requirement: &70128859862920 !ruby/object:Gem::Requirement
|
31
31
|
none: false
|
32
32
|
requirements:
|
33
33
|
- - ! '>='
|
@@ -35,10 +35,10 @@ dependencies:
|
|
35
35
|
version: '0'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
|
-
version_requirements: *
|
38
|
+
version_requirements: *70128859862920
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: yard
|
41
|
-
requirement: &
|
41
|
+
requirement: &70128859861560 !ruby/object:Gem::Requirement
|
42
42
|
none: false
|
43
43
|
requirements:
|
44
44
|
- - ! '>='
|
@@ -46,10 +46,10 @@ dependencies:
|
|
46
46
|
version: '0'
|
47
47
|
type: :development
|
48
48
|
prerelease: false
|
49
|
-
version_requirements: *
|
49
|
+
version_requirements: *70128859861560
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
51
|
name: rbgccxml
|
52
|
-
requirement: &
|
52
|
+
requirement: &70128859876120 !ruby/object:Gem::Requirement
|
53
53
|
none: false
|
54
54
|
requirements:
|
55
55
|
- - ! '>='
|
@@ -57,21 +57,10 @@ dependencies:
|
|
57
57
|
version: '0'
|
58
58
|
type: :development
|
59
59
|
prerelease: false
|
60
|
-
version_requirements: *
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: gccxml_gem
|
63
|
-
requirement: &70158630603140 !ruby/object:Gem::Requirement
|
64
|
-
none: false
|
65
|
-
requirements:
|
66
|
-
- - ! '!='
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 0.9.3
|
69
|
-
type: :development
|
70
|
-
prerelease: false
|
71
|
-
version_requirements: *70158630603140
|
60
|
+
version_requirements: *70128859876120
|
72
61
|
- !ruby/object:Gem::Dependency
|
73
62
|
name: minitest
|
74
|
-
requirement: &
|
63
|
+
requirement: &70128859872120 !ruby/object:Gem::Requirement
|
75
64
|
none: false
|
76
65
|
requirements:
|
77
66
|
- - ~>
|
@@ -79,18 +68,7 @@ dependencies:
|
|
79
68
|
version: '2.0'
|
80
69
|
type: :development
|
81
70
|
prerelease: false
|
82
|
-
version_requirements: *
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: bundler
|
85
|
-
requirement: &70158630616080 !ruby/object:Gem::Requirement
|
86
|
-
none: false
|
87
|
-
requirements:
|
88
|
-
- - ~>
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
version: '1.0'
|
91
|
-
type: :development
|
92
|
-
prerelease: false
|
93
|
-
version_requirements: *70158630616080
|
71
|
+
version_requirements: *70128859872120
|
94
72
|
description: ! " Spotify for Ruby is a primitive wrapper around libspotify using
|
95
73
|
Ruby FFI.\n If all you want is libspotify for Ruby, you should probably use at
|
96
74
|
Hallon\n instead: https://rubygems.org/gems/hallon\n"
|
@@ -102,6 +80,7 @@ extra_rdoc_files: []
|
|
102
80
|
files:
|
103
81
|
- .gemtest
|
104
82
|
- .gitignore
|
83
|
+
- .travis.yml
|
105
84
|
- CHANGELOG.md
|
106
85
|
- Gemfile
|
107
86
|
- LICENSE
|