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
data/lib/spotify/api/search.rb
CHANGED
@@ -1,27 +1,180 @@
|
|
1
1
|
module Spotify
|
2
2
|
class API
|
3
3
|
# @!group Search
|
4
|
+
|
5
|
+
# Fire off a search query for tracks, albums, artists, and playlists.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# callback = proc { |search| puts "Search results are available!" }
|
9
|
+
# search = Spotify.search_create(session, "Zanarkand", 0, 10, 0, 10, 0, 10, 0, 10, :standard, callback, nil)
|
10
|
+
#
|
11
|
+
# @note it is *very* important that the callback is not garbage collected before it is called!
|
12
|
+
# @param [Session] session
|
13
|
+
# @param [String] query
|
14
|
+
# @param [Integer] track_offset
|
15
|
+
# @param [Integer] track_count
|
16
|
+
# @param [Integer] album_offset
|
17
|
+
# @param [Integer] album_count
|
18
|
+
# @param [Integer] artist_offset
|
19
|
+
# @param [Integer] artist_count
|
20
|
+
# @param [Integer] playlist_offset
|
21
|
+
# @param [Integer] playlist_count
|
22
|
+
# @param [Integer] search_type one of :standard, or :suggest
|
23
|
+
# @param [Proc<Search, FFI::Pointer>] callback
|
24
|
+
# @param [FFI::Pointer] userdata
|
25
|
+
# @return [Search] a search
|
26
|
+
# @method search_create(session, query, track_offset, track_count, album_offset, album_count, artist_offset, artist_count, playlist_offset, playlist_count, search_type, callback, userdata)
|
4
27
|
attach_function :search_create, [ Session, UTF8String, :int, :int, :int, :int, :int, :int, :int, :int, :search_type, :search_complete_cb, :userdata ], Search
|
28
|
+
|
29
|
+
# @param [Search] search
|
30
|
+
# @return [Boolean] true if the search has completed
|
31
|
+
# @method search_is_loaded(search)
|
5
32
|
attach_function :search_is_loaded, [ Search ], :bool
|
6
|
-
|
33
|
+
|
34
|
+
# @param [Search] search
|
35
|
+
# @return [Symbol] error code
|
36
|
+
# @method search_error(search)
|
37
|
+
attach_function :search_error, [ Search ], APIError
|
38
|
+
|
39
|
+
# @param [Search] search
|
40
|
+
# @return [String] search query
|
41
|
+
# @method search_query(search)
|
7
42
|
attach_function :search_query, [ Search ], UTF8String
|
43
|
+
|
44
|
+
# @see #search_is_loaded
|
45
|
+
# @note if the search is not loaded, the function always return an empty string.
|
46
|
+
# @param [Search] search
|
47
|
+
# @return [String] spotify's guess at what the query might have meant instead
|
48
|
+
# @method search_did_you_mean(search)
|
8
49
|
attach_function :search_did_you_mean, [ Search ], UTF8String
|
50
|
+
|
51
|
+
# @see #search_is_loaded
|
52
|
+
# @see #search_total_tracks
|
53
|
+
# @note if {#search_total_tracks} is larger than this number, you may retrieve additional
|
54
|
+
# results if you make the same search query again, but with a higher track_offset
|
55
|
+
# @note if the search is not loaded, the function always return 0.
|
56
|
+
# @param [Search] search
|
57
|
+
# @return [Integer] number of tracks in the search result
|
58
|
+
# @method search_num_tracks(search)
|
9
59
|
attach_function :search_num_tracks, [ Search ], :int
|
60
|
+
|
61
|
+
# @see #search_num_tracks
|
62
|
+
# @note if index is out of range, the function always return nil.
|
63
|
+
# @param [Search] search
|
64
|
+
# @param [Integer] index number between 0...{#search_num_tracks}
|
65
|
+
# @return [Track, nil] track at index
|
66
|
+
# @method search_track(search, index)
|
10
67
|
attach_function :search_track, [ Search, :int ], Track
|
68
|
+
|
69
|
+
# @see #search_is_loaded
|
70
|
+
# @see #search_total_albums
|
71
|
+
# @note if {#search_total_albums} is larger than this number, you may retrieve additional
|
72
|
+
# results if you make the same search query again, but with a higher album_offset
|
73
|
+
# @note if the search is not loaded, the function always return 0.
|
74
|
+
# @param [Search] search
|
75
|
+
# @return [Integer] number of albums in the search result
|
76
|
+
# @method search_num_albums(search)
|
11
77
|
attach_function :search_num_albums, [ Search ], :int
|
78
|
+
|
79
|
+
# @see #search_num_albums
|
80
|
+
# @note if index is out of range, the function always return nil.
|
81
|
+
# @param [Search] search
|
82
|
+
# @param [Integer] index number between 0...{#search_num_albums}
|
83
|
+
# @return [Album, nil] album at index
|
84
|
+
# @method search_album(search, index)
|
12
85
|
attach_function :search_album, [ Search, :int ], Album
|
86
|
+
|
87
|
+
# @see #search_is_loaded
|
88
|
+
# @see #search_total_artists
|
89
|
+
# @note if {#search_total_artists} is larger than this number, you may retrieve additional
|
90
|
+
# results if you make the same search query again, but with a higher artist_offset
|
91
|
+
# @note if the search is not loaded, the function always return 0.
|
92
|
+
# @param [Search] search
|
93
|
+
# @return [Integer] number of artists in the search result
|
94
|
+
# @method search_num_artists(search)
|
13
95
|
attach_function :search_num_artists, [ Search ], :int
|
96
|
+
|
97
|
+
# @see #search_num_artists
|
98
|
+
# @note if index is out of range, the function always return nil.
|
99
|
+
# @param [Search] search
|
100
|
+
# @param [Integer] index number between 0...{#search_num_artists}
|
101
|
+
# @return [Artist, nil] artist at index
|
102
|
+
# @method search_artist(search, index)
|
14
103
|
attach_function :search_artist, [ Search, :int ], Artist
|
104
|
+
|
105
|
+
# @see #search_is_loaded
|
106
|
+
# @see #search_total_playlists
|
107
|
+
# @note if {#search_total_playlists} is larger than this number, you may retrieve additional
|
108
|
+
# results if you make the same search query again, but with a higher playlist_offset
|
109
|
+
# @note if the search is not loaded, the function always return 0.
|
110
|
+
# @param [Search] search
|
111
|
+
# @return [Integer] number of playlists in the search result
|
112
|
+
# @method search_num_playlists(search)
|
15
113
|
attach_function :search_num_playlists, [ Search ], :int
|
114
|
+
|
115
|
+
# @see #search_num_playlists
|
116
|
+
# @note if index is out of range, the function always return nil.
|
117
|
+
# @param [Search] search
|
118
|
+
# @param [Integer] index number between 0...{#search_num_playlists}
|
119
|
+
# @return [Playlist, nil] playlist at index
|
120
|
+
# @method search_playlist(search, index)
|
16
121
|
attach_function :search_playlist, [ Search, :int ], Playlist
|
122
|
+
|
123
|
+
# @see #search_num_playlists
|
124
|
+
# @note if index is out of range, the function always return nil.
|
125
|
+
# @param [Search] search
|
126
|
+
# @param [Integer] index number between 0...{#search_num_playlists}
|
127
|
+
# @return [String, nil] name for playlist at index
|
128
|
+
# @method search_playlist_name(search, index)
|
17
129
|
attach_function :search_playlist_name, [ Search, :int ], UTF8String
|
130
|
+
|
131
|
+
# @see #link_create_from_string
|
132
|
+
# @see #search_num_playlists
|
133
|
+
# @note if index is out of range, the function always return nil.
|
134
|
+
# @param [Search] search
|
135
|
+
# @param [Integer] index number between 0...{#search_num_playlists}
|
136
|
+
# @return [String, nil] spotify uri for playlist at index
|
137
|
+
# @method search_playlist_uri(search, index)
|
18
138
|
attach_function :search_playlist_uri, [ Search, :int ], UTF8String
|
139
|
+
|
140
|
+
# @see #image_create_from_link
|
141
|
+
# @see #search_num_playlists
|
142
|
+
# @note if index is out of range, the function always return nil.
|
143
|
+
# @param [Search] search
|
144
|
+
# @param [Integer] index number between 0...{#search_num_playlists}
|
145
|
+
# @return [String, nil] image uri for playlist at index
|
146
|
+
# @method search_playlist_image_uri(search, index)
|
19
147
|
attach_function :search_playlist_image_uri, [ Search, :int ], UTF8String
|
148
|
+
|
149
|
+
# @see #search_is_loaded
|
150
|
+
# @note if the search is not loaded, the function always return 0.
|
151
|
+
# @param [Search] search
|
152
|
+
# @return [Integer] number of total tracks in the search result
|
153
|
+
# @method search_total_tracks(search)
|
20
154
|
attach_function :search_total_tracks, [ Search ], :int
|
155
|
+
|
156
|
+
# @see #search_is_loaded
|
157
|
+
# @note if the search is not loaded, the function always return 0.
|
158
|
+
# @param [Search] search
|
159
|
+
# @return [Integer] number of total albums in the search result
|
160
|
+
# @method search_total_albums(search)
|
21
161
|
attach_function :search_total_albums, [ Search ], :int
|
162
|
+
|
163
|
+
# @see #search_is_loaded
|
164
|
+
# @note if the search is not loaded, the function always return 0.
|
165
|
+
# @param [Search] search
|
166
|
+
# @return [Integer] number of total artists in the search result
|
167
|
+
# @method search_total_artists(search)
|
22
168
|
attach_function :search_total_artists, [ Search ], :int
|
169
|
+
|
170
|
+
# @see #search_is_loaded
|
171
|
+
# @note if the search is not loaded, the function always return 0.
|
172
|
+
# @param [Search] search
|
173
|
+
# @return [Integer] number of total playlists in the search result
|
174
|
+
# @method search_total_playlists(search)
|
23
175
|
attach_function :search_total_playlists, [ Search ], :int
|
24
|
-
|
25
|
-
attach_function :
|
176
|
+
|
177
|
+
attach_function :search_add_ref, [ Search ], APIError
|
178
|
+
attach_function :search_release, [ Search ], APIError
|
26
179
|
end
|
27
180
|
end
|
data/lib/spotify/api/session.rb
CHANGED
@@ -1,46 +1,410 @@
|
|
1
1
|
module Spotify
|
2
2
|
class API
|
3
3
|
# @!group Session
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
|
5
|
+
# @example
|
6
|
+
# $callbacks = Spotify::SessionCallbacks.new({
|
7
|
+
# connectionstate_updated: proc do |session|
|
8
|
+
# puts "New connection state: #{Spotify.session_connectionstate(session)}."
|
9
|
+
# end,
|
10
|
+
# music_delivery: proc do |session, format, frames, num_frames|
|
11
|
+
# puts "More audio coming through!"
|
12
|
+
# end,
|
13
|
+
# })
|
14
|
+
#
|
15
|
+
# config = {
|
16
|
+
# api_version: Spotify::API_VERSION.to_i,
|
17
|
+
# application_key: File.binread("./spotify_appkey.key"),
|
18
|
+
# cache_location: "",
|
19
|
+
# user_agent: "spotify for ruby",
|
20
|
+
# callbacks: $callbacks,
|
21
|
+
# }
|
22
|
+
#
|
23
|
+
# error, session = Spotify.session_create(config)
|
24
|
+
# raise Spotify::APIError.new(error) if error
|
25
|
+
#
|
26
|
+
# @note it is *very* important that the callbacks are not garbage collected while they may be called!
|
27
|
+
# @param [SessionConfig] config
|
28
|
+
# @return [Array<Symbol, Session>] a tuple of error code, and session
|
29
|
+
# @method session_create(config)
|
30
|
+
attach_function :session_create, [ SessionConfig.by_ref, :buffer_out ], APIError do |config|
|
31
|
+
config = Spotify::SessionConfig.new(config.to_h)
|
32
|
+
|
33
|
+
with_buffer(Spotify::Session) do |session_buffer|
|
34
|
+
error = sp_session_create(config, session_buffer)
|
35
|
+
error = nil if error == :ok
|
36
|
+
|
37
|
+
session = if error.nil?
|
38
|
+
Spotify::Session.from_native(session_buffer.read_pointer, nil)
|
39
|
+
end
|
40
|
+
|
41
|
+
[error, session]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
attach_function :session_release, [ Session ], APIError
|
46
|
+
|
47
|
+
# Tell libspotify to process pending events from the backend.
|
48
|
+
#
|
49
|
+
# This will download changes and updates from Spotify, while simultaneously also uploading changes
|
50
|
+
# made locally, such as tracks added to playlists and more.
|
51
|
+
#
|
52
|
+
# This method is the cornerstone of libspotify. It should be called frequently to synchronize data.
|
53
|
+
# This method is also responsible for calling most callbacks.
|
54
|
+
#
|
55
|
+
# @example
|
56
|
+
# Spotify.session_process_events(session) # => 1337
|
57
|
+
#
|
58
|
+
# @param [Session] session
|
59
|
+
# @return [Integer] time (in milliseconds) until you should call process_events again
|
60
|
+
# @method session_process_events(session)
|
61
|
+
attach_function :session_process_events, [ Session, :buffer_out ], APIError do |session|
|
62
|
+
with_buffer(:int) do |timeout_buffer|
|
63
|
+
sp_session_process_events(session, timeout_buffer)
|
64
|
+
timeout_buffer.read_int
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Schedule a login.
|
69
|
+
#
|
70
|
+
# @see #session_process_events
|
71
|
+
# @see #session_relogin
|
72
|
+
# @note Login happens in the background. You have to process events a few times before you are logged in.
|
73
|
+
# @param [Session] session
|
74
|
+
# @param [String] username spotify username, or facebook e-mail
|
75
|
+
# @param [String] password spotify password, or facebook password, or nil
|
76
|
+
# @param [Boolean] remember_me true if {#session_relogin} should be possible
|
77
|
+
# @param [String] password_blob an alternative to password, stored from credentials_blob_updated session callback
|
78
|
+
# @return [Symbol] error code
|
79
|
+
# @method session_login(session, username, password, remember_me, password_blob)
|
80
|
+
attach_function :session_login, [ Session, UTF8String, UTF8String, :bool, UTF8String ], APIError
|
81
|
+
|
82
|
+
# Log in a previously remembered login from {#session_login}.
|
83
|
+
#
|
84
|
+
# You would use this after terminating your application, and later starting it again,
|
85
|
+
# assuming {#session_remembered_user} contains a username that is remembered.
|
86
|
+
#
|
87
|
+
# @see #session_login
|
88
|
+
# @see #session_process_events
|
89
|
+
# @note You must call {#session_logout} for remembered credentials to be stored.
|
90
|
+
# @note Login happens in the background. You have to process events a few times before you are logged in.
|
91
|
+
# @param [Session] session
|
92
|
+
# @return [Symbol] error code
|
93
|
+
# @method session_relogin(session)
|
94
|
+
attach_function :session_relogin, [ Session ], APIError
|
95
|
+
|
96
|
+
# Forget a previously remembered user.
|
97
|
+
#
|
98
|
+
# @see #session_relogin
|
99
|
+
# @param [Session] session
|
100
|
+
# @return [Symbol] error code
|
101
|
+
# @method session_forget_me(session)
|
102
|
+
attach_function :session_forget_me, [ Session ], APIError
|
103
|
+
|
104
|
+
# Retrieve the remembered user from {#session_login}.
|
105
|
+
#
|
106
|
+
# This is the user that will be logged in if you use {#session_relogin}.
|
107
|
+
#
|
108
|
+
# @example
|
109
|
+
# Spotify.session_remembered_user(session) # => "Burgestrand"
|
110
|
+
#
|
111
|
+
# @param [Session] session
|
112
|
+
# @return [String, nil] username of the remembered user, or nil if there was none
|
113
|
+
# @method session_remembered_user(session)
|
114
|
+
attach_function :session_remembered_user, [ Session, :buffer_out, :size_t ], :int do |session|
|
115
|
+
username_length = sp_session_remembered_user(session, nil, 0)
|
116
|
+
username = with_string_buffer(username_length) do |username_buffer, size|
|
117
|
+
sp_session_remembered_user(session, username_buffer, size)
|
118
|
+
end
|
119
|
+
username unless username.empty?
|
120
|
+
end
|
121
|
+
|
122
|
+
# @param [Session] session
|
123
|
+
# @return [User, nil] currently logged in user
|
124
|
+
# @method session_user(session)
|
11
125
|
attach_function :session_user, [ Session ], User
|
12
|
-
|
126
|
+
|
127
|
+
# Schedule a logout.
|
128
|
+
#
|
129
|
+
# @note This updates credentials in remember_me from {#session_login} and {#session_forget_me}.
|
130
|
+
# @note Logout happen asynchronously. You need to call {#session_process_events} a little while.
|
131
|
+
# @param [Session] session
|
132
|
+
# @return [Symbol] error code
|
133
|
+
# @method session_logout(session)
|
134
|
+
attach_function :session_logout, [ Session ], APIError
|
135
|
+
|
136
|
+
# @param [Session] session
|
137
|
+
# @return [Symbol] current session connection state, one of :logged_out, :logged_in, :disconnected, :undefined, :offline
|
138
|
+
# @method session_connectionstate(session)
|
13
139
|
attach_function :session_connectionstate, [ Session ], :connectionstate
|
140
|
+
|
141
|
+
# @param [Session] session
|
142
|
+
# @return [FFI::Pointer] userdata from config in {#session_create}
|
143
|
+
# @method session_userdata(session)
|
14
144
|
attach_function :session_userdata, [ Session ], :userdata
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
145
|
+
|
146
|
+
# Set the allowed disk cache size used by libspotify.
|
147
|
+
#
|
148
|
+
# @param [Session] session
|
149
|
+
# @param [Integer] cache_size maximum cache size in megabytes, 0 means libspotify automatically resize cache as needed
|
150
|
+
# @return [Symbol] error code
|
151
|
+
# @method session_set_cache_size(session, cache_size)
|
152
|
+
attach_function :session_set_cache_size, [ Session, :size_t ], APIError
|
153
|
+
|
154
|
+
# Load the specified track for playback.
|
155
|
+
#
|
156
|
+
# When the the function returns, the track will have been loaded assuming there as no error.
|
157
|
+
#
|
158
|
+
# @param [Session] session
|
159
|
+
# @param [Track] track
|
160
|
+
# @return [Symbol] error code
|
161
|
+
# @method session_player_load(session, track)
|
162
|
+
attach_function :session_player_load, [ Session, Track ], APIError
|
163
|
+
|
164
|
+
# Seek to position in the currently loaded track.
|
165
|
+
#
|
166
|
+
# @see #session_player_load
|
167
|
+
# @param [Session] session
|
168
|
+
# @param [Integer] position in milliseconds
|
169
|
+
# @return [Symbol] error code
|
170
|
+
# @method session_player_seek(session, position)
|
171
|
+
attach_function :session_player_seek, [ Session, :int ], APIError
|
172
|
+
|
173
|
+
# Play or pause the currently loaded track.
|
174
|
+
#
|
175
|
+
# This will start delivery of audio frames to the music_delivery callback in {#session_create}.
|
176
|
+
# However, playback should wait until {SessionCallbacks#start_playback} callback is called by libspotify.
|
177
|
+
#
|
178
|
+
# @see #session_player_load
|
179
|
+
# @param [Session] session
|
180
|
+
# @param [Boolean] play if set to true, playback will be resumed, if set to false playback will be paused
|
181
|
+
# @return [Symbol] error code
|
182
|
+
# @method session_player_play(session, play)
|
183
|
+
attach_function :session_player_play, [ Session, :bool ], APIError
|
184
|
+
|
185
|
+
# Stop playback and clear the currently loaded track.
|
186
|
+
#
|
187
|
+
# @see #session_player_load
|
188
|
+
# @param [Session] session
|
189
|
+
# @return [Symbol] error code
|
190
|
+
# @method session_player_unload(session)
|
191
|
+
attach_function :session_player_unload, [ Session ], APIError
|
192
|
+
|
193
|
+
# Tell libspotify to start preloading a track so that {#session_player_load} has less work to do.
|
194
|
+
#
|
195
|
+
# This could be done towards the end of a track in a queue, before starting playing the next.
|
196
|
+
#
|
197
|
+
# @note prefetching is only possible if using a cache from config in {#session_create}
|
198
|
+
# @param [Session] session
|
199
|
+
# @param [Track] track
|
200
|
+
# @return [Symbol] error code
|
201
|
+
# @method session_player_prefetch(session, track)
|
202
|
+
attach_function :session_player_prefetch, [ Session, Track ], APIError
|
203
|
+
|
204
|
+
# @note if not logged in, the function always return nil.
|
205
|
+
# @param [Session] session
|
206
|
+
# @return [PlaylistContainer, nil] playlist container for currently logged in user
|
207
|
+
# @method session_playlistcontainer(session)
|
21
208
|
attach_function :session_playlistcontainer, [ Session ], PlaylistContainer
|
209
|
+
|
210
|
+
# @note if not logged in, the function always return nil.
|
211
|
+
# @param [Session] session
|
212
|
+
# @return [Playlist] inbox playlist for currently logged in user (playlist where items sent by other users are posted to)
|
213
|
+
# @method session_inbox_create(session)
|
22
214
|
attach_function :session_inbox_create, [ Session ], Playlist
|
215
|
+
|
216
|
+
# @note if not logged in, the function always return nil.
|
217
|
+
# @param [Session] session
|
218
|
+
# @return [Playlist, nil] starred playlist for currently logged in user
|
219
|
+
# @method session_starred_create(session)
|
23
220
|
attach_function :session_starred_create, [ Session ], Playlist
|
221
|
+
|
222
|
+
# @note if not logged in, the function always return nil.
|
223
|
+
# @param [Session] session
|
224
|
+
# @param [String] username canonical username of user
|
225
|
+
# @return [Playlist, nil] starred playlist for the specified user
|
226
|
+
# @method session_starred_for_user_create(session, username)
|
24
227
|
attach_function :session_starred_for_user_create, [ Session, UTF8String ], Playlist
|
228
|
+
|
229
|
+
# @note if not logged in, the function always return nil.
|
230
|
+
# @param [Session] session
|
231
|
+
# @param [String] username canonical username of user
|
232
|
+
# @return [PlaylistContainer, nil] published playlists container for the specified user
|
233
|
+
# @method session_publishedcontainer_for_user_create(session, username)
|
25
234
|
attach_function :session_publishedcontainer_for_user_create, [ Session, UTF8String ], PlaylistContainer
|
26
|
-
|
27
|
-
|
28
|
-
|
235
|
+
|
236
|
+
# Set preferred bitrate for music streaming.
|
237
|
+
#
|
238
|
+
# @param [Session] session
|
239
|
+
# @param [Symbol] bitrate one of :160k, :320k, :96k
|
240
|
+
# @return [Symbol] error code
|
241
|
+
# @method session_preferred_bitrate(session, bitrate)
|
242
|
+
attach_function :session_preferred_bitrate, [ Session, :bitrate ], APIError
|
243
|
+
|
244
|
+
# Set current connection type.
|
245
|
+
#
|
246
|
+
# @see #session_set_connection_rules
|
247
|
+
# @param [Session] session
|
248
|
+
# @param [Symbol] type one of :unknown, :none, :mobile, :mobile_roaming, :wifi, :wired
|
249
|
+
# @return [Symbol] error code
|
250
|
+
# @method session_set_connection_type(session, type)
|
251
|
+
attach_function :session_set_connection_type, [ Session, :connection_type ], APIError
|
252
|
+
|
253
|
+
# Set rules for how libspotify connects to Spotify servers and synchronizes offline content.
|
254
|
+
#
|
255
|
+
# @example
|
256
|
+
# online_mode = Spotify::Util.enum_value!(:network, :connection_rules)
|
257
|
+
# over_wifi = Spotify::Util.enum_value!(:allow_sync_over_wifi, :connection_rules)
|
258
|
+
# Spotify.session_set_connection_rules($session, online_mode | over_wifi) # => :ok
|
259
|
+
#
|
260
|
+
# @see #session_set_connection_type
|
261
|
+
# @param [Session] session
|
262
|
+
# @param [Symbol] rules any of :network, :network_if_roaming, :allow_sync_over_mobile, :allow_sync_over_wifi
|
263
|
+
# @return [Symbol] error code
|
264
|
+
# @method session_set_connection_rules(session, rules)
|
265
|
+
attach_function :session_set_connection_rules, [ Session, :connection_rules ], APIError
|
266
|
+
|
267
|
+
# @param [Session] session
|
268
|
+
# @return [Integer] total number of tracks left to sync before all offline content has downloaded
|
269
|
+
# @method offline_tracks_to_sync(session)
|
29
270
|
attach_function :offline_tracks_to_sync, [ Session ], :int
|
271
|
+
|
272
|
+
# @param [Session] session
|
273
|
+
# @return [Integer] total number of playlists marked for offline synchronization
|
274
|
+
# @method offline_num_playlists(session)
|
30
275
|
attach_function :offline_num_playlists, [ Session ], :int
|
276
|
+
|
277
|
+
# @example
|
278
|
+
# status = Spotify::OfflineSyncStatus.new
|
279
|
+
# Spotify.offline_sync_get_status(session, status)
|
280
|
+
# p status.to_h # => { queued_tracks: 0, queued_bytes: 0, … }
|
281
|
+
#
|
282
|
+
# @param [Session] session
|
283
|
+
# @param [OfflineSyncStatus] status
|
284
|
+
# @return [Boolean] true if offline synching is enabled
|
285
|
+
# @method offline_sync_get_status(session, offline_sync_status)
|
31
286
|
attach_function :offline_sync_get_status, [ Session, OfflineSyncStatus.by_ref ], :bool
|
287
|
+
|
288
|
+
# @param [Session] session
|
289
|
+
# @return [Integer] remaining time (in seconds) until offline key store expires and user is required to relogin
|
290
|
+
# @method offline_time_left(session)
|
32
291
|
attach_function :offline_time_left, [ Session ], :int
|
33
|
-
|
34
|
-
|
35
|
-
|
292
|
+
|
293
|
+
# @note if not logged in, the function always return "ZZ".
|
294
|
+
# @param [Session] session
|
295
|
+
# @return [String] currently logged in user's country code
|
296
|
+
# @method session_user_country(session)
|
297
|
+
attach_function :session_user_country, [ Session ], CountryCode
|
298
|
+
|
299
|
+
# Set preferred bitrate for offline playback.
|
300
|
+
#
|
301
|
+
# @param [Session] session
|
302
|
+
# @param [Symbol] bitrate one of :160k, :320k, :96k
|
303
|
+
# @param [Boolean] resync true if libspotify should redownload tracks with new bitrate
|
304
|
+
# @return [Symbol] error code
|
305
|
+
# @method session_preferred_offline_bitrate(session, bitrate, resync)
|
306
|
+
attach_function :session_preferred_offline_bitrate, [ Session, :bitrate, :bool ], APIError
|
307
|
+
|
308
|
+
# Set volume normalization.
|
309
|
+
#
|
310
|
+
# @param [Session] session
|
311
|
+
# @param [Boolean] normalize true if libspotify should attempt to normalize sound volume
|
312
|
+
# @return [Symbol] error code
|
313
|
+
# @method session_set_volume_normalization(session, normalize)
|
314
|
+
attach_function :session_set_volume_normalization, [ Session, :bool ], APIError
|
315
|
+
|
316
|
+
# @see #session_set_volume_normalization
|
317
|
+
# @param [Session] session
|
318
|
+
# @return [Boolean] current volume normalization setting
|
319
|
+
# @method session_get_volume_normalization(session)
|
36
320
|
attach_function :session_get_volume_normalization, [ Session ], :bool
|
37
|
-
|
321
|
+
|
322
|
+
# Force libspotify to write all disk-stored data to disk immediately.
|
323
|
+
#
|
324
|
+
# @note libspotify does this periodically by itself, and on logout, so usually this is not needed.
|
325
|
+
# @param [Session] session
|
326
|
+
# @return [Symbol] error code
|
327
|
+
# @method session_flush_caches(session)
|
328
|
+
attach_function :session_flush_caches, [ Session ], APIError
|
329
|
+
|
330
|
+
# @note if not logged in, the function always return an empty string.
|
331
|
+
# @param [Session] session
|
332
|
+
# @return [String] canonical name for currently logged in user
|
333
|
+
# @method session_user_name(session)
|
38
334
|
attach_function :session_user_name, [ Session ], UTF8String
|
39
|
-
|
335
|
+
|
336
|
+
# Set if private session is enabled.
|
337
|
+
#
|
338
|
+
# This disables sharing of what the user is listening to with Spotify Social, Facebook, and LastFM.
|
339
|
+
# The private session will automatically revert back to normal state after a period of inactivity (6 hours?).
|
340
|
+
#
|
341
|
+
# @param [Session] session
|
342
|
+
# @param [Boolean] enabled true if playback should be private
|
343
|
+
# @return [Symbol] error code
|
344
|
+
# @method session_set_private_session(session, enabled)
|
345
|
+
attach_function :session_set_private_session, [ Session, :bool ], APIError
|
346
|
+
|
347
|
+
# @see #session_set_private_session
|
348
|
+
# @param [Session] session
|
349
|
+
# @return [Boolean] true if private session is enabled
|
350
|
+
# @method session_is_private_session(session)
|
40
351
|
attach_function :session_is_private_session, [ Session ], :bool
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
352
|
+
|
353
|
+
# Set if scrobbling should be enabled.
|
354
|
+
#
|
355
|
+
# @note changing the global settings are currently not supported.
|
356
|
+
# @param [Session] session
|
357
|
+
# @param [Symbol] social_provider one of :spotify, :facebook, or :lastfm
|
358
|
+
# @param [Symbol] scrobbling_state one of :use_global_setting, :local_enabled, :local_disabled, :global_enabled, :global_disabled
|
359
|
+
# @return [Symbol] error code
|
360
|
+
# @method session_set_scrobbling(session, social_provider, scrobbling_state)
|
361
|
+
attach_function :session_set_scrobbling, [ Session, :social_provider, :scrobbling_state ], APIError
|
362
|
+
|
363
|
+
# Retrieve the scrobbling state.
|
364
|
+
#
|
365
|
+
# This makes it possible to find out if scrobbling is locally overrided or if global setting is used.
|
366
|
+
#
|
367
|
+
# @example
|
368
|
+
# Spotify.session_is_scrobbling(session, :spotify) # => :global_enabled
|
369
|
+
#
|
370
|
+
# @param [Session] session
|
371
|
+
# @param [Symbol] social_provider
|
372
|
+
# @return [Symbol] current scrobbling state for the social provider
|
373
|
+
# @method session_is_scrobbling(session, social_provider)
|
374
|
+
attach_function :session_is_scrobbling, [ Session, :social_provider, :buffer_out ], APIError do |session, social_provider|
|
375
|
+
with_buffer(:int) do |state_buffer|
|
376
|
+
error = sp_session_is_scrobbling(session, social_provider, state_buffer)
|
377
|
+
enum_type(:scrobbling_state)[state_buffer.read_int] if error == :ok
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
# Retrieve if it is possible to scrobble to the social provider.
|
382
|
+
#
|
383
|
+
# @example
|
384
|
+
#
|
385
|
+
# @note currently this setting is only relevant to the facebook provider
|
386
|
+
# @param [Session] session
|
387
|
+
# @param [Symbol] social_provider
|
388
|
+
# @return [Boolean] true if scrobbling is possible
|
389
|
+
# @method session_is_scrobbling_possible(session, social_provider)
|
390
|
+
attach_function :session_is_scrobbling_possible, [ Session, :social_provider, :buffer_out ], APIError do |session, social_provider|
|
391
|
+
with_buffer(:char) do |possible_buffer|
|
392
|
+
error = sp_session_is_scrobbling_possible(session, social_provider, possible_buffer)
|
393
|
+
possible_buffer.read_char != 0 if error == :ok
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
# Set the user's credentials for a social provider.
|
398
|
+
#
|
399
|
+
# @see #session_set_scrobbling
|
400
|
+
# @note currently this is only relevenat for LastFm
|
401
|
+
# @note set scrobbling state to true to force an authentication attempt, if it fails the scrobble_error callback will be invoked
|
402
|
+
# @param [Session] session
|
403
|
+
# @param [Symbol] social_provider
|
404
|
+
# @param [String] username
|
405
|
+
# @param [String] password
|
406
|
+
# @return [Symbol] error code
|
407
|
+
# @method session_set_social_credentials(session, social_provider, username, password)
|
408
|
+
attach_function :session_set_social_credentials, [ Session, :social_provider, UTF8String, UTF8String ], APIError
|
45
409
|
end
|
46
410
|
end
|