spotify 12.5.3 → 12.6.0
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.
- 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
|