rscrobbler 0.1.0 → 0.2.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.
- data/lib/lastfm/album.rb +50 -112
- data/lib/lastfm/api/album.rb +140 -0
- data/lib/lastfm/api/artist.rb +243 -0
- data/lib/lastfm/api/auth.rb +35 -0
- data/lib/lastfm/api/chart.rb +63 -0
- data/lib/lastfm/api/event.rb +71 -0
- data/lib/lastfm/api/geo.rb +125 -0
- data/lib/lastfm/api/group.rb +69 -0
- data/lib/lastfm/api/library.rb +117 -0
- data/lib/lastfm/api/playlist.rb +40 -0
- data/lib/lastfm/api/radio.rb +41 -0
- data/lib/lastfm/api/tag.rb +120 -0
- data/lib/lastfm/api/tasteometer.rb +37 -0
- data/lib/lastfm/api/track.rb +272 -0
- data/lib/lastfm/api/user.rb +266 -0
- data/lib/lastfm/api/venue.rb +40 -0
- data/lib/lastfm/artist.rb +42 -204
- data/lib/lastfm/buylink.rb +34 -0
- data/lib/lastfm/event.rb +57 -66
- data/lib/lastfm/shout.rb +20 -0
- data/lib/lastfm/struct.rb +34 -0
- data/lib/lastfm/tag.rb +24 -89
- data/lib/lastfm/track.rb +51 -242
- data/lib/lastfm/venue.rb +21 -36
- data/lib/lastfm/wiki.rb +20 -0
- data/lib/rscrobbler.rb +24 -11
- data/test/test_album.rb +36 -0
- metadata +25 -45
- data/lib/lastfm/auth.rb +0 -35
- data/lib/lastfm/chart.rb +0 -63
- data/lib/lastfm/geo.rb +0 -125
- data/lib/lastfm/group.rb +0 -69
- data/lib/lastfm/library.rb +0 -117
- data/lib/lastfm/playlist.rb +0 -40
- data/lib/lastfm/radio.rb +0 -41
- data/lib/lastfm/tasteometer.rb +0 -37
- data/lib/lastfm/user.rb +0 -266
- data/test/unit/lib/lastfm/album_test.rb +0 -0
- data/test/unit/lib/lastfm/artist_test.rb +0 -0
- data/test/unit/lib/lastfm/auth_test.rb +0 -0
- data/test/unit/lib/lastfm/chart_test.rb +0 -0
- data/test/unit/lib/lastfm/event_test.rb +0 -0
- data/test/unit/lib/lastfm/geo_test.rb +0 -0
- data/test/unit/lib/lastfm/group_test.rb +0 -0
- data/test/unit/lib/lastfm/library_test.rb +0 -0
- data/test/unit/lib/lastfm/playlist_test.rb +0 -0
- data/test/unit/lib/lastfm/radio_test.rb +0 -0
- data/test/unit/lib/lastfm/tag_test.rb +0 -0
- data/test/unit/lib/lastfm/tasteometer_test.rb +0 -0
- data/test/unit/lib/lastfm/track_test.rb +0 -0
- data/test/unit/lib/lastfm/user_test.rb +0 -0
- data/test/unit/lib/lastfm/venue_test.rb +0 -0
- data/test/unit/lib/rscrobbler_test.rb +0 -0
data/lib/lastfm/artist.rb
CHANGED
@@ -1,210 +1,48 @@
|
|
1
1
|
module LastFM
|
2
|
-
class Artist
|
3
|
-
class << self
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
# @see http://www.last.fm/api/show/?service=407
|
47
|
-
def get_images( params )
|
48
|
-
LastFM.get( "#{TYPE}.getImages", params )
|
49
|
-
end
|
50
|
-
|
51
|
-
# Get the metadata for an artist. Includes biography.
|
52
|
-
#
|
53
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
54
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
55
|
-
# @option params [String, optional] :lang the language to return the biography in, expressed as an ISO 639 alpha-2 code
|
56
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
57
|
-
# @option params [String, optional] :username username whose playcount for this artist is to be returned in the reponse
|
58
|
-
# @see http://www.last.fm/api/show/?service=267
|
59
|
-
def get_info( params )
|
60
|
-
LastFM.get( "#{TYPE}.getInfo", params )
|
61
|
-
end
|
62
|
-
|
63
|
-
# Get a paginated list of all the events this artist has played at in the past.
|
64
|
-
#
|
65
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
66
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
67
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
68
|
-
# @option params [Fixnum, optional] :page the page number to fetch. defaults to first page
|
69
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch per page. defaults to 50
|
70
|
-
# @see http://www.last.fm/api/show/?service=428
|
71
|
-
def get_past_events( params )
|
72
|
-
LastFM.get( "#{TYPE}.getPastEvents", params )
|
73
|
-
end
|
74
|
-
|
75
|
-
# Get a podcast of free mp3s based on an artist.
|
76
|
-
#
|
77
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
78
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
79
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
80
|
-
# @see http://www.last.fm/api/show/?service=118
|
81
|
-
def get_podcast( params )
|
82
|
-
LastFM.get( "#{TYPE}.getPodcast", params )
|
83
|
-
end
|
84
|
-
|
85
|
-
# Get shouts for this artist.
|
86
|
-
#
|
87
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
88
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
89
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
90
|
-
# @option params [Fixnum, optional] :page the page number to fetch. defaults to first page
|
91
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch per page. defaults to 50
|
92
|
-
# @see http://www.last.fm/api/show/?service=397
|
93
|
-
def get_shouts( params )
|
94
|
-
LastFM.get( "#{TYPE}.getShouts", params )
|
95
|
-
end
|
96
|
-
|
97
|
-
# Get all the artists similar to this artist.
|
98
|
-
#
|
99
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
100
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
101
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
102
|
-
# @option params [Fixnum, optional] :limit limit the number of results to fetch
|
103
|
-
# @see http://www.last.fm/api/show/?service=119
|
104
|
-
def get_similar( params )
|
105
|
-
LastFM.get( "#{TYPE}.getSimilar", params )
|
106
|
-
end
|
107
|
-
|
108
|
-
# Get the tags applied by an individual user to an artist on Last.fm. If accessed as an authenticated service
|
109
|
-
# and you don't supply a user parameter then this service will return tags for the authenticated user.
|
110
|
-
#
|
111
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
112
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
113
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
114
|
-
# @option params [String, optional] :user if called in non-authenticated mode you must specify the user to look up
|
115
|
-
# @see http://www.last.fm/api/show/?service=318
|
116
|
-
def get_tags( params )
|
117
|
-
secure = !params.include?(:user)
|
118
|
-
LastFM.requires_authentication if secure
|
119
|
-
LastFM.get( "#{TYPE}.getTags", params, secure )
|
3
|
+
# @attr [Hash] images
|
4
|
+
# @attr [Fixnum] listeners
|
5
|
+
# @attr [String] mbid
|
6
|
+
# @attr [String] name
|
7
|
+
# @attr [Fixnum] playcount
|
8
|
+
# @attr [Array] similar
|
9
|
+
# @attr [Boolean] streamable
|
10
|
+
# @attr [Array] tags
|
11
|
+
# @attr [String] url
|
12
|
+
# @attr [LastFM::Wiki] wiki
|
13
|
+
class Artist < Struct.new(:images, :listeners, :mbid, :name, :playcount, :similar, :streamable, :tags, :url, :wiki)
|
14
|
+
|
15
|
+
def update_from_node(node)
|
16
|
+
case node.name.to_sym
|
17
|
+
when :name
|
18
|
+
self.name = node.content
|
19
|
+
when :mbid
|
20
|
+
self.mbid = node.content
|
21
|
+
when :url
|
22
|
+
self.url = node.content
|
23
|
+
when :image
|
24
|
+
self.images ||= {}
|
25
|
+
self.images.merge!({node['size'].to_sym => node.content})
|
26
|
+
when :streamable
|
27
|
+
self.streamable = (node.content == '1')
|
28
|
+
when :listeners
|
29
|
+
self.listeners = node.content.to_i
|
30
|
+
when :playcount
|
31
|
+
self.playcount = node.content.to_i
|
32
|
+
when :stats # nested listeners and playcount
|
33
|
+
node.find('*').each{|child| self.update_from_node(child)}
|
34
|
+
when :similar
|
35
|
+
self.similar = node.find('artist').map do |artist|
|
36
|
+
LastFM::Artist.from_xml(artist)
|
37
|
+
end
|
38
|
+
when :tags
|
39
|
+
self.tags = node.find('tag').map do |tag|
|
40
|
+
LastFM::Tag.from_xml(tag)
|
41
|
+
end
|
42
|
+
when :bio
|
43
|
+
self.wiki = LastFM::Wiki.from_xml(node)
|
120
44
|
end
|
121
|
-
|
122
|
-
# Get the top albums for an artist, ordered by popularity.
|
123
|
-
#
|
124
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
125
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
126
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
127
|
-
# @option params [Fixnum, optional] :page the page number to fetch. defaults to first page
|
128
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch per page. defaults to 50
|
129
|
-
# @see http://www.last.fm/api/show/?service=287
|
130
|
-
def get_top_albums( params )
|
131
|
-
LastFM.get( "#{TYPE}.getTopAlbums", params )
|
132
|
-
end
|
133
|
-
|
134
|
-
# Get the top fans for an artist on Last.fm, based on listening data.
|
135
|
-
#
|
136
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
137
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
138
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
139
|
-
# @see http://www.last.fm/api/show/?service=310
|
140
|
-
def get_top_fans( params )
|
141
|
-
LastFM.get( "#{TYPE}.getTopFans", params )
|
142
|
-
end
|
143
|
-
|
144
|
-
# Get the top tags for an artist, ordered by popularity.
|
145
|
-
#
|
146
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
147
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
148
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
149
|
-
# @see http://www.last.fm/api/show/?service=288
|
150
|
-
def get_top_tags( params )
|
151
|
-
LastFM.get( "#{TYPE}.getTopTags", params )
|
152
|
-
end
|
153
|
-
|
154
|
-
# Get the top tracks by an artist, ordered by popularity.
|
155
|
-
#
|
156
|
-
# @option params [String, required unless :mbid] :artist the artist name
|
157
|
-
# @option params [String, optional] :mbid the musicbrainz id for the artist
|
158
|
-
# @option params [Boolean, optional] :autocorrect transform misspelled artist names into correct artist names to be returned in the response
|
159
|
-
# @option params [Fixnum, optional] :page the page number to fetch. defaults to first page
|
160
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch per page. defaults to 50
|
161
|
-
# @see http://www.last.fm/api/show/?service=277
|
162
|
-
def get_top_tracks( params )
|
163
|
-
LastFM.get( "#{TYPE}.getTopTracks", params )
|
164
|
-
end
|
165
|
-
|
166
|
-
# Remove a user's tag from an artist.
|
167
|
-
#
|
168
|
-
# @option params [String, required] :artist the artist name
|
169
|
-
# @option params [String, required] :tag a single user tag to remove from this artist
|
170
|
-
# @see http://www.last.fm/api/show/?service=315
|
171
|
-
def remove_tag( params )
|
172
|
-
LastFM.requires_authentication
|
173
|
-
LastFM.post( "#{TYPE}.removeTag", params )
|
174
|
-
end
|
175
|
-
|
176
|
-
# Search for an artist by name. Returns artist matches sorted by relevance.
|
177
|
-
#
|
178
|
-
# @option params [Fixnum, optional] :page the page number to fetch. defaults to first page
|
179
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch per page. defaults to 50
|
180
|
-
# @option params [String, required] :artist the artist name
|
181
|
-
# @see http://www.last.fm/api/show/?service=272
|
182
|
-
def search( params )
|
183
|
-
LastFM.get( "#{TYPE}.search", params )
|
184
|
-
end
|
185
|
-
|
186
|
-
# Share an artist with Last.fm users or other friends.
|
187
|
-
#
|
188
|
-
# @option params [String, required] :artist the artist name
|
189
|
-
# @option params [Array, required] :recipient a list of email addresses or Last.fm usernames. maximum is 10
|
190
|
-
# @option params [String, optional] :message an optional message to send. if not supplied a default message will be used
|
191
|
-
# @option params [Boolean, optional] :public optionally show in the sharing users activity feed. defaults to false
|
192
|
-
# @see http://www.last.fm/api/show/?service=306
|
193
|
-
def share( params )
|
194
|
-
LastFM.requires_authentication
|
195
|
-
LastFM.post( "#{TYPE}.share", params )
|
196
|
-
end
|
197
|
-
|
198
|
-
# Shout in this artist's shoutbox.
|
199
|
-
#
|
200
|
-
# @option params [String, required] :artist name of the artist to shout on
|
201
|
-
# @option params [String, required] :message message to post to the shoutbox
|
202
|
-
# @see http://www.last.fm/api/show/?service=408
|
203
|
-
def shout( params )
|
204
|
-
LastFM.requires_authentication
|
205
|
-
LastFM.post( "#{TYPE}.shout", params )
|
206
|
-
end
|
207
|
-
|
208
45
|
end
|
46
|
+
|
209
47
|
end
|
210
48
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module LastFM
|
2
|
+
|
3
|
+
# @attr [Symbol] type whether the link is for a physical purchase, or a download
|
4
|
+
# @attr [Hash] supplier
|
5
|
+
# @attr [Hash] price
|
6
|
+
# @attr [String] link
|
7
|
+
# @attr [Boolean] is_search
|
8
|
+
class Buylink < Struct.new(:type, :supplier, :price, :link, :is_search)
|
9
|
+
|
10
|
+
def update_from_node(node)
|
11
|
+
case node.name.to_sym
|
12
|
+
when :supplierName
|
13
|
+
self.supplier ||= {}
|
14
|
+
self.supplier[:name] = node.content
|
15
|
+
when :supplierIcon
|
16
|
+
self.supplier ||= {}
|
17
|
+
self.supplier[:icon] = node.content
|
18
|
+
when :price # nested price & currency
|
19
|
+
node.find('*').each{|child| self.update_from_node(child)}
|
20
|
+
when :amount
|
21
|
+
self.price ||= {}
|
22
|
+
self.price[:amount] = node.content.to_f
|
23
|
+
when :currency
|
24
|
+
self.price ||= {}
|
25
|
+
self.price[:currency] = node.content
|
26
|
+
when :buyLink
|
27
|
+
self.link = node.content
|
28
|
+
when :isSearch
|
29
|
+
self.is_search = (node.content == '1')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
data/lib/lastfm/event.rb
CHANGED
@@ -1,71 +1,62 @@
|
|
1
1
|
module LastFM
|
2
|
-
class Event
|
3
|
-
class << self
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
3
|
+
# @attr [Fixnum] id
|
4
|
+
# @attr [String] title
|
5
|
+
# @attr [String] headliner
|
6
|
+
# @attr [Array<String>] artists
|
7
|
+
# @attr [LastFM::Venue] venue
|
8
|
+
# @attr [Time] start_date
|
9
|
+
# @attr [String] description
|
10
|
+
# @attr [Hash] images
|
11
|
+
# @attr [Fixnum] attendance
|
12
|
+
# @attr [Fixnum] reviews
|
13
|
+
# @attr [String] tag
|
14
|
+
# @attr [String] url Last.fm url for the event
|
15
|
+
# @attr [String] website Event website (different from Last.fm url)
|
16
|
+
# @attr [Boolean] cancelled
|
17
|
+
# @attr [Array<String>] tags
|
18
|
+
class Event < Struct.new(:id, :title, :headliner, :artists, :venue, :start_date, :description, :images, :attendance, :reviews, :tag, :url, :website, :cancelled, :tags)
|
19
|
+
|
20
|
+
def update_from_node(node)
|
21
|
+
case node.name.to_sym
|
22
|
+
when :id
|
23
|
+
self.id = node.content.to_i
|
24
|
+
when :title
|
25
|
+
self.title = node.content
|
26
|
+
when :artists # nested artists and headliner
|
27
|
+
node.find('*').each{|child| self.update_from_node(child)}
|
28
|
+
when :artist
|
29
|
+
self.artists ||= []
|
30
|
+
self.artists << node.content
|
31
|
+
when :headliner
|
32
|
+
self.headliner = node.content
|
33
|
+
when :venue
|
34
|
+
self.venue = LastFM::Venue.from_xml( node )
|
35
|
+
when :startDate
|
36
|
+
self.start_date = Time.parse(node.content)
|
37
|
+
when :description
|
38
|
+
self.description = node.content
|
39
|
+
when :image
|
40
|
+
self.images ||= {}
|
41
|
+
self.images.merge!({node['size'].to_sym => node.content})
|
42
|
+
when :attendance
|
43
|
+
self.attendance = node.content.to_i
|
44
|
+
when :reviews
|
45
|
+
self.reviews = node.content.to_i
|
46
|
+
when :tag
|
47
|
+
self.tag = node.content
|
48
|
+
when :url
|
49
|
+
self.url = node.content
|
50
|
+
when :website
|
51
|
+
self.website = node.content
|
52
|
+
when :tickets
|
53
|
+
# ???
|
54
|
+
when :cancelled
|
55
|
+
self.cancelled = (node.content == '1')
|
56
|
+
when :tags
|
57
|
+
self.tags = node.find('*').each{|tag| tag.content}
|
45
58
|
end
|
46
|
-
|
47
|
-
# Share an event with one or more Last.fm users or other friends.
|
48
|
-
#
|
49
|
-
# @option params [Fixnum, required] :event numeric last.fm event id
|
50
|
-
# @option params [Array, required] :recipient a list of email addresses or Last.fm usernames. maximum is 10
|
51
|
-
# @option params [String, optional] :message an optional message to send. if not supplied a default message will be used
|
52
|
-
# @option params [Boolean, optional] :public optionally show in the sharing users activity feed. defaults to false
|
53
|
-
# @see http://www.last.fm/api/show?service=350
|
54
|
-
def share( params )
|
55
|
-
LastFM.requires_authentication
|
56
|
-
LastFM.post( "#{TYPE}.share", params )
|
57
|
-
end
|
58
|
-
|
59
|
-
# Shout in an event's shoutbox.
|
60
|
-
#
|
61
|
-
# @option params [Fixnum, required] :event numeric last.fm event id
|
62
|
-
# @option params [String, required] :message message to post to the shoutbox
|
63
|
-
# @see http://www.last.fm/api/show?service=409
|
64
|
-
def shout( params )
|
65
|
-
LastFM.requires_authentication
|
66
|
-
LastFM.post( "#{TYPE}.shout", params )
|
67
|
-
end
|
68
|
-
|
69
59
|
end
|
60
|
+
|
70
61
|
end
|
71
|
-
end
|
62
|
+
end
|
data/lib/lastfm/shout.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module LastFM
|
2
|
+
|
3
|
+
# @attr [String] author
|
4
|
+
# @attr [String] body
|
5
|
+
# @attr [Time] date
|
6
|
+
class Shout < Struct.new(:author, :body, :date)
|
7
|
+
|
8
|
+
def update_from_node(node)
|
9
|
+
case node.name.to_sym
|
10
|
+
when :author
|
11
|
+
self.author = node.content
|
12
|
+
when :body
|
13
|
+
self.body = node.content
|
14
|
+
when :date
|
15
|
+
self.date = Time.parse(node.content)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module LastFM
|
2
|
+
|
3
|
+
# Prodives modifications to Ruby's Struct class for use within the LastFM module space.
|
4
|
+
# Must be called 'Struct' to play nice with YARD's @attr documentation.
|
5
|
+
class Struct < Struct
|
6
|
+
|
7
|
+
# Override Struct's initialize method to accept a hash of members instead.
|
8
|
+
def initialize(h={})
|
9
|
+
members.each{|m| self[m] = h[m.to_sym]}
|
10
|
+
end
|
11
|
+
|
12
|
+
# Get the Last.fm package name for a Ruby class
|
13
|
+
#
|
14
|
+
# @return [String] the Last.fm package name
|
15
|
+
def self.package
|
16
|
+
self.to_s.downcase.split('::').last
|
17
|
+
end
|
18
|
+
|
19
|
+
# Construct a LastFM::Struct object from XML, using each inheritor's attr_from_node
|
20
|
+
# method to determine how to manipulate individual attributes.
|
21
|
+
#
|
22
|
+
# @param [LibXML::XML::Document] xml XML obtained from a Last.fm API call
|
23
|
+
# @param [Hash] initial_attributes Attributes to set before parsing the XML
|
24
|
+
# @return [LastFM::Struct] object contructed from attributes contained in XML
|
25
|
+
def self.from_xml(xml, initial_attributes={})
|
26
|
+
raise NotImplementedError unless self.method_defined?(:update_from_node)
|
27
|
+
xml = xml.find_first(self.package) if xml.is_a?(LibXML::XML::Document)
|
28
|
+
model = self.new(initial_attributes)
|
29
|
+
xml.find('*').each{|child| model.update_from_node(child)}
|
30
|
+
model
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
data/lib/lastfm/tag.rb
CHANGED
@@ -1,94 +1,29 @@
|
|
1
1
|
module LastFM
|
2
|
-
class Tag
|
3
|
-
class << self
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
# @option params [Fixnum, optional] :page the page number to fetch. defaults to first page
|
28
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch per page. defaults to 50
|
29
|
-
# @see http://www.last.fm/api/show?service=283
|
30
|
-
def get_top_albums( params )
|
31
|
-
LastFM.get( "#{TYPE}.getTopAlbums", params )
|
3
|
+
# @attr [String] name
|
4
|
+
# @attr [Fixnum] count
|
5
|
+
# @attr [String] url
|
6
|
+
# @attr [Fixnum] reach
|
7
|
+
# @attr [Boolean] streamable
|
8
|
+
# @attr [LastFM::Wiki] wiki
|
9
|
+
class Tag < Struct.new(:name, :count, :url, :reach, :streamable, :wiki)
|
10
|
+
|
11
|
+
def update_from_node(node)
|
12
|
+
case node.name.to_sym
|
13
|
+
when :name
|
14
|
+
self.name = node.content
|
15
|
+
when :url
|
16
|
+
self.url = node.content
|
17
|
+
when :reach
|
18
|
+
self.reach = node.content.to_i
|
19
|
+
when :count, :taggings
|
20
|
+
self.count = node.content.to_i
|
21
|
+
when :streamable
|
22
|
+
self.streamable = (node.content == '1')
|
23
|
+
when :wiki
|
24
|
+
self.wiki = LastFM::Wiki.from_xml(node)
|
32
25
|
end
|
33
|
-
|
34
|
-
# Get the top artists tagged with a tag, ordered by tag count.
|
35
|
-
#
|
36
|
-
# @option params [String, required] :tag the tag name
|
37
|
-
# @option params [Fixnum, optional] :page the page number to fetch. defaults to first page
|
38
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch per page. defaults to 50
|
39
|
-
# @see http://www.last.fm/api/show?service=284
|
40
|
-
def get_top_artists( params )
|
41
|
-
LastFM.get( "#{TYPE}.getTopArtists", params )
|
42
|
-
end
|
43
|
-
|
44
|
-
# Fetches the top global tags on Last.fm, sorted by popularity (number of times used).
|
45
|
-
#
|
46
|
-
# @see http://www.last.fm/api/show?service=276
|
47
|
-
def get_top_tags
|
48
|
-
LastFM.get( "#{TYPE}.getTopTags" )
|
49
|
-
end
|
50
|
-
|
51
|
-
# Get the top tracks tagged with a tag, ordered by tag count.
|
52
|
-
#
|
53
|
-
# @option params [String, required] :tag the tag name
|
54
|
-
# @option params [Fixnum, optional] :page the page number to fetch. defaults to first page
|
55
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch per page. defaults to 50
|
56
|
-
# @see http://www.last.fm/api/show?service=285
|
57
|
-
def get_top_tracks( params )
|
58
|
-
LastFM.get( "#{TYPE}.getTopTracks", params )
|
59
|
-
end
|
60
|
-
|
61
|
-
# Get an artist chart for a tag, for a given date range. If no date range is
|
62
|
-
# supplied, it will return the most recent artist chart for this tag.
|
63
|
-
#
|
64
|
-
# @option params [String, required] :tag the tag name
|
65
|
-
# @option params [String, optional] :from date at which the chart should start from (see: Tag.get_weekly_chart_list)
|
66
|
-
# @option params [String, optional] :to date at which the chart should end on (see: Tag.get_weekly_chart_list)
|
67
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch. defaults to 50
|
68
|
-
# @see http://www.last.fm/api/show?service=358
|
69
|
-
def get_weekly_artist_chart( params )
|
70
|
-
LastFM.get( "#{TYPE}.getWeeklyArtistChart", params )
|
71
|
-
end
|
72
|
-
|
73
|
-
# Get a list of available charts for this tag, expressed as date
|
74
|
-
# ranges which can be sent to the chart services.
|
75
|
-
#
|
76
|
-
# @option params [String, required] :tag the tag name
|
77
|
-
# @see http://www.last.fm/api/show?service=359
|
78
|
-
def get_weekly_chart_list( params )
|
79
|
-
LastFM.get( "#{TYPE}.getWeeklyChartList", params )
|
80
|
-
end
|
81
|
-
|
82
|
-
# Search for a tag by name. Returns matches sorted by relevance.
|
83
|
-
#
|
84
|
-
# @option params [String, required] :tag the tag name
|
85
|
-
# @option params [Fixnum, optional] :page the page number to fetch. defaults to first page
|
86
|
-
# @option params [Fixnum, optional] :limit the number of results to fetch per page. defaults to 50
|
87
|
-
# @see http://www.last.fm/api/show?service=273
|
88
|
-
def search( params )
|
89
|
-
LastFM.get( "#{TYPE}.search", params )
|
90
|
-
end
|
91
|
-
|
92
26
|
end
|
93
|
-
|
27
|
+
|
28
|
+
end
|
94
29
|
end
|