spotify 12.5.3 → 12.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +20 -5
- data/CHANGELOG.md +29 -1
- data/Gemfile +5 -0
- data/MIT-LICENSE +21 -0
- data/README.markdown +75 -50
- data/Rakefile +1 -1
- data/examples/example-audio_delivery_speed.rb +48 -0
- data/examples/{audio-stream_example.rb → example-audio_stream.rb} +14 -29
- data/examples/example-console.rb +9 -0
- data/examples/example-listing_playlists.rb +89 -0
- data/examples/example-loading_object.rb +25 -0
- data/examples/example-random_related_artists.rb +53 -0
- data/examples/support.rb +106 -0
- data/lib/spotify.rb +36 -55
- data/lib/spotify/api.rb +54 -26
- data/lib/spotify/api/album.rb +45 -2
- data/lib/spotify/api/album_browse.rb +81 -3
- data/lib/spotify/api/artist.rb +21 -2
- data/lib/spotify/api/artist_browse.rb +121 -3
- data/lib/spotify/api/error.rb +5 -1
- data/lib/spotify/api/image.rb +72 -6
- data/lib/spotify/api/inbox.rb +33 -4
- data/lib/spotify/api/link.rb +117 -4
- data/lib/spotify/api/miscellaneous.rb +12 -0
- data/lib/spotify/api/playlist.rb +321 -16
- data/lib/spotify/api/playlist_container.rb +168 -9
- data/lib/spotify/api/search.rb +156 -3
- data/lib/spotify/api/session.rb +390 -26
- data/lib/spotify/api/toplist_browse.rb +74 -3
- data/lib/spotify/api/track.rb +134 -4
- data/lib/spotify/api/user.rb +18 -2
- data/lib/spotify/api_helpers.rb +47 -0
- data/lib/spotify/data_converters.rb +7 -0
- data/lib/spotify/{types → data_converters}/best_effort_string.rb +1 -1
- data/lib/spotify/{types → data_converters}/byte_string.rb +0 -0
- data/lib/spotify/data_converters/country_code.rb +30 -0
- data/lib/spotify/{types → data_converters}/image_id.rb +1 -1
- data/lib/spotify/{type_safety.rb → data_converters/type_safety.rb} +0 -0
- data/lib/spotify/{types → data_converters}/utf8_string.rb +2 -2
- data/lib/spotify/{types → data_converters}/utf8_string_pointer.rb +2 -2
- data/lib/spotify/error.rb +180 -47
- data/lib/spotify/managed_pointer.rb +32 -12
- data/lib/spotify/monkey_patches/ffi_buffer.rb +11 -0
- data/lib/spotify/monkey_patches/ffi_enums.rb +4 -0
- data/lib/spotify/monkey_patches/ffi_pointer.rb +1 -0
- data/lib/spotify/structs.rb +4 -0
- data/lib/spotify/structs/session_callbacks.rb +97 -26
- data/lib/spotify/structs/session_config.rb +1 -1
- data/lib/spotify/structs/subscribers.rb +4 -3
- data/lib/spotify/types.rb +104 -5
- data/lib/spotify/{objects → types}/album.rb +0 -0
- data/lib/spotify/{objects → types}/album_browse.rb +0 -0
- data/lib/spotify/{objects → types}/artist.rb +0 -0
- data/lib/spotify/{objects → types}/artist_browse.rb +0 -0
- data/lib/spotify/{objects → types}/image.rb +0 -0
- data/lib/spotify/{objects → types}/inbox.rb +0 -0
- data/lib/spotify/{objects → types}/link.rb +0 -0
- data/lib/spotify/{objects → types}/playlist.rb +0 -0
- data/lib/spotify/{objects → types}/playlist_container.rb +0 -0
- data/lib/spotify/{objects → types}/search.rb +0 -0
- data/lib/spotify/{objects → types}/session.rb +0 -0
- data/lib/spotify/{objects → types}/toplist_browse.rb +0 -0
- data/lib/spotify/{objects → types}/track.rb +0 -0
- data/lib/spotify/{objects → types}/user.rb +0 -0
- data/lib/spotify/util.rb +38 -35
- data/lib/spotify/version.rb +1 -1
- data/spec/spec_helper.rb +24 -13
- data/spec/spotify/api/image_spec.rb +32 -0
- data/spec/spotify/api/inbox_spec.rb +34 -0
- data/spec/spotify/api/link_spec.rb +40 -0
- data/spec/spotify/api/playlist_spec.rb +99 -0
- data/spec/spotify/api/playlistcontainer_spec.rb +82 -0
- data/spec/spotify/api/session_spec.rb +97 -0
- data/spec/spotify/api/track_spec.rb +29 -0
- data/spec/spotify/api_error_spec.rb +55 -0
- data/spec/spotify/api_spec.rb +17 -11
- data/spec/spotify/{types → data_converters}/best_effort_string_spec.rb +4 -4
- data/spec/spotify/{types → data_converters}/byte_string_spec.rb +0 -0
- data/spec/spotify/data_converters/country_code_spec.rb +16 -0
- data/spec/spotify/{types → data_converters}/image_id_spec.rb +1 -1
- data/spec/spotify/{type_safety_spec.rb → data_converters/type_safety_spec.rb} +0 -0
- data/spec/spotify/{types → data_converters}/utf8_string_pointer_spec.rb +0 -0
- data/spec/spotify/{types → data_converters}/utf8_string_spec.rb +1 -1
- data/spec/spotify/{api/functions_spec.rb → functions_spec.rb} +2 -0
- data/spec/spotify/managed_pointer_spec.rb +13 -13
- data/spec/spotify/structs/subscribers_spec.rb +5 -3
- data/spec/spotify/{defines_spec.rb → types_spec.rb} +16 -3
- data/spec/spotify/util_spec.rb +24 -0
- data/spec/spotify_spec.rb +74 -0
- data/spec/support/spotify_util.rb +6 -2
- data/spec/support/spy_output.rb +16 -0
- data/spotify.gemspec +4 -2
- metadata +111 -71
- data/examples/README.md +0 -15
- data/examples/console_example.rb +0 -22
- data/examples/example_support.rb +0 -66
- data/examples/loading-object_example.rb +0 -43
- data/examples/logging-in_example.rb +0 -58
- data/lib/spotify/defines.rb +0 -109
- data/lib/spotify/objects.rb +0 -17
- data/spec/spotify/enums_spec.rb +0 -9
- data/spec/spotify/spotify_spec.rb +0 -69
@@ -1,43 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: utf-8
|
3
|
-
|
4
|
-
require_relative "example_support"
|
5
|
-
|
6
|
-
config = Spotify::SessionConfig.new({
|
7
|
-
api_version: Spotify::API_VERSION.to_i,
|
8
|
-
application_key: $appkey,
|
9
|
-
cache_location: ".spotify/",
|
10
|
-
settings_location: ".spotify/",
|
11
|
-
user_agent: "spotify for ruby",
|
12
|
-
callbacks: nil,
|
13
|
-
})
|
14
|
-
|
15
|
-
$logger.info "Creating session."
|
16
|
-
$session = Support.create_session(config)
|
17
|
-
|
18
|
-
$logger.info "Created! Logging in."
|
19
|
-
Spotify.session_login($session, $username, $password, false, $blob)
|
20
|
-
|
21
|
-
$logger.info "Log in requested. Waiting forever until logged in."
|
22
|
-
Support.poll($session) { Spotify.session_connectionstate($session) == :logged_in }
|
23
|
-
|
24
|
-
$logger.info "Logged in as #{Spotify.session_user_name($session)}."
|
25
|
-
|
26
|
-
track_uri = Support.prompt("Please enter an track URI")
|
27
|
-
link = Spotify.link_create_from_string(track_uri)
|
28
|
-
|
29
|
-
if link.null?
|
30
|
-
$logger.error "Invalid URI. Aborting."
|
31
|
-
abort
|
32
|
-
elsif (link_type = Spotify.link_type(link)) != :track
|
33
|
-
$logger.error "Was #{link_type} URI. Needs track. Aborting."
|
34
|
-
abort
|
35
|
-
else
|
36
|
-
track = Spotify.link_as_track(link)
|
37
|
-
end
|
38
|
-
|
39
|
-
$logger.info "Attempting to load track. Waiting forever until successful."
|
40
|
-
Support.poll($session) { Spotify.track_is_loaded(track) }
|
41
|
-
$logger.info "Track loaded."
|
42
|
-
|
43
|
-
puts Spotify.track_name(track)
|
@@ -1,58 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: utf-8
|
3
|
-
|
4
|
-
require_relative "example_support"
|
5
|
-
|
6
|
-
#
|
7
|
-
# Global callback procs.
|
8
|
-
#
|
9
|
-
# They are global variables to protect from ever being garbage collected.
|
10
|
-
#
|
11
|
-
# You must not allow the callbacks to ever be garbage collected, or libspotify
|
12
|
-
# will hold information about callbacks that no longer exist, and crash upon
|
13
|
-
# calling the first missing callback. This is *very* important!
|
14
|
-
|
15
|
-
$session_callbacks = {
|
16
|
-
log_message: lambda do |session, message|
|
17
|
-
$logger.info('session (log message)') { message }
|
18
|
-
end,
|
19
|
-
|
20
|
-
logged_in: lambda do |session, error|
|
21
|
-
$logger.info('session (logged in)') { Spotify::Error.explain(error) }
|
22
|
-
end,
|
23
|
-
|
24
|
-
logged_out: lambda do |session|
|
25
|
-
$logger.info('session (logged out)') { 'logged out!' }
|
26
|
-
end,
|
27
|
-
|
28
|
-
credentials_blob_updated: lambda do |session, blob|
|
29
|
-
$logger.info('session (blob)') { blob }
|
30
|
-
end
|
31
|
-
}
|
32
|
-
|
33
|
-
#
|
34
|
-
# Main work code.
|
35
|
-
#
|
36
|
-
|
37
|
-
# You can read about what these session configuration options do in the
|
38
|
-
# libspotify documentation:
|
39
|
-
# https://developer.spotify.com/technologies/libspotify/docs/12.1.45/structsp__session__config.html
|
40
|
-
config = Spotify::SessionConfig.new({
|
41
|
-
api_version: Spotify::API_VERSION.to_i,
|
42
|
-
application_key: $appkey,
|
43
|
-
cache_location: ".spotify/",
|
44
|
-
settings_location: ".spotify/",
|
45
|
-
user_agent: "spotify for ruby",
|
46
|
-
callbacks: Spotify::SessionCallbacks.new($session_callbacks),
|
47
|
-
})
|
48
|
-
|
49
|
-
$logger.info "Creating session."
|
50
|
-
$session = Support.create_session(config)
|
51
|
-
|
52
|
-
$logger.info "Created! Logging in."
|
53
|
-
Spotify.session_login($session, $username, $password, false, $blob)
|
54
|
-
|
55
|
-
$logger.info "Log in requested. Waiting forever until logged in."
|
56
|
-
Support.poll($session) { Spotify.session_connectionstate($session) == :logged_in }
|
57
|
-
|
58
|
-
$logger.info "Logged in as #{Spotify.session_user_name($session)}."
|
data/lib/spotify/defines.rb
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
module Spotify
|
2
|
-
class API
|
3
|
-
typedef :pointer, :frames
|
4
|
-
typedef :pointer, :userdata
|
5
|
-
typedef :pointer, :array
|
6
|
-
|
7
|
-
#
|
8
|
-
# Error
|
9
|
-
#
|
10
|
-
enum :error, [:ok, 0,
|
11
|
-
:bad_api_version, :api_initialization_failed, :track_not_playable,
|
12
|
-
|
13
|
-
:bad_application_key, 5,
|
14
|
-
:bad_username_or_password, :user_banned,
|
15
|
-
:unable_to_contact_server, :client_too_old, :other_permanent,
|
16
|
-
:bad_user_agent, :missing_callback, :invalid_indata,
|
17
|
-
:index_out_of_range, :user_needs_premium, :other_transient,
|
18
|
-
:is_loading, :no_stream_available, :permission_denied,
|
19
|
-
:inbox_is_full, :no_cache, :no_such_user, :no_credentials,
|
20
|
-
:network_disabled, :invalid_device_id, :cant_open_trace_file,
|
21
|
-
:application_banned,
|
22
|
-
|
23
|
-
:offline_too_many_tracks, 31,
|
24
|
-
:offline_disk_cache, :offline_expired, :offline_not_allowed,
|
25
|
-
:offline_license_lost, :offline_license_error,
|
26
|
-
|
27
|
-
:lastfm_auth_error, 39,
|
28
|
-
:invalid_argument, :system_failure]
|
29
|
-
|
30
|
-
#
|
31
|
-
# Audio
|
32
|
-
#
|
33
|
-
enum :sampletype, [:int16] # int16_native_endian
|
34
|
-
enum :bitrate, %w(160k 320k 96k).map(&:to_sym)
|
35
|
-
|
36
|
-
#
|
37
|
-
# Session
|
38
|
-
#
|
39
|
-
enum :social_provider, [:spotify, :facebook, :lastfm]
|
40
|
-
enum :scrobbling_state, [:use_global_setting, :local_enabled, :local_disabled, :global_enabled, :global_disabled]
|
41
|
-
enum :connectionstate, [:logged_out, :logged_in, :disconnected, :undefined, :offline]
|
42
|
-
enum :connection_type, [:unknown, :none, :mobile, :mobile_roaming, :wifi, :wired]
|
43
|
-
enum :connection_rules, [:network , 0x1,
|
44
|
-
:network_if_roaming , 0x2,
|
45
|
-
:allow_sync_over_mobile, 0x4,
|
46
|
-
:allow_sync_over_wifi , 0x8]
|
47
|
-
|
48
|
-
#
|
49
|
-
# Image
|
50
|
-
#
|
51
|
-
callback :image_loaded_cb, [ Image.retaining_class, :userdata ], :void
|
52
|
-
enum :imageformat, [:unknown, -1, :jpeg]
|
53
|
-
enum :image_size, [ :normal, :small, :large ]
|
54
|
-
|
55
|
-
#
|
56
|
-
# Link
|
57
|
-
#
|
58
|
-
enum :linktype, [:invalid, :track, :album, :artist, :search,
|
59
|
-
:playlist, :profile, :starred, :localtrack, :image]
|
60
|
-
|
61
|
-
#
|
62
|
-
# Track
|
63
|
-
#
|
64
|
-
enum :availability, [:unavailable, :available, :not_streamable, :banned_by_artist]
|
65
|
-
typedef :availability, :track_availability # for automated testing
|
66
|
-
enum :track_offline_status, [:no, :waiting, :downloading, :done, :error, :done_expired, :limit_exceeded, :done_resync]
|
67
|
-
|
68
|
-
#
|
69
|
-
# Album
|
70
|
-
#
|
71
|
-
callback :albumbrowse_complete_cb, [AlbumBrowse.retaining_class, :userdata], :void
|
72
|
-
enum :albumtype, [:album, :single, :compilation, :unknown]
|
73
|
-
|
74
|
-
#
|
75
|
-
# Artist browsing
|
76
|
-
#
|
77
|
-
callback :artistbrowse_complete_cb, [ArtistBrowse.retaining_class, :userdata], :void
|
78
|
-
enum :artistbrowse_type, [:full, :no_tracks, :no_albums]
|
79
|
-
|
80
|
-
#
|
81
|
-
# Search
|
82
|
-
#
|
83
|
-
callback :search_complete_cb, [Search.retaining_class, :userdata], :void
|
84
|
-
enum :search_type, [:standard, :suggest]
|
85
|
-
|
86
|
-
#
|
87
|
-
# Playlist
|
88
|
-
#
|
89
|
-
enum :playlist_type, [:playlist, :start_folder, :end_folder, :placeholder]
|
90
|
-
enum :playlist_offline_status, [:no, :yes, :downloading, :waiting]
|
91
|
-
|
92
|
-
#
|
93
|
-
# User
|
94
|
-
#
|
95
|
-
enum :relation_type, [:unknown, :none, :unidirectional, :bidirectional]
|
96
|
-
|
97
|
-
#
|
98
|
-
# Toplist
|
99
|
-
#
|
100
|
-
callback :toplistbrowse_complete_cb, [ToplistBrowse.retaining_class, :userdata], :void
|
101
|
-
enum :toplisttype, [:artists, :albums, :tracks]
|
102
|
-
enum :toplistregion, [:everywhere, :user]
|
103
|
-
|
104
|
-
#
|
105
|
-
# Inbox
|
106
|
-
#
|
107
|
-
callback :inboxpost_complete_cb, [Inbox.retaining_class, :userdata], :void
|
108
|
-
end
|
109
|
-
end
|
data/lib/spotify/objects.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'spotify/type_safety'
|
2
|
-
require 'spotify/managed_pointer'
|
3
|
-
|
4
|
-
require 'spotify/objects/album'
|
5
|
-
require 'spotify/objects/album_browse'
|
6
|
-
require 'spotify/objects/artist'
|
7
|
-
require 'spotify/objects/artist_browse'
|
8
|
-
require 'spotify/objects/image'
|
9
|
-
require 'spotify/objects/inbox'
|
10
|
-
require 'spotify/objects/link'
|
11
|
-
require 'spotify/objects/playlist'
|
12
|
-
require 'spotify/objects/playlist_container'
|
13
|
-
require 'spotify/objects/search'
|
14
|
-
require 'spotify/objects/session'
|
15
|
-
require 'spotify/objects/toplist_browse'
|
16
|
-
require 'spotify/objects/track'
|
17
|
-
require 'spotify/objects/user'
|
data/spec/spotify/enums_spec.rb
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
describe Spotify do
|
2
|
-
describe "VERSION" do
|
3
|
-
it "is defined" do
|
4
|
-
defined?(Spotify::VERSION).should eq "constant"
|
5
|
-
end
|
6
|
-
|
7
|
-
it "is the same version as in api.h" do
|
8
|
-
spotify_version = API_H_SRC.match(/#define\s+SPOTIFY_API_VERSION\s+(\d+)/)[1]
|
9
|
-
Spotify::API_VERSION.to_i.should eq spotify_version.to_i
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "proxying" do
|
14
|
-
it "responds to the spotify methods" do
|
15
|
-
Spotify.should respond_to :error_message
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe ".try" do
|
20
|
-
it "raises an error when the result is not OK" do
|
21
|
-
api.should_receive(:error_example).and_return(:bad_application_key)
|
22
|
-
expect { Spotify.try(:error_example) }.to raise_error(Spotify::Error, /BAD_APPLICATION_KEY/)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "does not raise an error when the result is OK" do
|
26
|
-
api.should_receive(:error_example).and_return(:ok)
|
27
|
-
Spotify.try(:error_example).should eq :ok
|
28
|
-
end
|
29
|
-
|
30
|
-
it "does not raise an error when the result is not an error-type" do
|
31
|
-
result = Object.new
|
32
|
-
api.should_receive(:error_example).and_return(result)
|
33
|
-
Spotify.try(:error_example).should eq result
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe ".enum_value!" do
|
38
|
-
it "raises an error if given an invalid enum value" do
|
39
|
-
expect { Spotify.enum_value!(:moo, "error value") }.to raise_error(ArgumentError)
|
40
|
-
end
|
41
|
-
|
42
|
-
it "gives back the enum value for that enum" do
|
43
|
-
Spotify.enum_value!(:ok, "error value").should eq 0
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe ".attach_function" do
|
48
|
-
it "is a retaining class if the method is not creating" do
|
49
|
-
begin
|
50
|
-
Spotify::API.attach_function :whatever, [], Spotify::User
|
51
|
-
rescue FFI::NotFoundError
|
52
|
-
# expected, this method does not exist
|
53
|
-
end
|
54
|
-
|
55
|
-
$attached_methods["whatever"][:returns].should eq Spotify::User.retaining_class
|
56
|
-
end
|
57
|
-
|
58
|
-
it "is a non-retaining class if the method is creating" do
|
59
|
-
begin
|
60
|
-
Spotify::API.attach_function :whatever_create, [], Spotify::User
|
61
|
-
rescue FFI::NotFoundError
|
62
|
-
# expected, this method does not exist
|
63
|
-
end
|
64
|
-
|
65
|
-
$attached_methods["whatever_create"][:returns].should be Spotify::User
|
66
|
-
$attached_methods["whatever_create"][:returns].should_not be Spotify::User.retaining_class
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|