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
         |