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,18 +1,96 @@
|
|
1
1
|
module Spotify
|
2
2
|
class API
|
3
3
|
# @!group AlbumBrowse
|
4
|
+
|
5
|
+
# @example
|
6
|
+
# # this is called some time later, as a result of calling {#session_process_events}
|
7
|
+
# browse_callback = proc do |album_browse|
|
8
|
+
# puts "Album browse has completed!"
|
9
|
+
# end
|
10
|
+
# album_browse = Spotify.albumbrowse_create(session, album, browse_callback, nil)
|
11
|
+
#
|
12
|
+
# @note make *very* sure the callback proc is not garbage collected before it is called!
|
13
|
+
# @param [Session] session
|
14
|
+
# @param [Album] album
|
15
|
+
# @param [Proc<AlbumBrowse, FFI::Pointer>] callback
|
16
|
+
# @param [FFI::Pointer] userdata
|
17
|
+
# @return [AlbumBrowse] a request for browsing an album
|
18
|
+
# @method albumbrowse_create(session, album, albumbrowse_complete_callback, userdata)
|
4
19
|
attach_function :albumbrowse_create, [ Session, Album, :albumbrowse_complete_cb, :userdata ], AlbumBrowse
|
20
|
+
|
21
|
+
# @param [AlbumBrowse] album_browse
|
22
|
+
# @return [Boolean] true if the album browse request has completed
|
23
|
+
# @method albumbrowse_is_loaded(album_browse)
|
5
24
|
attach_function :albumbrowse_is_loaded, [ AlbumBrowse ], :bool
|
6
|
-
|
25
|
+
|
26
|
+
# @param [AlbumBrowse] album_browse
|
27
|
+
# @return [Symbol] album browsing error code
|
28
|
+
# @method albumbrowse_error(album_browse)
|
29
|
+
attach_function :albumbrowse_error, [ AlbumBrowse ], APIError
|
30
|
+
|
31
|
+
# @see #albumbrowse_is_loaded
|
32
|
+
# @note the album browse request must have completed, or this function always return nil.
|
33
|
+
# @param [AlbumBrowse] album_browse
|
34
|
+
# @return [Album, nil] the album being browsed
|
35
|
+
# @method albumbrowse_album(album_browse)
|
7
36
|
attach_function :albumbrowse_album, [ AlbumBrowse ], Album
|
37
|
+
|
38
|
+
# @see #albumbrowse_is_loaded
|
39
|
+
# @note the album browse request must have completed, or this function always return nil.
|
40
|
+
# @param [AlbumBrowse] album_browse
|
41
|
+
# @return [Artist, nil] the authoring artist of the album being browsed
|
42
|
+
# @method albumbrowse_artist(album_browse)
|
8
43
|
attach_function :albumbrowse_artist, [ AlbumBrowse ], Artist
|
44
|
+
|
45
|
+
# @see #albumbrowse_is_loaded
|
46
|
+
# @see #albumbrowse_copyright
|
47
|
+
# @note the album browse request must have completed, or this function always return 0.
|
48
|
+
# @param [AlbumBrowse] album_browse
|
49
|
+
# @return [Integer] number of copyright strings on the album being browsed
|
50
|
+
# @method albumbrowse_num_copyrights(album_browse)
|
9
51
|
attach_function :albumbrowse_num_copyrights, [ AlbumBrowse ], :int
|
52
|
+
|
53
|
+
# @see #albumbrowse_is_loaded
|
54
|
+
# @see #albumbrowse_num_copyrights
|
55
|
+
# @note if index is out of range, returns nil.
|
56
|
+
# @param [AlbumBrowse] album_browse
|
57
|
+
# @param [Integer] index number within 0...{#albumbrowse_num_copyrights}
|
58
|
+
# @return [String, nil] the copyright string at index
|
59
|
+
# @method albumbrowse_copyright(album_browse, index)
|
10
60
|
attach_function :albumbrowse_copyright, [ AlbumBrowse, :int ], UTF8String
|
61
|
+
|
62
|
+
# @see #albumbrowse_is_loaded
|
63
|
+
# @see #albumbrowse_track
|
64
|
+
# @note the album browse request must have completed, or this function always return 0.
|
65
|
+
# @param [AlbumBrowse] album_browse
|
66
|
+
# @return [Integer] number of tracks on the album being browsed
|
67
|
+
# @method albumbrowse_num_tracks(album_browse)
|
11
68
|
attach_function :albumbrowse_num_tracks, [ AlbumBrowse ], :int
|
69
|
+
|
70
|
+
# @see #albumbrowse_is_loaded
|
71
|
+
# @see #albumbrowse_num_tracks
|
72
|
+
# @note if index is out of range, returns nil.
|
73
|
+
# @param [AlbumBrowse] album_browse
|
74
|
+
# @param [Integer] index number within 0...{#albumbrowse_num_tracks}
|
75
|
+
# @return [Track, nil] the track at index
|
76
|
+
# @method albumbrowse_track(album_browse, index)
|
12
77
|
attach_function :albumbrowse_track, [ AlbumBrowse, :int ], Track
|
78
|
+
|
79
|
+
# @see #albumbrowse_is_loaded
|
80
|
+
# @note the album browse request must have completed, or this function always return an empty string.
|
81
|
+
# @param [AlbumBrowse] album_browse
|
82
|
+
# @return [String] the review for the album being browsed
|
83
|
+
# @method albumbrowse_review(album_browse)
|
13
84
|
attach_function :albumbrowse_review, [ AlbumBrowse ], UTF8String
|
85
|
+
|
86
|
+
# @see #albumbrowse_is_loaded
|
87
|
+
# @note the album browse request must have completed, or this function will return an undefined value.
|
88
|
+
# @param [AlbumBrowse] album_browse
|
89
|
+
# @return [Integer] the time (in ms) that was spent waiting for the Spotify backend to serve the request, -1 if served from local cache
|
90
|
+
# @method albumbrowse_backend_request_duration(album_browse)
|
14
91
|
attach_function :albumbrowse_backend_request_duration, [ AlbumBrowse ], :int
|
15
|
-
|
16
|
-
attach_function :
|
92
|
+
|
93
|
+
attach_function :albumbrowse_add_ref, [ AlbumBrowse ], APIError
|
94
|
+
attach_function :albumbrowse_release, [ AlbumBrowse ], APIError
|
17
95
|
end
|
18
96
|
end
|
data/lib/spotify/api/artist.rb
CHANGED
@@ -1,10 +1,29 @@
|
|
1
1
|
module Spotify
|
2
2
|
class API
|
3
3
|
# @!group Artist
|
4
|
+
|
5
|
+
# @see #artist_is_loaded
|
6
|
+
# @note the artist must be loaded, or this function always return an empty string.
|
7
|
+
# @param [Artist] artist
|
8
|
+
# @return [String] name of the artist
|
9
|
+
# @method artist_name(artist)
|
4
10
|
attach_function :artist_name, [ Artist ], UTF8String
|
11
|
+
|
12
|
+
# @param [Artist] artist
|
13
|
+
# @return [Boolean] true if the artist is populated with data
|
14
|
+
# @method artist_is_loaded(artist)
|
5
15
|
attach_function :artist_is_loaded, [ Artist ], :bool
|
16
|
+
|
17
|
+
# @see #image_create
|
18
|
+
# @see #artist_is_loaded
|
19
|
+
# @note the artist must be loaded, or this function always return nil.
|
20
|
+
# @param [Artist] artist
|
21
|
+
# @param [Symbol] image_size one of :normal, :small, :large
|
22
|
+
# @return [String, nil] image ID to pass to {#image_create}, or nil if the artist has no image
|
23
|
+
# @method artist_portrait(artist, image_size)
|
6
24
|
attach_function :artist_portrait, [ Artist, :image_size ], ImageID
|
7
|
-
|
8
|
-
attach_function :
|
25
|
+
|
26
|
+
attach_function :artist_add_ref, [ Artist ], APIError
|
27
|
+
attach_function :artist_release, [ Artist ], APIError
|
9
28
|
end
|
10
29
|
end
|
@@ -1,23 +1,141 @@
|
|
1
1
|
module Spotify
|
2
2
|
class API
|
3
3
|
# @!group ArtistBrowse
|
4
|
+
|
5
|
+
# @example
|
6
|
+
# # this is called some time later, as a result of calling {#session_process_events}
|
7
|
+
# browse_callback = proc do |artist_browse|
|
8
|
+
# puts "Artist browse has completed!"
|
9
|
+
# end
|
10
|
+
# artist_browse = Spotify.artistbrowse_create(session, artist, :no_albums, browse_callback, nil)
|
11
|
+
#
|
12
|
+
# @note make *very* sure the callback proc is not garbage collected before it is called!
|
13
|
+
# @param [Session] session
|
14
|
+
# @param [Artist] artist
|
15
|
+
# @param [Symbol] type one of :full, :no_tracks, :no_albums
|
16
|
+
# @param [Proc<ArtistBrowse, FFI::Pointer>] callback
|
17
|
+
# @param [FFI::Pointer] userdata
|
18
|
+
# @return [ArtistBrowse] a request for browsing an artist
|
19
|
+
# @method artistbrowse_create(session, artist, type, callback, userdata)
|
4
20
|
attach_function :artistbrowse_create, [ Session, Artist, :artistbrowse_type, :artistbrowse_complete_cb, :userdata ], ArtistBrowse
|
21
|
+
|
22
|
+
# @param [ArtistBrowse] artist_browse
|
23
|
+
# @return [Boolean] true if the artist browse request has completed
|
24
|
+
# @method artistbrowse_is_loaded(artist_browse)
|
5
25
|
attach_function :artistbrowse_is_loaded, [ ArtistBrowse ], :bool
|
6
|
-
|
26
|
+
|
27
|
+
# @param [ArtistBrowse] artist_browse
|
28
|
+
# @return [Symbol] artist browsing error code
|
29
|
+
# @method artistbrowse_error(artist_browse)
|
30
|
+
attach_function :artistbrowse_error, [ ArtistBrowse ], APIError
|
31
|
+
|
32
|
+
# @see #artistbrowse_is_loaded
|
33
|
+
# @note the artist browse request must have completed, or this function always return nil.
|
34
|
+
# @param [ArtistBrowse] artist_browse
|
35
|
+
# @return [Artist, nil] the artist being browsed
|
36
|
+
# @method artistbrowse_artist(artist_browse)
|
7
37
|
attach_function :artistbrowse_artist, [ ArtistBrowse ], Artist
|
38
|
+
|
39
|
+
# @see #artistbrowse_is_loaded
|
40
|
+
# @see #artistbrowse_portrait
|
41
|
+
# @note the artist browse request must have completed, or this function always return 0.
|
42
|
+
# @param [ArtistBrowse] artist_browse
|
43
|
+
# @return [Integer] number of artist portraits
|
44
|
+
# @method artistbrowse_num_portraits(artist_browse)
|
8
45
|
attach_function :artistbrowse_num_portraits, [ ArtistBrowse ], :int
|
46
|
+
|
47
|
+
# @see #artistbrowse_is_loaded
|
48
|
+
# @see #artistbrowse_num_portraits
|
49
|
+
# @note if index is out of range, returns nil.
|
50
|
+
# @param [ArtistBrowse] artist_browse
|
51
|
+
# @param [Integer] index number within 0...{#artistbrowse_num_portraits}
|
52
|
+
# @return [String, nil] image ID to pass to {#image_create}
|
53
|
+
# @method artistbrowse_portrait(artist_browse, index)
|
9
54
|
attach_function :artistbrowse_portrait, [ ArtistBrowse, :int ], ImageID
|
55
|
+
|
56
|
+
# @see #artistbrowse_is_loaded
|
57
|
+
# @see #artistbrowse_track
|
58
|
+
# @note the artist browse request must have completed, or this function always return 0.
|
59
|
+
# @param [ArtistBrowse] artist_browse
|
60
|
+
# @return [Integer] number of artist tracks
|
61
|
+
# @method artistbrowse_num_tracks(artist_browse)
|
10
62
|
attach_function :artistbrowse_num_tracks, [ ArtistBrowse ], :int
|
63
|
+
|
64
|
+
# @see #artistbrowse_is_loaded
|
65
|
+
# @see #artistbrowse_num_tracks
|
66
|
+
# @note if index is out of range, returns nil.
|
67
|
+
# @param [ArtistBrowse] artist_browse
|
68
|
+
# @param [Integer] index number within 0...{#artistbrowse_num_tracks}
|
69
|
+
# @return [Track, nil] the track at index
|
70
|
+
# @method artistbrowse_track(artist_browse, index)
|
11
71
|
attach_function :artistbrowse_track, [ ArtistBrowse, :int ], Track
|
72
|
+
|
73
|
+
# @see #artistbrowse_is_loaded
|
74
|
+
# @see #artistbrowse_album
|
75
|
+
# @note the artist browse request must have completed, or this function always return 0.
|
76
|
+
# @param [ArtistBrowse] artist_browse
|
77
|
+
# @return [Integer] number of artist albums
|
78
|
+
# @method artistbrowse_num_albums(artist_browse)
|
12
79
|
attach_function :artistbrowse_num_albums, [ ArtistBrowse ], :int
|
80
|
+
|
81
|
+
# @see #artistbrowse_is_loaded
|
82
|
+
# @see #artistbrowse_num_albums
|
83
|
+
# @note if index is out of range, returns nil.
|
84
|
+
# @param [ArtistBrowse] artist_browse
|
85
|
+
# @param [Integer] index number within 0...{#artistbrowse_num_albums}
|
86
|
+
# @return [Track, nil] the album at index
|
87
|
+
# @method artistbrowse_album(artist_browse, index)
|
13
88
|
attach_function :artistbrowse_album, [ ArtistBrowse, :int ], Album
|
89
|
+
|
90
|
+
# @see #artistbrowse_is_loaded
|
91
|
+
# @see #artistbrowse_similar_artist
|
92
|
+
# @note the artist browse request must have completed, or this function always return 0.
|
93
|
+
# @param [ArtistBrowse] artist_browse
|
94
|
+
# @return [Integer] number of similar artists
|
95
|
+
# @method artistbrowse_num_similar_artists(artist_browse)
|
14
96
|
attach_function :artistbrowse_num_similar_artists, [ ArtistBrowse ], :int
|
97
|
+
|
98
|
+
# @see #artistbrowse_is_loaded
|
99
|
+
# @see #artistbrowse_num_similar_artists
|
100
|
+
# @note if index is out of range, returns nil.
|
101
|
+
# @param [ArtistBrowse] artist_browse
|
102
|
+
# @param [Integer] index number within 0...{#artistbrowse_num_similar_artists}
|
103
|
+
# @return [Track, nil] a similar artist at index
|
104
|
+
# @method artistbrowse_similar_artist(artist_browse, index)
|
15
105
|
attach_function :artistbrowse_similar_artist, [ ArtistBrowse, :int ], Artist
|
106
|
+
|
107
|
+
# @see #artistbrowse_is_loaded
|
108
|
+
# @note the artist browse request must have completed, or this function always return an empty string.
|
109
|
+
# @param [ArtistBrowse] artist_browse
|
110
|
+
# @return [String] the review for the artist being browsed
|
111
|
+
# @method artistbrowse_biography(artist_browse)
|
16
112
|
attach_function :artistbrowse_biography, [ ArtistBrowse ], UTF8String
|
113
|
+
|
114
|
+
# @see #artistbrowse_is_loaded
|
115
|
+
# @note the artist browse request must have completed, or this function will return an undefined value.
|
116
|
+
# @param [ArtistBrowse] artist_browse
|
117
|
+
# @return [Integer] the time (in ms) that was spent waiting for the Spotify backend to serve the request, -1 if served from local cache
|
118
|
+
# @method artistbrowse_backend_request_duration(artist_browse)
|
17
119
|
attach_function :artistbrowse_backend_request_duration, [ ArtistBrowse ], :int
|
120
|
+
|
121
|
+
# @see #artistbrowse_is_loaded
|
122
|
+
# @see #artistbrowse_tophit_track
|
123
|
+
# @note the artist browse request must have completed, or this function always return 0.
|
124
|
+
# @param [ArtistBrowse] artist_browse
|
125
|
+
# @return [Integer] number of tophit tracks
|
126
|
+
# @method artistbrowse_num_tophit_tracks(artist_browse)
|
18
127
|
attach_function :artistbrowse_num_tophit_tracks, [ ArtistBrowse ], :int
|
128
|
+
|
129
|
+
# @see #artistbrowse_is_loaded
|
130
|
+
# @see #artistbrowse_num_tophit_tracks
|
131
|
+
# @note if index is out of range, returns nil.
|
132
|
+
# @param [ArtistBrowse] artist_browse
|
133
|
+
# @param [Integer] index number within 0...{#artistbrowse_num_tophit_tracks}
|
134
|
+
# @return [Track, nil] the tophit track at index
|
135
|
+
# @method artistbrowse_tophit_track(artist_browse, index)
|
19
136
|
attach_function :artistbrowse_tophit_track, [ ArtistBrowse, :int ], Track
|
20
|
-
|
21
|
-
attach_function :
|
137
|
+
|
138
|
+
attach_function :artistbrowse_add_ref, [ ArtistBrowse ], APIError
|
139
|
+
attach_function :artistbrowse_release, [ ArtistBrowse ], APIError
|
22
140
|
end
|
23
141
|
end
|
data/lib/spotify/api/error.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
module Spotify
|
2
2
|
class API
|
3
3
|
# @!group Error
|
4
|
-
|
4
|
+
|
5
|
+
# @param [Error] error
|
6
|
+
# @return [String] explanatory error message for an error code
|
7
|
+
# @method error_message(error)
|
8
|
+
attach_function :error_message, [ APIError ], UTF8String
|
5
9
|
end
|
6
10
|
end
|
data/lib/spotify/api/image.rb
CHANGED
@@ -1,16 +1,82 @@
|
|
1
1
|
module Spotify
|
2
2
|
class API
|
3
3
|
# @!group Image
|
4
|
+
|
5
|
+
# @param [Session] session
|
6
|
+
# @param [String] image_id
|
7
|
+
# @return [Image] image from an image id
|
8
|
+
# @method image_create(session, image_id)
|
4
9
|
attach_function :image_create, [ Session, ImageID ], Image
|
5
|
-
|
6
|
-
|
10
|
+
|
11
|
+
# Add a callback that will be invoked when the image is loaded.
|
12
|
+
#
|
13
|
+
# @note make *very* sure the callback proc is not garbage collected before it is called!
|
14
|
+
# @see #image_remove_load_callback
|
15
|
+
# @param [Image] image
|
16
|
+
# @param [Proc<Image, FFI::Pointer>] callback
|
17
|
+
# @param [FFI::Pointer] userdata
|
18
|
+
# @return [Symbol] error code
|
19
|
+
# @method image_add_load_callback(image, callback, userdata)
|
20
|
+
attach_function :image_add_load_callback, [ Image, :image_loaded_cb, :userdata ], APIError
|
21
|
+
|
22
|
+
# Remove an image load callback previously added with {#image_add_load_callback}.
|
23
|
+
#
|
24
|
+
# @see #image_add_load_callback
|
25
|
+
# @param [Image] image
|
26
|
+
# @param [Proc<Image, FFI::Pointer>] callback
|
27
|
+
# @param [FFI::Pointer] userdata
|
28
|
+
# @return [Symbol] error code
|
29
|
+
# @method image_remove_load_callback(image, callback, userdata)
|
30
|
+
attach_function :image_remove_load_callback, [ Image, :image_loaded_cb, :userdata ], APIError
|
31
|
+
|
32
|
+
# @note Images that don't exist in Spotify can also return true.
|
33
|
+
# @param [Image] image
|
34
|
+
# @return [Boolean] true if the image information has been retrieved
|
35
|
+
# @method image_is_loaded(image)
|
7
36
|
attach_function :image_is_loaded, [ Image ], :bool
|
8
|
-
|
37
|
+
|
38
|
+
# @param [Image] image
|
39
|
+
# @return [Symbol] image error code
|
40
|
+
# @method image_error(image)
|
41
|
+
attach_function :image_error, [ Image ], APIError
|
42
|
+
|
43
|
+
# @see #image_is_loaded
|
44
|
+
# @note the image must be loaded, or this function always return :unknown.
|
45
|
+
# @param [Image] image
|
46
|
+
# @return [Symbol] image format, one of :unknown, or :jpeg
|
47
|
+
# @method image_format(image)
|
9
48
|
attach_function :image_format, [ Image ], :imageformat
|
10
|
-
|
49
|
+
|
50
|
+
# Retrieves raw image data.
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# Spotify.image_data(image) # => "\xFF\xD8\xFF\xE0…
|
54
|
+
#
|
55
|
+
# @see #image_is_loaded
|
56
|
+
# @note the image must be loaded, or this function always return nil.
|
57
|
+
# @param [Image] image
|
58
|
+
# @return [String, nil] raw image data, or nil if no image data available
|
59
|
+
# @method image_data(image)
|
60
|
+
attach_function :image_data, [ Image, :buffer_out ], :pointer do |image|
|
61
|
+
with_buffer(:size_t, clear: true) do |image_size_buffer|
|
62
|
+
data = sp_image_data(image, image_size_buffer)
|
63
|
+
image_size = image_size_buffer.read_size_t
|
64
|
+
data.read_bytes(image_size) if image_size > 0
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# @param [Image] image
|
69
|
+
# @return [String] image id
|
70
|
+
# @method image_image_id(image)
|
11
71
|
attach_function :image_image_id, [ Image ], ImageID
|
72
|
+
|
73
|
+
# @param [Session] session
|
74
|
+
# @param [Link] link
|
75
|
+
# @return [Image, nil] image pointed to by link, or nil if link is not a valid image link
|
76
|
+
# @method image_create_from_link(session, link)
|
12
77
|
attach_function :image_create_from_link, [ Session, Link ], Image
|
13
|
-
|
14
|
-
attach_function :
|
78
|
+
|
79
|
+
attach_function :image_add_ref, [ Image ], APIError
|
80
|
+
attach_function :image_release, [ Image ], APIError
|
15
81
|
end
|
16
82
|
end
|
data/lib/spotify/api/inbox.rb
CHANGED
@@ -1,9 +1,38 @@
|
|
1
1
|
module Spotify
|
2
2
|
class API
|
3
3
|
# @!group Inbox
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
|
5
|
+
# Post an array of tracks to a Spotify user's inbox.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# callback = proc do |inbox|
|
9
|
+
# puts "Message posted."
|
10
|
+
# end
|
11
|
+
# inbox = Spotify.inbox_post_tracks(session, "burgestrand", tracks, "You must listen to these!", callback, nil)
|
12
|
+
#
|
13
|
+
# @param [Session] session
|
14
|
+
# @param [String] username canonical username of recipient
|
15
|
+
# @param [Array<Track>, Track] tracks
|
16
|
+
# @param [String] message message to attach to post
|
17
|
+
# @param [Proc<Inbox, FFI::Pointer] callback to call on completion
|
18
|
+
# @param [FFI::Pointer] userdata
|
19
|
+
# @return [Inbox]
|
20
|
+
# @method inbox_post_tracks(session, username, tracks, message, callback, userdata)
|
21
|
+
attach_function :inbox_post_tracks, [ Session, UTF8String, :array, :int, UTF8String, :inboxpost_complete_cb, :userdata ], Inbox do |session, username, tracks, message, callback, userdata|
|
22
|
+
tracks = Array(tracks)
|
23
|
+
|
24
|
+
with_buffer(Spotify::Track, size: tracks.length) do |tracks_buffer|
|
25
|
+
tracks_buffer.write_array_of_pointer(tracks)
|
26
|
+
sp_inbox_post_tracks(session, username, tracks_buffer, tracks.length, message, callback, userdata)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param [Inbox] inbox
|
31
|
+
# @return [Symbol] error status of inbox post
|
32
|
+
# @method inbox_error(inbox)
|
33
|
+
attach_function :inbox_error, [ Inbox ], APIError
|
34
|
+
|
35
|
+
attach_function :inbox_add_ref, [ Inbox ], APIError
|
36
|
+
attach_function :inbox_release, [ Inbox ], APIError
|
8
37
|
end
|
9
38
|
end
|
data/lib/spotify/api/link.rb
CHANGED
@@ -1,25 +1,138 @@
|
|
1
1
|
module Spotify
|
2
2
|
class API
|
3
3
|
# @!group Link
|
4
|
+
|
5
|
+
# Create a Link from a Spotify URI or Spotify HTTP URL.
|
6
|
+
#
|
7
|
+
# @param [String] spotify_uri can be regular spotify URI, or spotify HTTP URL
|
8
|
+
# @return [Link]
|
9
|
+
# @method link_create_from_string(spotify_uri)
|
4
10
|
attach_function :link_create_from_string, [ BestEffortString ], Link
|
11
|
+
|
12
|
+
# @param [Track] track
|
13
|
+
# @param [Integer] offset number of milliseconds into track to link to
|
14
|
+
# @return [Link, nil]
|
15
|
+
# @method link_create_from_track(track, offset)
|
5
16
|
attach_function :link_create_from_track, [ Track, :int ], Link
|
17
|
+
|
18
|
+
# @param [Album] album
|
19
|
+
# @return [Link, nil]
|
20
|
+
# @method link_create_from_album(album)
|
6
21
|
attach_function :link_create_from_album, [ Album ], Link
|
22
|
+
|
23
|
+
# @param [Artist] artist
|
24
|
+
# @return [Link, nil]
|
25
|
+
# @method link_create_from_artist(artist)
|
7
26
|
attach_function :link_create_from_artist, [ Artist ], Link
|
27
|
+
|
28
|
+
# @param [Search] search
|
29
|
+
# @return [Link, nil]
|
30
|
+
# @method link_create_from_search(search)
|
8
31
|
attach_function :link_create_from_search, [ Search ], Link
|
32
|
+
|
33
|
+
# @param [Playlist] playlist
|
34
|
+
# @return [Link, nil]
|
35
|
+
# @method link_create_from_playlist(playlist)
|
9
36
|
attach_function :link_create_from_playlist, [ Playlist ], Link
|
37
|
+
|
38
|
+
# @param [Artist] artist
|
39
|
+
# @param [Symbol] image_size one of :normal, :small, :large
|
40
|
+
# @return [Link, nil]
|
41
|
+
# @method link_create_from_artist_portrait(artist, image_size)
|
10
42
|
attach_function :link_create_from_artist_portrait, [ Artist, :image_size ], Link
|
43
|
+
|
44
|
+
# @see #artistbrowse_num_portraits
|
45
|
+
# @param [ArtistBrowse] artist_browse
|
46
|
+
# @param [Integer] index number within 0...{#artistbrowse_num_portraits}
|
47
|
+
# @return [Link, nil]
|
48
|
+
# @method link_create_from_artistbrowse_portrait(artist_browse, index)
|
11
49
|
attach_function :link_create_from_artistbrowse_portrait, [ ArtistBrowse, :int ], Link
|
50
|
+
|
51
|
+
# @param [Album] album
|
52
|
+
# @param [Symbol] image_size one of :normal, :small, :large
|
53
|
+
# @return [Link, nil]
|
54
|
+
# @method link_create_from_album_cover(album, image_size)
|
12
55
|
attach_function :link_create_from_album_cover, [ Album, :image_size ], Link
|
56
|
+
|
57
|
+
# @example image id from spotify URI
|
58
|
+
# image_id = ":\xD94#\xAD\xD9\x97f\xE0-V6\x05\xC6\xE7n\xD2\xB0\xE4P"
|
59
|
+
# image_uri = "spotify:image:3ad93423add99766e02d563605c6e76ed2b0e450"
|
60
|
+
# image = Spotify.image_create(session, image_id)
|
61
|
+
# image_link = Spotify.link_create_from_image(image)
|
62
|
+
#
|
63
|
+
# # And here are some cool equivalents:
|
64
|
+
# image_id == ["3ad93423add99766e02d563605c6e76ed2b0e450"].pack("H40")
|
65
|
+
# image_uri == "spotify:image:#{image_id.unpack("H40")[0]}"
|
66
|
+
# image_link == Spotify.link_create_from_string(image_uri)
|
67
|
+
# image == Spotify.image_create_from_link(session, image_link)
|
68
|
+
#
|
69
|
+
# @param [Image] image
|
70
|
+
# @return [Link]
|
71
|
+
# @method link_create_from_image(image)
|
13
72
|
attach_function :link_create_from_image, [ Image ], Link
|
73
|
+
|
74
|
+
# @param [User] user
|
75
|
+
# @return [Link]
|
76
|
+
# @method link_create_from_user(user)
|
14
77
|
attach_function :link_create_from_user, [ User ], Link
|
15
|
-
|
78
|
+
|
79
|
+
# Retrieve string representation of link.
|
80
|
+
#
|
81
|
+
# @example
|
82
|
+
# Spotify.link_as_string(link) # => "spotify:user:burgestrand"
|
83
|
+
#
|
84
|
+
# @param [Link] link
|
85
|
+
# @return [String] string representation of the link
|
86
|
+
# @method link_as_string(link)
|
87
|
+
attach_function :link_as_string, [ Link, :buffer_out, :int ], :int do |link|
|
88
|
+
link_length = sp_link_as_string(link, nil, 0)
|
89
|
+
with_string_buffer(link_length) do |string_buffer, size|
|
90
|
+
sp_link_as_string(link, string_buffer, size)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# @param [Link] link
|
95
|
+
# @return [Symbol] type of link, one of :invalid, :track, :album, :artist, :search, :playlist, :profile, :starred, :localtrack, :image
|
96
|
+
# @method link_type(link)
|
16
97
|
attach_function :link_type, [ Link ], :linktype
|
98
|
+
|
99
|
+
# @param [Link] link
|
100
|
+
# @return [Track, nil] track pointed to by the link, or nil if not a track
|
101
|
+
# @method link_as_track(link)
|
17
102
|
attach_function :link_as_track, [ Link ], Track
|
18
|
-
|
103
|
+
|
104
|
+
# @example
|
105
|
+
# Spotify.link_as_track_and_offset(link) # => [track, 1337]
|
106
|
+
#
|
107
|
+
# @note if the link is not a track link, this method returns nil.
|
108
|
+
# @note if no track offset is available in the link, the offset out will always be set to 0.
|
109
|
+
#
|
110
|
+
# @param [Link] link
|
111
|
+
# @return [Array<Track, Integer>, nil] track and offset (in ms) as a tuple, or nil
|
112
|
+
# @method link_as_track_and_offset(link)
|
113
|
+
attach_function :link_as_track_and_offset, [ Link, :buffer_out ], Track do |link|
|
114
|
+
with_buffer(:int) do |offset_buffer|
|
115
|
+
track = sp_link_as_track_and_offset(link, offset_buffer)
|
116
|
+
[track, offset_buffer.read_int] if track
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# @param [Link] link
|
121
|
+
# @return [Album, nil] album pointed to by the link, or nil if not an album
|
122
|
+
# @method link_as_album(link)
|
19
123
|
attach_function :link_as_album, [ Link ], Album
|
124
|
+
|
125
|
+
# @param [Link] link
|
126
|
+
# @return [Artist, nil] artist pointed to by the link, or nil if not an artist
|
127
|
+
# @method link_as_artist(link)
|
20
128
|
attach_function :link_as_artist, [ Link ], Artist
|
129
|
+
|
130
|
+
# @param [Link] link
|
131
|
+
# @return [User, nil] user pointed to by the link, or nil if not a user
|
132
|
+
# @method link_as_user(link)
|
21
133
|
attach_function :link_as_user, [ Link ], User
|
22
|
-
|
23
|
-
attach_function :
|
134
|
+
|
135
|
+
attach_function :link_add_ref, [ Link ], APIError
|
136
|
+
attach_function :link_release, [ Link ], APIError
|
24
137
|
end
|
25
138
|
end
|