lastfm 1.17.0 → 1.18.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lastfm.gemspec +1 -1
- data/lib/lastfm/method_category/album.rb +5 -1
- data/lib/lastfm/method_category/artist.rb +45 -10
- data/lib/lastfm/method_category/auth.rb +9 -3
- data/lib/lastfm/method_category/base.rb +34 -12
- data/lib/lastfm/method_category/chart.rb +42 -6
- data/lib/lastfm/method_category/event.rb +4 -1
- data/lib/lastfm/method_category/geo.rb +9 -1
- data/lib/lastfm/method_category/library.rb +18 -2
- data/lib/lastfm/method_category/radio.rb +2 -2
- data/lib/lastfm/method_category/tag.rb +16 -2
- data/lib/lastfm/method_category/tasteometer.rb +7 -1
- data/lib/lastfm/method_category/track.rb +76 -16
- data/lib/lastfm/method_category/user.rb +123 -15
- data/lib/lastfm/util.rb +15 -4
- data/spec/method_specs/album_spec.rb +20 -1
- data/spec/method_specs/track_spec.rb +19 -1
- data/spec/method_specs/user_spec.rb +15 -5
- metadata +4 -4
data/lastfm.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |gem|
|
|
12
12
|
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
13
13
|
gem.name = %q{lastfm}
|
14
14
|
gem.require_paths = ["lib"]
|
15
|
-
gem.version = "1.
|
15
|
+
gem.version = "1.18.0"
|
16
16
|
|
17
17
|
gem.add_dependency "xml-simple"
|
18
18
|
gem.add_dependency "httparty"
|
@@ -1,8 +1,12 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Album < Base
|
4
|
-
regular_method
|
4
|
+
regular_method(
|
5
|
+
:get_info,
|
6
|
+
:required => any_params([:artist, :album], :mbid)
|
7
|
+
) do |response|
|
5
8
|
result = response.xml['album']
|
9
|
+
|
6
10
|
result['releasedate'].lstrip! unless result['releasedate'].empty?
|
7
11
|
result
|
8
12
|
end
|
@@ -1,39 +1,74 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Artist < Base
|
4
|
-
regular_method
|
4
|
+
regular_method(
|
5
|
+
:get_top_tracks,
|
6
|
+
:required => [:artist]
|
7
|
+
) do |response|
|
5
8
|
response.xml['toptracks']['track']
|
6
9
|
end
|
7
10
|
|
8
|
-
regular_method
|
11
|
+
regular_method(
|
12
|
+
:get_top_albums,
|
13
|
+
:required => [:artist]
|
14
|
+
) do |response|
|
9
15
|
response.xml['topalbums']['album']
|
10
16
|
end
|
11
17
|
|
12
|
-
regular_method
|
18
|
+
regular_method(
|
19
|
+
:get_info,
|
20
|
+
:required => [:artist]
|
21
|
+
) do |response|
|
13
22
|
response.xml['artist']
|
14
23
|
end
|
15
24
|
|
16
|
-
regular_method
|
25
|
+
regular_method(
|
26
|
+
:get_events,
|
27
|
+
:required => [:artist]
|
28
|
+
) do |response|
|
17
29
|
response.xml['events']['event']
|
18
30
|
end
|
19
31
|
|
20
|
-
regular_method
|
32
|
+
regular_method(
|
33
|
+
:get_images,
|
34
|
+
:required => [:artist]
|
35
|
+
) do |response|
|
21
36
|
response.xml['images']['image']
|
22
37
|
end
|
23
38
|
|
24
|
-
regular_method
|
39
|
+
regular_method(:get_similar,
|
40
|
+
:required => [:artist]
|
41
|
+
) do |response|
|
25
42
|
response.xml['similarartists']['artist']
|
26
43
|
end
|
27
44
|
|
28
|
-
regular_method
|
45
|
+
regular_method(
|
46
|
+
:get_tags,
|
47
|
+
:required => [:artist],
|
48
|
+
:optional => [
|
49
|
+
[:user, nil],
|
50
|
+
[:mbid, nil],
|
51
|
+
[:autocorrect, nil]
|
52
|
+
]
|
53
|
+
) do |response|
|
29
54
|
response.xml['tags']['tag']
|
30
55
|
end
|
31
|
-
|
32
|
-
regular_method
|
56
|
+
|
57
|
+
regular_method(
|
58
|
+
:get_top_fans,
|
59
|
+
:required => [:artist]
|
60
|
+
) do |response|
|
33
61
|
response.xml['topfans']['user']
|
34
62
|
end
|
35
63
|
|
36
|
-
regular_method
|
64
|
+
regular_method(
|
65
|
+
:search,
|
66
|
+
:required => [:artist],
|
67
|
+
:optional => [
|
68
|
+
[:limit, nil],
|
69
|
+
[:page, nil]
|
70
|
+
]
|
71
|
+
)
|
37
72
|
end
|
38
73
|
end
|
39
74
|
end
|
@@ -1,15 +1,21 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Auth < Base
|
4
|
-
method_for_authentication :get_token
|
4
|
+
method_for_authentication :get_token do |response|
|
5
5
|
response.xml['token']
|
6
6
|
end
|
7
7
|
|
8
|
-
method_for_authentication
|
8
|
+
method_for_authentication(
|
9
|
+
:get_session,
|
10
|
+
:required => [:token]
|
11
|
+
) do |response|
|
9
12
|
response.xml['session']
|
10
13
|
end
|
11
14
|
|
12
|
-
method_for_secure_authentication
|
15
|
+
method_for_secure_authentication(
|
16
|
+
:get_mobile_session,
|
17
|
+
:required => [:username, :password]
|
18
|
+
) do |response|
|
13
19
|
response.xml['session']
|
14
20
|
end
|
15
21
|
end
|
@@ -1,36 +1,58 @@
|
|
1
1
|
class Lastfm
|
2
|
+
class AnyParams
|
3
|
+
attr_reader :candidates
|
4
|
+
|
5
|
+
def initialize(candidates)
|
6
|
+
@candidates = candidates
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
2
10
|
module MethodCategory
|
3
11
|
class Base
|
4
12
|
class << self
|
5
|
-
def
|
6
|
-
|
13
|
+
def any_params(*args)
|
14
|
+
AnyParams.new(args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def write_method(id, params = {})
|
18
|
+
__define_method(:write_request, id, params) do |response|
|
7
19
|
response.success?
|
8
20
|
end
|
9
21
|
end
|
10
22
|
|
11
|
-
def method_with_authentication(id,
|
12
|
-
__define_method(:request_with_authentication, id,
|
23
|
+
def method_with_authentication(id, params = {}, &block)
|
24
|
+
__define_method(:request_with_authentication, id, params, &block)
|
13
25
|
end
|
14
26
|
|
15
|
-
def method_for_authentication(id,
|
16
|
-
__define_method(:request_for_authentication, id,
|
27
|
+
def method_for_authentication(id, params = {}, &block)
|
28
|
+
__define_method(:request_for_authentication, id, params, &block)
|
17
29
|
end
|
18
30
|
|
19
|
-
def method_for_secure_authentication(id,
|
20
|
-
__define_method(:request_for_secure_authentication, id,
|
31
|
+
def method_for_secure_authentication(id, params = {}, &block)
|
32
|
+
__define_method(:request_for_secure_authentication, id, params, &block)
|
21
33
|
end
|
22
34
|
|
23
|
-
def regular_method(id,
|
24
|
-
__define_method(:request, id,
|
35
|
+
def regular_method(id, params = {}, &block)
|
36
|
+
__define_method(:request, id, params, &block)
|
25
37
|
end
|
26
38
|
|
27
|
-
def __define_method(method, id,
|
39
|
+
def __define_method(method, id, params, &block)
|
28
40
|
unless block
|
29
41
|
block = Proc.new { |response| response.xml }
|
30
42
|
end
|
31
43
|
|
32
44
|
define_method(id) do |*args|
|
33
|
-
block.call(
|
45
|
+
block.call(
|
46
|
+
send(
|
47
|
+
method,
|
48
|
+
id.to_s.camelize(:lower),
|
49
|
+
Lastfm::Util.build_options(
|
50
|
+
args,
|
51
|
+
params[:required],
|
52
|
+
params[:optional]
|
53
|
+
)
|
54
|
+
)
|
55
|
+
)
|
34
56
|
end
|
35
57
|
end
|
36
58
|
end
|
@@ -1,27 +1,63 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Chart < Base
|
4
|
-
regular_method
|
4
|
+
regular_method(
|
5
|
+
:get_hyped_artists,
|
6
|
+
:optional => [
|
7
|
+
[:page, nil],
|
8
|
+
[:limit, nil]
|
9
|
+
]
|
10
|
+
) do |response|
|
5
11
|
response.xml['artists']['artist']
|
6
12
|
end
|
7
13
|
|
8
|
-
regular_method
|
14
|
+
regular_method(
|
15
|
+
:get_hyped_tracks,
|
16
|
+
:optional => [
|
17
|
+
[:page, nil],
|
18
|
+
[:limit, nil]
|
19
|
+
]
|
20
|
+
) do |response|
|
9
21
|
response.xml['tracks']['track']
|
10
22
|
end
|
11
23
|
|
12
|
-
regular_method
|
24
|
+
regular_method(
|
25
|
+
:get_loved_tracks,
|
26
|
+
:optional => [
|
27
|
+
[:page, nil],
|
28
|
+
[:limit, nil]
|
29
|
+
]
|
30
|
+
) do |response|
|
13
31
|
response.xml['tracks']['track']
|
14
32
|
end
|
15
33
|
|
16
|
-
regular_method
|
34
|
+
regular_method(
|
35
|
+
:get_top_artists,
|
36
|
+
:optional => [
|
37
|
+
[:page, nil],
|
38
|
+
[:limit, nil]
|
39
|
+
]
|
40
|
+
) do |response|
|
17
41
|
response.xml['artists']['artist']
|
18
42
|
end
|
19
43
|
|
20
|
-
regular_method
|
44
|
+
regular_method(
|
45
|
+
:get_top_tags,
|
46
|
+
:optional => [
|
47
|
+
[:page, nil],
|
48
|
+
[:limit, nil]
|
49
|
+
]
|
50
|
+
) do |response|
|
21
51
|
response.xml['tags']['tag']
|
22
52
|
end
|
23
53
|
|
24
|
-
regular_method
|
54
|
+
regular_method(
|
55
|
+
:get_top_tracks,
|
56
|
+
:optional => [
|
57
|
+
[:page, nil],
|
58
|
+
[:limit, nil]
|
59
|
+
]
|
60
|
+
) do |response|
|
25
61
|
response.xml['tracks']['track']
|
26
62
|
end
|
27
63
|
end
|
@@ -1,7 +1,15 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Geo < Base
|
4
|
-
regular_method
|
4
|
+
regular_method(
|
5
|
+
:get_events,
|
6
|
+
:optional => [
|
7
|
+
[:location, nil],
|
8
|
+
[:distance, nil],
|
9
|
+
[:limit, nil],
|
10
|
+
[:page, nil]
|
11
|
+
]
|
12
|
+
) do |response|
|
5
13
|
response.xml['events']['event']
|
6
14
|
end
|
7
15
|
end
|
@@ -1,11 +1,27 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Library < Base
|
4
|
-
regular_method
|
4
|
+
regular_method(
|
5
|
+
:get_artists,
|
6
|
+
:required => [:user],
|
7
|
+
:optional => [
|
8
|
+
[:limit, nil],
|
9
|
+
[:page, nil]
|
10
|
+
]
|
11
|
+
) do |response|
|
5
12
|
Util.force_array(response.xml['artists']['artist'])
|
6
13
|
end
|
7
14
|
|
8
|
-
regular_method
|
15
|
+
regular_method(
|
16
|
+
:get_tracks,
|
17
|
+
:required => [:user],
|
18
|
+
:optional => [
|
19
|
+
[:artist, nil],
|
20
|
+
[:album, nil],
|
21
|
+
[:page, nil],
|
22
|
+
[:limit, nil]
|
23
|
+
]
|
24
|
+
) do |response|
|
9
25
|
Util.force_array(response.xml['tracks']['track'])
|
10
26
|
end
|
11
27
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Radio < Base
|
4
|
-
write_method :tune, [:station]
|
5
|
-
method_with_authentication :get_playlist
|
4
|
+
write_method :tune, :required => [:station]
|
5
|
+
method_with_authentication :get_playlist do |response|
|
6
6
|
playlist = response.xml['playlist']
|
7
7
|
tracklist = playlist['trackList']['track']
|
8
8
|
|
@@ -1,11 +1,25 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Tag < Base
|
4
|
-
regular_method
|
4
|
+
regular_method(
|
5
|
+
:get_top_artists,
|
6
|
+
:required => [:tag],
|
7
|
+
:optional => [
|
8
|
+
[:limit, nil],
|
9
|
+
[:page, nil]
|
10
|
+
]
|
11
|
+
) do |response|
|
5
12
|
response.xml['topartists']['artist']
|
6
13
|
end
|
7
14
|
|
8
|
-
regular_method
|
15
|
+
regular_method(
|
16
|
+
:get_top_tracks,
|
17
|
+
:required => [:tag],
|
18
|
+
:optional => [
|
19
|
+
[:limit, nil],
|
20
|
+
[:page, nil]
|
21
|
+
]
|
22
|
+
) do |response|
|
9
23
|
response.xml['toptracks']['track']
|
10
24
|
end
|
11
25
|
end
|
@@ -1,7 +1,13 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Tasteometer < Base
|
4
|
-
regular_method
|
4
|
+
regular_method(
|
5
|
+
:compare,
|
6
|
+
:required => [:type1, :type2, :value1, :value2],
|
7
|
+
:optional => [
|
8
|
+
[:limit, nil]
|
9
|
+
]
|
10
|
+
) do |response|
|
5
11
|
response.xml['comparison']['result']
|
6
12
|
end
|
7
13
|
end
|
@@ -1,38 +1,98 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class Track < Base
|
4
|
-
write_method :add_tags, [:artist, :track, :tags]
|
5
|
-
|
6
|
-
write_method :
|
7
|
-
|
8
|
-
write_method :
|
9
|
-
|
10
|
-
write_method :
|
11
|
-
|
12
|
-
|
13
|
-
|
4
|
+
write_method :add_tags, :required => [:artist, :track, :tags]
|
5
|
+
|
6
|
+
write_method :remove_tag, :required => [:artist, :track, :tag]
|
7
|
+
|
8
|
+
write_method :ban, :required => [:artist, :track]
|
9
|
+
|
10
|
+
write_method :love, :required => [:artist, :track]
|
11
|
+
|
12
|
+
write_method :share, :required => [:artist, :track, :recipient], :optional => [[:message, nil]]
|
13
|
+
|
14
|
+
write_method(
|
15
|
+
:scrobble,
|
16
|
+
:required => [:artist, :track],
|
17
|
+
:optional => [
|
18
|
+
[:timestamp, Proc.new { Time.now.utc.to_i }],
|
19
|
+
[:album, nil],
|
20
|
+
[:trackNumber, nil],
|
21
|
+
[:mbid, nil],
|
22
|
+
[:duration, nil],
|
23
|
+
[:albumArtist, nil]
|
24
|
+
]
|
25
|
+
)
|
26
|
+
|
27
|
+
write_method(
|
28
|
+
:update_now_playing,
|
29
|
+
:required => [:artist, :track],
|
30
|
+
:optional => [
|
31
|
+
[:album, nil],
|
32
|
+
[:trackNumber, nil],
|
33
|
+
[:mbid, nil],
|
34
|
+
[:duration, nil],
|
35
|
+
[:albumArtist, nil]
|
36
|
+
]
|
37
|
+
)
|
38
|
+
|
39
|
+
write_method :unlove, :required => [:artist, :track]
|
40
|
+
|
41
|
+
regular_method(
|
42
|
+
:get_info,
|
43
|
+
:required => any_params([:artist, :track], :mbid),
|
44
|
+
:optional => [
|
45
|
+
[:username, nil]
|
46
|
+
]
|
47
|
+
) do |response|
|
14
48
|
response.xml['track']
|
15
49
|
end
|
16
50
|
|
17
|
-
regular_method
|
51
|
+
regular_method(
|
52
|
+
:get_correction,
|
53
|
+
:required => [:artist, :track]
|
54
|
+
) do |response|
|
18
55
|
response.xml['corrections']['correction']
|
19
56
|
end
|
20
57
|
|
21
|
-
regular_method
|
58
|
+
regular_method(
|
59
|
+
:get_top_fans,
|
60
|
+
:required => [:artist, :track]
|
61
|
+
) do |response|
|
22
62
|
response.xml['topfans']['user']
|
23
63
|
end
|
24
|
-
|
64
|
+
|
65
|
+
regular_method(
|
66
|
+
:get_top_tags,
|
67
|
+
:required => [:artist, :track]
|
68
|
+
) do |response|
|
25
69
|
response.xml['toptags']['tag']
|
26
70
|
end
|
27
|
-
|
71
|
+
|
72
|
+
regular_method(
|
73
|
+
:get_similar,
|
74
|
+
:required => [:artist, :track]
|
75
|
+
) do |response|
|
28
76
|
response.xml['similartracks']['track'][1 .. -1]
|
29
77
|
end
|
30
|
-
|
78
|
+
|
79
|
+
regular_method(
|
80
|
+
:search,
|
81
|
+
:required => [:track],
|
82
|
+
:optional => [
|
83
|
+
[:artist, nil],
|
84
|
+
[:limit, nil],
|
85
|
+
[:page, nil]
|
86
|
+
]
|
87
|
+
) do |response|
|
31
88
|
response.xml['results']['trackmatches']['track'] = Util.force_array(response.xml['results']['trackmatches']['track'])
|
32
89
|
response.xml
|
33
90
|
end
|
34
91
|
|
35
|
-
method_with_authentication
|
92
|
+
method_with_authentication(
|
93
|
+
:get_tags,
|
94
|
+
:required => [:artist, :track]
|
95
|
+
) do |response|
|
36
96
|
response.xml['tags']['tag']
|
37
97
|
end
|
38
98
|
end
|
@@ -1,26 +1,65 @@
|
|
1
1
|
class Lastfm
|
2
2
|
module MethodCategory
|
3
3
|
class User < Base
|
4
|
-
regular_method
|
4
|
+
regular_method(
|
5
|
+
:get_friends,
|
6
|
+
:required => [:user],
|
7
|
+
:optional => [
|
8
|
+
[:recenttracks, nil],
|
9
|
+
[:limit, nil],
|
10
|
+
[:page, nil]
|
11
|
+
]
|
12
|
+
) do |response|
|
5
13
|
response.xml['friends']['user']
|
6
14
|
end
|
7
15
|
|
8
|
-
|
16
|
+
def get_info(*args)
|
17
|
+
method = :get_info.to_s.camelize(:lower)
|
18
|
+
response = if args.any?
|
19
|
+
options = Lastfm::Util.build_options(args, [:user], [])
|
20
|
+
request(method, options)
|
21
|
+
else
|
22
|
+
request_with_authentication(method)
|
23
|
+
end
|
9
24
|
response.xml['user'][0]
|
10
25
|
end
|
11
26
|
|
12
|
-
regular_method
|
27
|
+
regular_method(
|
28
|
+
:get_loved_tracks,
|
29
|
+
:required => [:user],
|
30
|
+
:optional => [
|
31
|
+
[:period, nil],
|
32
|
+
[:limit, nil],
|
33
|
+
[:page, nil]
|
34
|
+
]
|
35
|
+
) do |response|
|
13
36
|
response.xml['lovedtracks']['track']
|
14
37
|
end
|
15
38
|
|
16
|
-
regular_method
|
39
|
+
regular_method(
|
40
|
+
:get_neighbours,
|
41
|
+
:required => [:user],
|
42
|
+
:optional => [
|
43
|
+
[:recenttracks, nil],
|
44
|
+
[:limit, nil],
|
45
|
+
[:page, nil]
|
46
|
+
]
|
47
|
+
) do |response|
|
17
48
|
neighbours = response.xml['neighbours']['user']
|
18
49
|
# Ignore first "user" as this is an attribute, not an object.
|
19
50
|
neighbours.delete_at(0) if neighbours[0].is_a? String
|
20
51
|
neighbours
|
21
52
|
end
|
22
53
|
|
23
|
-
regular_method
|
54
|
+
regular_method(
|
55
|
+
:get_personal_tags,
|
56
|
+
:required => [:user, :tag],
|
57
|
+
:optional => [
|
58
|
+
[:taggingtype, 'artist'],
|
59
|
+
[:limit, nil],
|
60
|
+
[:page, nil]
|
61
|
+
]
|
62
|
+
) do |response|
|
24
63
|
taggings = response.xml['taggings']
|
25
64
|
result = if taggings['artists']
|
26
65
|
taggings['artists']['artist']
|
@@ -33,43 +72,112 @@ class Lastfm
|
|
33
72
|
Lastfm::Util::force_array(result)
|
34
73
|
end
|
35
74
|
|
36
|
-
regular_method
|
75
|
+
regular_method(
|
76
|
+
:get_recent_tracks,
|
77
|
+
:required => [:user],
|
78
|
+
:optional => [
|
79
|
+
[:limit, nil],
|
80
|
+
[:page, nil],
|
81
|
+
[:to, nil],
|
82
|
+
[:from, nil]
|
83
|
+
]
|
84
|
+
) do |response|
|
37
85
|
response.xml['recenttracks']['track']
|
38
86
|
end
|
39
87
|
|
40
|
-
regular_method
|
88
|
+
regular_method(
|
89
|
+
:get_top_albums,
|
90
|
+
:required => [:user],
|
91
|
+
:optional => [
|
92
|
+
[:period, nil],
|
93
|
+
[:limit, nil],
|
94
|
+
[:page, nil]
|
95
|
+
]
|
96
|
+
) do |response|
|
41
97
|
response.xml['topalbums']['album']
|
42
98
|
end
|
43
99
|
|
44
|
-
regular_method
|
100
|
+
regular_method(
|
101
|
+
:get_top_artists,
|
102
|
+
:required => [:user],
|
103
|
+
:optional => [
|
104
|
+
[:period, nil],
|
105
|
+
[:limit, nil],
|
106
|
+
[:page, nil]
|
107
|
+
]
|
108
|
+
) do |response|
|
45
109
|
response.xml['topartists']['artist']
|
46
110
|
end
|
47
111
|
|
48
|
-
regular_method
|
112
|
+
regular_method(
|
113
|
+
:get_top_tags,
|
114
|
+
:required => [:user],
|
115
|
+
:optional => [[:limit, nil]]
|
116
|
+
) do |response|
|
49
117
|
response.xml['toptags']['tag']
|
50
118
|
end
|
51
119
|
|
52
|
-
regular_method
|
120
|
+
regular_method(
|
121
|
+
:get_top_tracks,
|
122
|
+
:required => [:user],
|
123
|
+
:optional => [
|
124
|
+
[:period, nil],
|
125
|
+
[:limit, nil],
|
126
|
+
[:page, nil]
|
127
|
+
]
|
128
|
+
) do |response|
|
53
129
|
response.xml['toptracks']['track']
|
54
130
|
end
|
55
131
|
|
56
|
-
regular_method
|
132
|
+
regular_method(
|
133
|
+
:get_weekly_chart_list,
|
134
|
+
:required => [:user],
|
135
|
+
:optional => [
|
136
|
+
[:limit, nil]
|
137
|
+
]
|
138
|
+
) do |response|
|
57
139
|
response.xml['weeklychartlist']['chart']
|
58
140
|
end
|
59
141
|
|
60
|
-
regular_method
|
142
|
+
regular_method(
|
143
|
+
:get_weekly_artist_chart,
|
144
|
+
:required => [:user],
|
145
|
+
:optional => [
|
146
|
+
[:from, nil],
|
147
|
+
[:to, nil],
|
148
|
+
[:limit, nil]
|
149
|
+
]
|
150
|
+
) do |response|
|
61
151
|
response.xml['weeklyartistchart']['artist']
|
62
152
|
end
|
63
153
|
|
64
|
-
regular_method
|
154
|
+
regular_method(
|
155
|
+
:get_weekly_album_chart,
|
156
|
+
:required => [:user],
|
157
|
+
:optional => [
|
158
|
+
[:from, nil],
|
159
|
+
[:to, nil],
|
160
|
+
[:limit, nil]
|
161
|
+
]
|
162
|
+
) do |response|
|
65
163
|
response.xml['weeklyalbumchart']['album']
|
66
164
|
end
|
67
165
|
|
68
|
-
regular_method
|
166
|
+
regular_method(
|
167
|
+
:get_weekly_track_chart,
|
168
|
+
:required => [:user],
|
169
|
+
:optional => [
|
170
|
+
[:from, nil],
|
171
|
+
[:to, nil],
|
172
|
+
[:limit, nil]
|
173
|
+
]
|
174
|
+
) do |response|
|
69
175
|
response.xml['weeklytrackchart']['track']
|
70
176
|
end
|
71
177
|
|
72
|
-
method_with_authentication
|
178
|
+
method_with_authentication(
|
179
|
+
:get_recommended_events
|
180
|
+
) do |response|
|
73
181
|
response.xml['events']['event']
|
74
182
|
end
|
75
183
|
end
|
data/lib/lastfm/util.rb
CHANGED
@@ -6,15 +6,26 @@ class Lastfm
|
|
6
6
|
|
7
7
|
def self.build_options(args, mandatory, optional)
|
8
8
|
if args.first.is_a?(Hash)
|
9
|
-
build_options_from_hash(args.first, mandatory, optional)
|
9
|
+
build_options_from_hash(args.first, mandatory || [], optional || [])
|
10
10
|
else
|
11
|
-
build_options_from_array(args, mandatory, optional)
|
11
|
+
build_options_from_array(args, mandatory || [], optional || [])
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.build_options_from_hash(options, mandatory, optional)
|
16
|
-
mandatory.
|
17
|
-
|
16
|
+
candidates = mandatory.kind_of?(AnyParams) ? mandatory.candidates : [mandatory]
|
17
|
+
candidates.each_with_index do |params, index|
|
18
|
+
Array(params).each do |param|
|
19
|
+
if !options.has_key?(param)
|
20
|
+
if params.equal? candidates.last
|
21
|
+
raise ArgumentError.new("%s is required" % param)
|
22
|
+
else
|
23
|
+
next
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
break
|
18
29
|
end
|
19
30
|
|
20
31
|
optional.each do |name, value|
|
@@ -8,7 +8,7 @@ describe '#album' do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe '#get_info' do
|
11
|
-
it 'should get info' do
|
11
|
+
it 'should get info by artist and album' do
|
12
12
|
@lastfm.should_receive(:request).with('album.getInfo', {
|
13
13
|
:artist => 'Cher', :album => 'Believe'
|
14
14
|
}).and_return(make_response('album_get_info'))
|
@@ -26,5 +26,24 @@ describe '#album' do
|
|
26
26
|
album['tracks']['track'][0]['duration'].should == '239'
|
27
27
|
album['tracks']['track'][0]['url'].should == 'http://www.last.fm/music/Cher/_/Believe'
|
28
28
|
end
|
29
|
+
|
30
|
+
it 'should get info by mbid' do
|
31
|
+
@lastfm.should_receive(:request).with('album.getInfo', {
|
32
|
+
:mbid => 'xxxxx'
|
33
|
+
}).and_return(make_response('album_get_info'))
|
34
|
+
|
35
|
+
album = @lastfm.album.get_info(:mbid => 'xxxxx')
|
36
|
+
album['name'].should == 'Believe'
|
37
|
+
album['artist'].should == 'Cher'
|
38
|
+
album['id'].should == '2026126'
|
39
|
+
album['mbid'].should == '61bf0388-b8a9-48f4-81d1-7eb02706dfb0'
|
40
|
+
album['url'].should == 'http://www.last.fm/music/Cher/Believe'
|
41
|
+
album['image'].size.should == 5
|
42
|
+
album['releasedate'].should == '6 Apr 1999, 00:00'
|
43
|
+
album['tracks']['track'].size.should == 10
|
44
|
+
album['tracks']['track'][0]['name'].should == 'Believe'
|
45
|
+
album['tracks']['track'][0]['duration'].should == '239'
|
46
|
+
album['tracks']['track'][0]['url'].should == 'http://www.last.fm/music/Cher/_/Believe'
|
47
|
+
end
|
29
48
|
end
|
30
49
|
end
|
@@ -35,7 +35,7 @@ describe '#track' do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
describe '#get_info' do
|
38
|
-
it 'should get info' do
|
38
|
+
it 'should get info by track and artist' do
|
39
39
|
@lastfm.should_receive(:request).with('track.getInfo', {
|
40
40
|
:artist => 'Cher',
|
41
41
|
:track => 'Believe',
|
@@ -54,6 +54,24 @@ describe '#track' do
|
|
54
54
|
track['toptags']['tag'].first['name'].should == 'pop'
|
55
55
|
end
|
56
56
|
|
57
|
+
it 'should get info by mbid' do
|
58
|
+
@lastfm.should_receive(:request).with('track.getInfo', {
|
59
|
+
:mbid => 'xxx',
|
60
|
+
:username => nil
|
61
|
+
}
|
62
|
+
).and_return(make_response('track_get_info'))
|
63
|
+
|
64
|
+
track = @lastfm.track.get_info(
|
65
|
+
:mbid => 'xxx'
|
66
|
+
)
|
67
|
+
track['name'].should == 'Believe'
|
68
|
+
track['album']['image'].size.should == 4
|
69
|
+
track['album']['image'].first['size'].should == 'small'
|
70
|
+
track['album']['image'].first['content'].should == 'http://userserve-ak.last.fm/serve/64s/8674593.jpg'
|
71
|
+
track['toptags']['tag'].size.should == 5
|
72
|
+
track['toptags']['tag'].first['name'].should == 'pop'
|
73
|
+
end
|
74
|
+
|
57
75
|
it 'should get xml with force array option' do
|
58
76
|
@lastfm.should_receive(:request).with('track.getInfo', {
|
59
77
|
:artist => 'Cher',
|
@@ -8,10 +8,20 @@ describe '#user' do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe '#get_info' do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
context 'with params' do
|
12
|
+
it 'should get user info' do
|
13
|
+
@lastfm.should_receive(:request).with('user.getInfo', {:user => 'test'}).and_return(make_response('user_get_info'))
|
14
|
+
info = @lastfm.user.get_info(:user => 'test')
|
15
|
+
info['id'].should == '1000002'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'without params' do
|
20
|
+
it 'should get current user info' do
|
21
|
+
@lastfm.should_receive(:request).with('user.getInfo', {}, :get, true, true).and_return(make_response('user_get_info'))
|
22
|
+
info = @lastfm.user.get_info
|
23
|
+
info['id'].should == '1000002'
|
24
|
+
end
|
15
25
|
end
|
16
26
|
end
|
17
27
|
|
@@ -210,7 +220,7 @@ describe '#user' do
|
|
210
220
|
tracks[1]['artist']['content'].should == 'Kylie Minogue'
|
211
221
|
tracks.size.should == 2
|
212
222
|
end
|
213
|
-
|
223
|
+
|
214
224
|
it 'should not error when a user\'s recent tracks includes malformed data' do
|
215
225
|
@lastfm.should_receive(:request).with('user.getRecentTracks', {
|
216
226
|
:user => 'test',
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lastfm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.18.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: xml-simple
|
@@ -209,7 +209,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
209
209
|
version: '0'
|
210
210
|
segments:
|
211
211
|
- 0
|
212
|
-
hash:
|
212
|
+
hash: 1101754709663584216
|
213
213
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
214
|
none: false
|
215
215
|
requirements:
|
@@ -218,7 +218,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
218
218
|
version: '0'
|
219
219
|
segments:
|
220
220
|
- 0
|
221
|
-
hash:
|
221
|
+
hash: 1101754709663584216
|
222
222
|
requirements: []
|
223
223
|
rubyforge_project:
|
224
224
|
rubygems_version: 1.8.24
|