hallon 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -0
- data/CHANGELOG +43 -0
- data/Gemfile +2 -0
- data/README.markdown +21 -13
- data/Rakefile +84 -23
- data/dev/login.rb +16 -0
- data/examples/adding_tracks_to_playlist.rb +49 -0
- data/examples/logging_in.rb +1 -6
- data/examples/show_published_playlists_of_user.rb +9 -19
- data/hallon.gemspec +1 -1
- data/lib/hallon.rb +3 -2
- data/lib/hallon/album.rb +55 -41
- data/lib/hallon/album_browse.rb +41 -37
- data/lib/hallon/artist.rb +30 -21
- data/lib/hallon/artist_browse.rb +59 -41
- data/lib/hallon/base.rb +68 -5
- data/lib/hallon/enumerator.rb +1 -0
- data/lib/hallon/error.rb +3 -0
- data/lib/hallon/ext/spotify.rb +169 -36
- data/lib/hallon/image.rb +30 -44
- data/lib/hallon/link.rb +29 -43
- data/lib/hallon/linkable.rb +68 -20
- data/lib/hallon/observable.rb +0 -1
- data/lib/hallon/player.rb +21 -7
- data/lib/hallon/playlist.rb +291 -0
- data/lib/hallon/playlist_container.rb +27 -0
- data/lib/hallon/search.rb +52 -45
- data/lib/hallon/session.rb +129 -81
- data/lib/hallon/toplist.rb +37 -19
- data/lib/hallon/track.rb +68 -45
- data/lib/hallon/user.rb +69 -33
- data/lib/hallon/version.rb +1 -1
- data/spec/hallon/album_browse_spec.rb +15 -9
- data/spec/hallon/album_spec.rb +15 -15
- data/spec/hallon/artist_browse_spec.rb +28 -9
- data/spec/hallon/artist_spec.rb +30 -14
- data/spec/hallon/enumerator_spec.rb +0 -1
- data/spec/hallon/hallon_spec.rb +20 -1
- data/spec/hallon/image_spec.rb +18 -41
- data/spec/hallon/link_spec.rb +10 -12
- data/spec/hallon/linkable_spec.rb +37 -18
- data/spec/hallon/player_spec.rb +8 -0
- data/spec/hallon/playlist_container_spec.rb +75 -0
- data/spec/hallon/playlist_spec.rb +204 -0
- data/spec/hallon/search_spec.rb +19 -16
- data/spec/hallon/session_spec.rb +61 -29
- data/spec/hallon/spotify_spec.rb +30 -0
- data/spec/hallon/toplist_spec.rb +22 -14
- data/spec/hallon/track_spec.rb +62 -21
- data/spec/hallon/user_spec.rb +47 -36
- data/spec/mockspotify.rb +35 -10
- data/spec/mockspotify/mockspotify_spec.rb +22 -0
- data/spec/spec_helper.rb +7 -3
- data/spec/support/common_objects.rb +91 -16
- data/spec/support/shared_for_linkable_objects.rb +39 -0
- metadata +30 -20
- data/Termfile +0 -7
- data/lib/hallon/synchronizable.rb +0 -32
- data/spec/hallon/synchronizable_spec.rb +0 -19
data/lib/hallon/album.rb
CHANGED
@@ -1,85 +1,99 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
module Hallon
|
2
3
|
# Albums are non-detailed metadata about actual music albums.
|
3
4
|
#
|
4
5
|
# To retrieve copyrights, album review and tracks you need to browse
|
5
|
-
# the album
|
6
|
-
#
|
6
|
+
# the album. You do this by calling {Album#browse} to retrieve an
|
7
|
+
# {AlbumBrowse} instance.
|
7
8
|
#
|
8
|
-
#
|
9
|
+
# It does still allow you to query some metadata information, such as
|
10
|
+
# its’ {#name}, {#release_year}, {#type}, {#artist}, {#cover}…
|
11
|
+
#
|
12
|
+
# @note Pretty much all methods require the album to be {Album#loaded?}
|
13
|
+
# to return meaningful results.
|
9
14
|
#
|
10
15
|
# @see http://developer.spotify.com/en/libspotify/docs/group__album.html
|
11
16
|
class Album < Base
|
12
|
-
#
|
17
|
+
# @example
|
18
|
+
#
|
19
|
+
# Hallon::Album.types # => [:album, :single, :compilation, :unknown]
|
20
|
+
#
|
21
|
+
# @return [Array<Symbol>] an array of different kinds of albums (compilations, singles, …)
|
13
22
|
def self.types
|
14
23
|
Spotify.enum_type(:albumtype).symbols
|
15
24
|
end
|
16
25
|
|
17
26
|
extend Linkable
|
18
27
|
|
19
|
-
from_link :as_album
|
20
28
|
to_link :from_album
|
21
29
|
|
30
|
+
from_link :as_album
|
31
|
+
|
22
32
|
# Construct an Album from a link.
|
23
33
|
#
|
24
|
-
# @
|
34
|
+
# @example from a spotify URI
|
35
|
+
#
|
36
|
+
# album = Hallon::Album.new("spotify:album:6TECAywzyJGh0kwxfeBgGc")
|
37
|
+
#
|
38
|
+
# @example from a link
|
39
|
+
#
|
40
|
+
# link = Hallon::Link.new("spotify:album:6TECAywzyJGh0kwxfeBgGc")
|
41
|
+
# album = Hallon::Album.new(link)
|
42
|
+
#
|
43
|
+
# @param [String, Link, Spotify::Pointer] link
|
25
44
|
def initialize(link)
|
26
|
-
@pointer =
|
45
|
+
@pointer = to_pointer(link, :album)
|
27
46
|
end
|
28
47
|
|
29
|
-
#
|
30
|
-
#
|
31
|
-
# @return [String]
|
48
|
+
# @return [String] name of the album.
|
32
49
|
def name
|
33
|
-
Spotify.album_name(
|
50
|
+
Spotify.album_name(pointer)
|
34
51
|
end
|
35
52
|
|
36
|
-
#
|
37
|
-
|
38
|
-
|
39
|
-
def year
|
40
|
-
Spotify.album_year(@pointer)
|
53
|
+
# @return [Integer] release year of the album.
|
54
|
+
def release_year
|
55
|
+
Spotify.album_year(pointer)
|
41
56
|
end
|
42
57
|
|
43
|
-
#
|
44
|
-
#
|
45
|
-
# @return [Symbol] one of {Album.types}
|
58
|
+
# @see Album.types
|
59
|
+
# @return [Symbol] album type.
|
46
60
|
def type
|
47
|
-
Spotify.album_type(
|
61
|
+
Spotify.album_type(pointer)
|
48
62
|
end
|
49
63
|
|
50
|
-
#
|
51
|
-
#
|
52
|
-
# @return [Boolean]
|
64
|
+
# @return [Boolean] true if the album is available.
|
53
65
|
def available?
|
54
|
-
Spotify.album_is_available(
|
66
|
+
Spotify.album_is_available(pointer)
|
55
67
|
end
|
56
68
|
|
57
|
-
#
|
58
|
-
#
|
59
|
-
# @return [Boolean]
|
69
|
+
# @return [Boolean] true if the album is loaded.
|
60
70
|
def loaded?
|
61
|
-
Spotify.album_is_loaded(
|
71
|
+
Spotify.album_is_loaded(pointer)
|
62
72
|
end
|
63
73
|
|
64
|
-
#
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
image_id = Spotify.album_cover(@pointer)
|
69
|
-
Image.new(image_id.read_string(20)) unless image_id.null?
|
74
|
+
# @return [Artist, nil] album artist.
|
75
|
+
def artist
|
76
|
+
artist = Spotify.album_artist!(pointer)
|
77
|
+
Artist.new(artist) unless artist.null?
|
70
78
|
end
|
71
79
|
|
72
|
-
#
|
80
|
+
# Retrieves album cover art as an {Image} or a {Link}.
|
73
81
|
#
|
74
|
-
# @
|
75
|
-
|
76
|
-
|
77
|
-
|
82
|
+
# @param [Boolean] as_image true if you want it as an {Image}.
|
83
|
+
# @return [Image, Link, nil] album cover, the link to it, or nil.
|
84
|
+
def cover(as_image = true)
|
85
|
+
if as_image
|
86
|
+
image_id = Spotify.album_cover(pointer)
|
87
|
+
Image.new(image_id.read_string(20)) unless image_id.null?
|
88
|
+
else
|
89
|
+
link = Spotify.link_create_from_album_cover!(pointer)
|
90
|
+
Link.new(link)
|
91
|
+
end
|
78
92
|
end
|
79
93
|
|
80
|
-
#
|
94
|
+
# Browse the Album by creating an {AlbumBrowse} instance from it.
|
81
95
|
#
|
82
|
-
# @return [AlbumBrowse]
|
96
|
+
# @return [AlbumBrowse] an album browsing object
|
83
97
|
def browse
|
84
98
|
AlbumBrowse.new(pointer)
|
85
99
|
end
|
data/lib/hallon/album_browse.rb
CHANGED
@@ -1,18 +1,9 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
module Hallon
|
2
3
|
# AlbumBrowse objects are for retrieving additional data from
|
3
4
|
# an album that cannot otherwise be acquired. This includes
|
4
5
|
# tracks, reviews, copyright information.
|
5
6
|
#
|
6
|
-
# AlbumBrowse object triggers the `:load` callback on itself
|
7
|
-
# when it loads.
|
8
|
-
#
|
9
|
-
# @example
|
10
|
-
# browse = album.browse # album is a Hallon::Album
|
11
|
-
# browse.on(:load) do
|
12
|
-
# puts "Album browser for #{browse.album.name} has been loaded!"
|
13
|
-
# end
|
14
|
-
# session.wait_for { browse.loaded? } # will eventually trigger above callback
|
15
|
-
#
|
16
7
|
# @see Album
|
17
8
|
# @see http://developer.spotify.com/en/libspotify/docs/group__albumbrowse.html
|
18
9
|
class AlbumBrowse < Base
|
@@ -20,58 +11,71 @@ module Hallon
|
|
20
11
|
|
21
12
|
# Creates an AlbumBrowse instance from an Album or an Album pointer.
|
22
13
|
#
|
23
|
-
# @note
|
24
|
-
# @param [Album,
|
14
|
+
# @note Also {Album#browse} to browse an Album.
|
15
|
+
# @param [Album, Spotify::Pointer] album
|
25
16
|
def initialize(album)
|
26
|
-
|
27
|
-
|
17
|
+
pointer = album
|
18
|
+
pointer = pointer.pointer if pointer.respond_to?(:pointer)
|
19
|
+
|
20
|
+
unless Spotify::Pointer.typechecks?(pointer, :album)
|
21
|
+
given = pointer.respond_to?(:type) ? pointer.type : pointer.inspect
|
22
|
+
raise TypeError, "expected album pointer, was given #{given}"
|
23
|
+
end
|
28
24
|
|
29
|
-
|
30
|
-
@pointer
|
25
|
+
@callback = proc { trigger(:load) }
|
26
|
+
@pointer = Spotify.albumbrowse_create!(session.pointer, pointer, @callback, nil)
|
31
27
|
end
|
32
28
|
|
33
|
-
# @return [Boolean] true if the album is loaded
|
29
|
+
# @return [Boolean] true if the album browser is loaded.
|
34
30
|
def loaded?
|
35
|
-
Spotify.albumbrowse_is_loaded(
|
31
|
+
Spotify.albumbrowse_is_loaded(pointer)
|
36
32
|
end
|
37
33
|
|
38
|
-
# @see Error
|
39
|
-
# @return [Symbol] album browser error status
|
40
|
-
def
|
41
|
-
Spotify.albumbrowse_error(
|
34
|
+
# @see Error.explain
|
35
|
+
# @return [Symbol] album browser error status.
|
36
|
+
def status
|
37
|
+
Spotify.albumbrowse_error(pointer)
|
42
38
|
end
|
43
39
|
|
44
|
-
# @return [String] album review
|
40
|
+
# @return [String] album review.
|
45
41
|
def review
|
46
|
-
Spotify.albumbrowse_review(
|
42
|
+
Spotify.albumbrowse_review(pointer)
|
47
43
|
end
|
48
44
|
|
49
|
-
# @return [Artist] artist performing this album
|
45
|
+
# @return [Artist, nil] artist performing this album.
|
50
46
|
def artist
|
51
|
-
|
52
|
-
Artist.new(
|
47
|
+
artist = Spotify.albumbrowse_artist!(pointer)
|
48
|
+
Artist.new(artist) unless artist.null?
|
53
49
|
end
|
54
50
|
|
55
|
-
# @return [Album] album this object is browsing
|
51
|
+
# @return [Album, nil] album this object is browsing.
|
56
52
|
def album
|
57
|
-
|
58
|
-
Album.new(
|
53
|
+
album = Spotify.albumbrowse_album!(pointer)
|
54
|
+
Album.new(album) unless album.null?
|
55
|
+
end
|
56
|
+
|
57
|
+
# @note If the object is not loaded, the result is undefined.
|
58
|
+
# @note Returns nil if the request was served from the local libspotify cache.
|
59
|
+
# @return [Rational, nil] time it took for the albumbrowse request to complete (in seconds).
|
60
|
+
def request_duration
|
61
|
+
duration = Spotify.albumbrowse_backend_request_duration(pointer)
|
62
|
+
Rational(duration, 1000) if duration > 0
|
59
63
|
end
|
60
64
|
|
61
|
-
# @return [Enumerator<String>] list of copyright notices
|
65
|
+
# @return [Enumerator<String>] list of copyright notices.
|
62
66
|
def copyrights
|
63
|
-
size = Spotify.albumbrowse_num_copyrights(
|
67
|
+
size = Spotify.albumbrowse_num_copyrights(pointer)
|
64
68
|
Enumerator.new(size) do |i|
|
65
|
-
Spotify.albumbrowse_copyright(
|
69
|
+
Spotify.albumbrowse_copyright(pointer, i)
|
66
70
|
end
|
67
71
|
end
|
68
72
|
|
69
|
-
# @return [Enumerator<Track>] list of tracks
|
73
|
+
# @return [Enumerator<Track>] list of tracks.
|
70
74
|
def tracks
|
71
|
-
size = Spotify.albumbrowse_num_tracks(
|
75
|
+
size = Spotify.albumbrowse_num_tracks(pointer)
|
72
76
|
Enumerator.new(size) do |i|
|
73
|
-
|
74
|
-
Track.new(
|
77
|
+
track = Spotify.albumbrowse_track!(pointer, i)
|
78
|
+
Track.new(track) unless track.null?
|
75
79
|
end
|
76
80
|
end
|
77
81
|
end
|
data/lib/hallon/artist.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
module Hallon
|
2
3
|
# Artists in Hallon are the people behind the songs. Methods
|
3
4
|
# are defined for retrieving their names and loaded status.
|
4
5
|
#
|
5
|
-
# To retrieve more information about an artist, you can browse
|
6
|
+
# To retrieve more information about an artist, you can {#browse}
|
6
7
|
# it. This will give access to more detailed data such as bio,
|
7
|
-
# portraits and more.
|
8
|
-
# but you can use the underlying Spotify API for this, just like
|
9
|
-
# we have for {Album}s.
|
8
|
+
# portraits and more.
|
10
9
|
#
|
11
10
|
# Both Albums and Tracks can have more than one artist.
|
12
11
|
#
|
@@ -17,43 +16,53 @@ module Hallon
|
|
17
16
|
from_link :as_artist
|
18
17
|
to_link :from_artist
|
19
18
|
|
20
|
-
# Construct an
|
19
|
+
# Construct an Artist from a link.
|
20
|
+
#
|
21
|
+
# @example from a spotify URI
|
22
|
+
#
|
23
|
+
# artist = Hallon::Artist.new("spotify:artist:6uSKeCyQEhvPC2NODgiqFE")
|
24
|
+
#
|
25
|
+
# @example from a link
|
26
|
+
#
|
27
|
+
# link = Hallon::Link.new("spotify:artist:6uSKeCyQEhvPC2NODgiqFE")
|
28
|
+
# artist = Hallon::Artist.new(link)
|
21
29
|
#
|
22
30
|
# @param [String, Link, FFI::Pointer] link
|
23
31
|
def initialize(link)
|
24
|
-
@pointer =
|
32
|
+
@pointer = to_pointer(link, :artist)
|
25
33
|
end
|
26
34
|
|
27
|
-
#
|
28
|
-
#
|
29
|
-
# @return [String]
|
35
|
+
# @return [String] name of the artist.
|
30
36
|
def name
|
31
|
-
Spotify.artist_name(
|
37
|
+
Spotify.artist_name(pointer)
|
32
38
|
end
|
33
39
|
|
34
|
-
#
|
35
|
-
#
|
36
|
-
# @return [Boolean]
|
40
|
+
# @return [Boolean] true if the artist is loaded.
|
37
41
|
def loaded?
|
38
|
-
Spotify.artist_is_loaded(
|
42
|
+
Spotify.artist_is_loaded(pointer)
|
39
43
|
end
|
40
44
|
|
45
|
+
# Retrieve artist portrait as an {Image} or a {Link}.
|
46
|
+
#
|
41
47
|
# @param [Boolean] as_image true if you want it as an Image
|
42
|
-
# @return [Image, Link, nil] artist portrait,
|
48
|
+
# @return [Image, Link, nil] artist portrait, the link to it, or nil.
|
43
49
|
def portrait(as_image = true)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
50
|
+
if as_image
|
51
|
+
portrait = Spotify.artist_portrait(pointer)
|
52
|
+
Image.new(portrait.read_bytes(20)) unless portrait.null?
|
53
|
+
else
|
54
|
+
portrait = Spotify.link_create_from_artist_portrait!(pointer)
|
55
|
+
Link.new(portrait) unless portrait.null?
|
48
56
|
end
|
49
57
|
end
|
50
58
|
|
51
59
|
# Browse the Artist, giving you the ability to explore its’
|
52
60
|
# portraits, biography and more.
|
53
61
|
#
|
62
|
+
# @param [Symbol] type browsing type (see {ArtistBrowse.types})
|
54
63
|
# @return [ArtistBrowse] an artist browsing object
|
55
|
-
def browse
|
56
|
-
ArtistBrowse.new(pointer)
|
64
|
+
def browse(type = :full)
|
65
|
+
ArtistBrowse.new(pointer, type)
|
57
66
|
end
|
58
67
|
end
|
59
68
|
end
|
data/lib/hallon/artist_browse.rb
CHANGED
@@ -1,87 +1,105 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
module Hallon
|
2
3
|
# ArtistBrowse is like AlbumBrowse, only that it’s for {Track}s.
|
3
4
|
#
|
4
|
-
# When it loads, it triggers the load callback on itself, that
|
5
|
-
# can be utilized by giving {#on}(:load) a block to execute.
|
6
|
-
#
|
7
|
-
# @example
|
8
|
-
# browse = artist.browse # artist is a Hallon::Artist
|
9
|
-
# browse.on(:load) do
|
10
|
-
# puts "#{browse.artist.name} browser has been loaded!"
|
11
|
-
# end
|
12
|
-
# session.wait_for { browse.loaded? }
|
13
|
-
#
|
14
5
|
# @see Artist
|
15
6
|
# @see http://developer.spotify.com/en/libspotify/docs/group__artistbrowse.html
|
16
7
|
class ArtistBrowse < Base
|
17
8
|
include Observable
|
18
9
|
|
10
|
+
# @return [Array<Symbol>] artist browsing types for use in {#initialize}
|
11
|
+
def self.types
|
12
|
+
Spotify.enum_type(:artistbrowse_type).symbols
|
13
|
+
end
|
14
|
+
|
19
15
|
# Creates an ArtistBrowse instance from an Artist or an Artist pointer.
|
20
16
|
#
|
21
|
-
# @note
|
22
|
-
# @param [Artist,
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
# @note Also use {Artist#browse} to browse an Artist.
|
18
|
+
# @param [Artist, Spotify::Pointer] artist
|
19
|
+
# @param [Symbol] type (see {.types})
|
20
|
+
def initialize(artist, type = :full)
|
21
|
+
pointer = artist
|
22
|
+
pointer = pointer.pointer if pointer.respond_to?(:pointer)
|
26
23
|
|
27
|
-
|
28
|
-
|
24
|
+
unless Spotify::Pointer.typechecks?(pointer, :artist)
|
25
|
+
given = pointer.respond_to?(:type) ? pointer.type : pointer.inspect
|
26
|
+
raise TypeError, "expected artist pointer, was given #{given}"
|
27
|
+
end
|
28
|
+
|
29
|
+
@callback = proc { trigger(:load) }
|
30
|
+
@pointer = Spotify.artistbrowse_create!(session.pointer, pointer, type, @callback, nil)
|
29
31
|
end
|
30
32
|
|
31
|
-
# @return [Boolean] true if the
|
33
|
+
# @return [Boolean] true if the artist browser is loaded.
|
32
34
|
def loaded?
|
33
|
-
Spotify.artistbrowse_is_loaded(
|
35
|
+
Spotify.artistbrowse_is_loaded(pointer)
|
34
36
|
end
|
35
37
|
|
36
|
-
# @see Error
|
37
|
-
# @return [Symbol] artist browser error status
|
38
|
-
def
|
39
|
-
Spotify.artistbrowse_error(
|
38
|
+
# @see Error.explain
|
39
|
+
# @return [Symbol] artist browser error status.
|
40
|
+
def status
|
41
|
+
Spotify.artistbrowse_error(pointer)
|
40
42
|
end
|
41
43
|
|
42
|
-
# @return [Artist, nil] artist this browser is browsing
|
44
|
+
# @return [Artist, nil] artist this browser is browsing.
|
43
45
|
def artist
|
44
|
-
artist = Spotify.artistbrowse_artist(
|
46
|
+
artist = Spotify.artistbrowse_artist!(pointer)
|
45
47
|
Artist.new(artist) unless artist.null?
|
46
48
|
end
|
47
49
|
|
48
|
-
# @return [String] artist biography
|
50
|
+
# @return [String] artist biography.
|
49
51
|
def biography
|
50
|
-
Spotify.artistbrowse_biography(
|
52
|
+
Spotify.artistbrowse_biography(pointer)
|
51
53
|
end
|
52
54
|
|
53
|
-
# @
|
54
|
-
|
55
|
-
|
55
|
+
# @note If the object is not loaded, the result is undefined.
|
56
|
+
# @note Returns nil if the request was served from the local libspotify cache.
|
57
|
+
# @return [Rational, nil] time it took for the albumbrowse request to complete (in seconds).
|
58
|
+
def request_duration
|
59
|
+
duration = Spotify.artistbrowse_backend_request_duration(pointer)
|
60
|
+
Rational(duration, 1000) if duration > 0
|
61
|
+
end
|
62
|
+
|
63
|
+
# Retrieve artist portraits as an {Image} or a {Link}.
|
64
|
+
#
|
65
|
+
# @param [Boolean] as_image true if you want an enumerator of Images (false for Links)
|
66
|
+
# @return [Enumerator<Image>, Enumerator<Link>] artist portraits.
|
67
|
+
def portraits(as_image = true)
|
68
|
+
size = Spotify.artistbrowse_num_portraits(pointer)
|
56
69
|
Enumerator.new(size) do |i|
|
57
|
-
|
58
|
-
|
70
|
+
if as_image
|
71
|
+
id = Spotify.artistbrowse_portrait(pointer, i).read_string(20)
|
72
|
+
Image.new(id)
|
73
|
+
else
|
74
|
+
link = Spotify.link_create_from_artistbrowse_portrait!(pointer, i)
|
75
|
+
Link.new(link)
|
76
|
+
end
|
59
77
|
end
|
60
78
|
end
|
61
79
|
|
62
|
-
# @return [Enumerator<Track>] artist authored tracks
|
80
|
+
# @return [Enumerator<Track>] artist authored tracks.
|
63
81
|
def tracks
|
64
|
-
size = Spotify.artistbrowse_num_tracks(
|
82
|
+
size = Spotify.artistbrowse_num_tracks(pointer)
|
65
83
|
Enumerator.new(size) do |i|
|
66
|
-
track = Spotify.artistbrowse_track(
|
84
|
+
track = Spotify.artistbrowse_track!(pointer, i)
|
67
85
|
Track.new(track)
|
68
86
|
end
|
69
87
|
end
|
70
88
|
|
71
|
-
# @return [Enumerator<Album>] artist authored albums
|
89
|
+
# @return [Enumerator<Album>] artist authored albums.
|
72
90
|
def albums
|
73
|
-
size = Spotify.artistbrowse_num_albums(
|
91
|
+
size = Spotify.artistbrowse_num_albums(pointer)
|
74
92
|
Enumerator.new(size) do |i|
|
75
|
-
album = Spotify.artistbrowse_album(
|
93
|
+
album = Spotify.artistbrowse_album!(pointer, i)
|
76
94
|
Album.new(album)
|
77
95
|
end
|
78
96
|
end
|
79
97
|
|
80
|
-
# @return [Enumartor<Artist>] similar artists to this artist
|
98
|
+
# @return [Enumartor<Artist>] similar artists to this artist.
|
81
99
|
def similar_artists
|
82
|
-
size = Spotify.artistbrowse_num_similar_artists(
|
100
|
+
size = Spotify.artistbrowse_num_similar_artists(pointer)
|
83
101
|
Enumerator.new(size) do |i|
|
84
|
-
artist = Spotify.artistbrowse_similar_artist(
|
102
|
+
artist = Spotify.artistbrowse_similar_artist!(pointer, i)
|
85
103
|
Artist.new(artist)
|
86
104
|
end
|
87
105
|
end
|