scrobbler-ng 2.0.5 → 2.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/VERSION.yml +1 -1
- data/lib/scrobbler/base.rb +43 -5
- data/lib/scrobbler/library.rb +7 -35
- data/lib/scrobbler/user.rb +56 -44
- data/scrobbler-ng.gemspec +2 -2
- data/test/mocks/rest.rb +1 -1
- metadata +4 -4
data/.gitignore
CHANGED
data/VERSION.yml
CHANGED
data/lib/scrobbler/base.rb
CHANGED
@@ -19,6 +19,10 @@ module Scrobbler
|
|
19
19
|
# By default, there is no cache
|
20
20
|
@@cache = []
|
21
21
|
|
22
|
+
# Add a cache provider to the caching system
|
23
|
+
#
|
24
|
+
# @param [CacheProvider] cache A instance of a cache provider.
|
25
|
+
# @return [void]
|
22
26
|
def Base.add_cache(cache)
|
23
27
|
@@cache << cache
|
24
28
|
end
|
@@ -28,7 +32,7 @@ module Scrobbler
|
|
28
32
|
# This key will be used by all Scrobbler classes and objects.
|
29
33
|
#
|
30
34
|
# @param [String] api_key The default API key.
|
31
|
-
# @return [
|
35
|
+
# @return [void]
|
32
36
|
def Base.api_key=(api_key)
|
33
37
|
@@api_key = api_key
|
34
38
|
end
|
@@ -38,7 +42,7 @@ module Scrobbler
|
|
38
42
|
# This secret will be used by all Scrobbler classes and objects.
|
39
43
|
#
|
40
44
|
# @param [String] secret The default API secret.
|
41
|
-
# @return [
|
45
|
+
# @return [void]
|
42
46
|
def Base.secret=(secret)
|
43
47
|
@@secret = secret
|
44
48
|
end
|
@@ -85,7 +89,7 @@ module Scrobbler
|
|
85
89
|
# Load a request from cache if possible
|
86
90
|
#
|
87
91
|
# @param [Hash] parameters The parameters passed as URL params.
|
88
|
-
# @return [String
|
92
|
+
# @return [String]
|
89
93
|
def Base.load_from_cache(parameters)
|
90
94
|
@@cache.each do |cache|
|
91
95
|
if cache.has?(parameters)
|
@@ -99,7 +103,7 @@ module Scrobbler
|
|
99
103
|
#
|
100
104
|
# @param [String] xml The answer from the Last.fm API
|
101
105
|
# @param [Hash] parameters The parameters passed as URL params.
|
102
|
-
# @return [
|
106
|
+
# @return [void]
|
103
107
|
def Base.save_to_cache(xml, parameters)
|
104
108
|
@@cache.each do |cache|
|
105
109
|
if cache.writable? then
|
@@ -184,7 +188,7 @@ module Scrobbler
|
|
184
188
|
# Load information into instance variables.
|
185
189
|
#
|
186
190
|
# @param [Hash<String,Symbol>] data Each entry will be stored as a variable.
|
187
|
-
# @return [
|
191
|
+
# @return [void]
|
188
192
|
def populate_data(data = {})
|
189
193
|
data.each do |key, value|
|
190
194
|
instance_variable_set("@#{key.to_s}", value)
|
@@ -199,6 +203,40 @@ module Scrobbler
|
|
199
203
|
def request(api_method, parameters = {}, request_method = 'get')
|
200
204
|
Base.request(api_method, parameters, request_method)
|
201
205
|
end
|
206
|
+
|
207
|
+
# Generic request method for the most Library funtions
|
208
|
+
#
|
209
|
+
# @param [String,Symbol] api_method The method which shall be called.
|
210
|
+
# @param [Hash] options The parameters passed as URL params.
|
211
|
+
# @param [String,Symbol] parent the parent XML node to look for.
|
212
|
+
# @param [Class] element The xml node name which shall be converted
|
213
|
+
# into an object.
|
214
|
+
# @return [Array]
|
215
|
+
def call_pageable(method, parent, element, options={})
|
216
|
+
options = {:all => true}.merge options
|
217
|
+
result = []
|
218
|
+
if options.delete(:all)
|
219
|
+
doc = Base.request(method, options)
|
220
|
+
root = nil
|
221
|
+
doc.root.children.each do |child|
|
222
|
+
next unless child.name == parent.to_s
|
223
|
+
root = child
|
224
|
+
end
|
225
|
+
total_pages = root['totalPages'].to_i
|
226
|
+
root.children.each do |child|
|
227
|
+
next unless child.name == element.to_s.sub("Scrobbler::","").downcase
|
228
|
+
result << element.new_from_libxml(child)
|
229
|
+
end
|
230
|
+
(2..total_pages).each do |i|
|
231
|
+
options[:page] = i
|
232
|
+
result.concat call(method, parent, element, options)
|
233
|
+
end
|
234
|
+
else
|
235
|
+
result = call(method, parent, element, options)
|
236
|
+
end
|
237
|
+
result
|
238
|
+
end
|
239
|
+
|
202
240
|
|
203
241
|
# Call a API method
|
204
242
|
#
|
data/lib/scrobbler/library.rb
CHANGED
@@ -40,8 +40,10 @@ module Scrobbler
|
|
40
40
|
|
41
41
|
# A list of all the albums in a user's library, with play counts and tag
|
42
42
|
# counts.
|
43
|
+
# @param [Hash<Symbol>] options The options to configure this API call.
|
44
|
+
# @return [Array<Scrobbler::Tracks>] The artists included in this library.
|
43
45
|
def albums(options={})
|
44
|
-
|
46
|
+
call_pageable('library.getalbums', :albums, Album, {:user => @user.name}.merge(options))
|
45
47
|
end
|
46
48
|
|
47
49
|
# A list of all the artists in a user's library, with play counts and tag
|
@@ -50,47 +52,17 @@ module Scrobbler
|
|
50
52
|
# @param [Hash<Symbol>] options The options to configure this API call.
|
51
53
|
# @return [Array<Scrobbler::Artist>] The artists included in this library.
|
52
54
|
def artists(options={})
|
53
|
-
|
55
|
+
call_pageable('library.getartists', :artists, Artist, {:user => @user.name}.merge(options))
|
54
56
|
end
|
55
57
|
|
56
58
|
# A list of all the tracks in a user's library, with play counts and tag
|
57
59
|
# counts.
|
60
|
+
# @param [Hash<Symbol>] options The options to configure this API call.
|
61
|
+
# @return [Array<Scrobbler::Track>] The tracks included in this library.
|
58
62
|
def tracks(options={})
|
59
|
-
|
63
|
+
call_pageable('library.gettracks', :tracks, Track, {:user => @user.name}.merge(options))
|
60
64
|
end
|
61
65
|
|
62
|
-
# Generic request method for the most Library funtions
|
63
|
-
#
|
64
|
-
# @param [String,Symbol] api_method The method which shall be called.
|
65
|
-
# @param [Hash] options The parameters passed as URL params.
|
66
|
-
# @param [String,Symbol] parent the parent XML node to look for.
|
67
|
-
# @param [Class] element The xml node name which shall be converted
|
68
|
-
# into an object.
|
69
|
-
# @return [Array]
|
70
|
-
def request_library(method, parent, element, options={})
|
71
|
-
options = {:all => true, :user => @user.name}.merge options
|
72
|
-
result = []
|
73
|
-
if options.delete(:all)
|
74
|
-
doc = Base.request(method, options)
|
75
|
-
root = nil
|
76
|
-
doc.root.children.each do |child|
|
77
|
-
next unless child.name == parent.to_s
|
78
|
-
root = child
|
79
|
-
end
|
80
|
-
total_pages = root['totalPages'].to_i
|
81
|
-
root.children.each do |child|
|
82
|
-
next unless child.name == element.to_s.sub("Scrobbler::","").downcase
|
83
|
-
result << element.new_from_libxml(child)
|
84
|
-
end
|
85
|
-
(2..total_pages).each do |i|
|
86
|
-
options[:page] = i
|
87
|
-
result.concat call(method, parent, element, options)
|
88
|
-
end
|
89
|
-
else
|
90
|
-
result = call(method, parent, element, options)
|
91
|
-
end
|
92
|
-
result
|
93
|
-
end
|
94
66
|
|
95
67
|
end
|
96
68
|
end
|
data/lib/scrobbler/user.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require File.expand_path('basexmlinfo.rb', File.dirname(__FILE__))
|
4
4
|
|
5
|
-
module Scrobbler
|
5
|
+
module Scrobbler
|
6
6
|
class User < BaseXmlInfo
|
7
7
|
# Load Helper modules
|
8
8
|
include ImageObjectFuncs
|
@@ -26,7 +26,7 @@ module Scrobbler
|
|
26
26
|
# Load the data for this object out of a XML-Node
|
27
27
|
#
|
28
28
|
# @param [LibXML::XML::Node] node The XML node containing the information
|
29
|
-
# @return [
|
29
|
+
# @return [void]
|
30
30
|
def load_from_xml(node)
|
31
31
|
# Get all information from the root's children nodes
|
32
32
|
node.children.each do |child|
|
@@ -53,6 +53,9 @@ module Scrobbler
|
|
53
53
|
end #^ do |child|
|
54
54
|
end
|
55
55
|
|
56
|
+
# Create a new Scrobbler:User instance
|
57
|
+
#
|
58
|
+
# @param [Hash] data The options to initialize the class
|
56
59
|
def initialize(data={})
|
57
60
|
raise ArgumentError unless data.kind_of?(Hash)
|
58
61
|
super(data)
|
@@ -67,32 +70,12 @@ module Scrobbler
|
|
67
70
|
call('user.getevents', :events, Event, {:user => @name})
|
68
71
|
end
|
69
72
|
|
70
|
-
# Get a list of the user's friends on Last.fm.
|
73
|
+
# Get a list of the user's friends on Last.fm.
|
74
|
+
#
|
75
|
+
# @param [Hash] opts Parameters for the API request
|
76
|
+
# @return [Array<Scrobbler::User>]
|
71
77
|
def friends(opts={})
|
72
|
-
|
73
|
-
if opts.delete :all
|
74
|
-
params = {:page => 1, :limit => 50, :user => @name}.merge(opts)
|
75
|
-
doc = Base.request('user.getfriends', params)
|
76
|
-
root = nil
|
77
|
-
doc.root.children.each do |child|
|
78
|
-
next unless child.name == 'friends'
|
79
|
-
root = child
|
80
|
-
end
|
81
|
-
total_pages = root['totalPages'].to_i
|
82
|
-
root.children.each do |child|
|
83
|
-
next unless child.name == 'user'
|
84
|
-
result << Scrobbler::User.new_from_libxml(child)
|
85
|
-
end
|
86
|
-
puts total_pages
|
87
|
-
(2..total_pages).each do |i|
|
88
|
-
params[:page] = i
|
89
|
-
result.concat call('user.getfriends', :friends, User, params)
|
90
|
-
end
|
91
|
-
else
|
92
|
-
params = {:page => 1, :limit => 50, :user => @name}.merge(opts)
|
93
|
-
result = call('user.getfriends', :friends, User, params)
|
94
|
-
end
|
95
|
-
result
|
78
|
+
call_pageable('user.getfriends', :friends, User, {:user => @name}.merge(opts))
|
96
79
|
end
|
97
80
|
|
98
81
|
# Get information about a user profile.
|
@@ -102,22 +85,28 @@ module Scrobbler
|
|
102
85
|
end
|
103
86
|
|
104
87
|
# Get the last 50 tracks loved by a user.
|
88
|
+
#
|
89
|
+
# @return [Array<Scrobbler::Track>]
|
105
90
|
def loved_tracks
|
106
91
|
call('user.getlovedtracks', :lovedtracks, Track, {:user => @name})
|
107
92
|
end
|
108
93
|
|
109
94
|
# Get a list of a user's neighbours on Last.fm.
|
95
|
+
#
|
96
|
+
# @return [Array<Scrobbler::Track>]
|
110
97
|
def neighbours
|
111
98
|
call('user.getneighbours', :neighbours, User, {:user => @name})
|
112
99
|
end
|
113
100
|
|
114
|
-
# Get a paginated list of all events a user has attended in the past.
|
101
|
+
# Get a paginated list of all events a user has attended in the past.
|
115
102
|
def past_events(format=:ics)
|
116
103
|
# This needs a Event class, which is yet not available
|
117
104
|
raise NotImplementedError
|
118
105
|
end
|
119
106
|
|
120
107
|
# Get a list of a user's playlists on Last.fm.
|
108
|
+
#
|
109
|
+
# @return [Array<Scrobbler::Playlist>]
|
121
110
|
def playlists
|
122
111
|
call('user.getplaylists', :playlists, Playlist, {:user => @name})
|
123
112
|
end
|
@@ -125,14 +114,15 @@ module Scrobbler
|
|
125
114
|
# Get a list of the recent tracks listened to by this user. Indicates now
|
126
115
|
# playing track if the user is currently listening.
|
127
116
|
#
|
128
|
-
#
|
129
|
-
#
|
117
|
+
# @param [Hash] parameters
|
118
|
+
# @return [Array<Scrobbler::Track>]
|
130
119
|
def recent_tracks(parameters={})
|
131
|
-
|
132
|
-
call('user.getrecenttracks', :recenttracks, Track, parameters)
|
120
|
+
call('user.getrecenttracks', :recenttracks, Track, {:user => @name}.merge(parameters))
|
133
121
|
end
|
134
122
|
|
135
123
|
# Get Last.fm artist recommendations for a user
|
124
|
+
#
|
125
|
+
# @return [Array<Scrobbler::Artist>]
|
136
126
|
def recommended_artists
|
137
127
|
# This function require authentication, but SimpleAuth is not yet 2.0
|
138
128
|
raise NotImplementedError
|
@@ -152,50 +142,69 @@ module Scrobbler
|
|
152
142
|
end
|
153
143
|
|
154
144
|
# Get the top albums listened to by a user. You can stipulate a time period.
|
155
|
-
# Sends the overall chart by default.
|
145
|
+
# Sends the overall chart by default.
|
146
|
+
#
|
147
|
+
# @return [Array<Scrobbler::Album>]
|
156
148
|
def top_albums(period=:overall)
|
157
149
|
call('user.gettopalbums', :topalbums, Album, {:user => @name, :period => period})
|
158
150
|
end
|
159
151
|
|
160
152
|
# Get the top artists listened to by a user. You can stipulate a time
|
161
|
-
# period. Sends the overall chart by default.
|
153
|
+
# period. Sends the overall chart by default.
|
154
|
+
#
|
155
|
+
# @return [Array<Scrobbler::Artist>]
|
162
156
|
def top_artists(period=:overall)
|
163
157
|
call('user.gettopartists', :topartists, Artist, {:user => @name, :period => period})
|
164
158
|
end
|
165
159
|
|
166
|
-
#
|
160
|
+
# Get the top tags used by this user.
|
161
|
+
#
|
162
|
+
# @return [Array<Scrobbler::Tag>]
|
167
163
|
def top_tags
|
168
164
|
call('user.gettoptags', :toptags, Tag, {:user => @name})
|
169
165
|
end
|
170
166
|
|
171
167
|
# Get the top tracks listened to by a user. You can stipulate a time period.
|
172
|
-
# Sends the overall chart by default.
|
168
|
+
# Sends the overall chart by default.
|
169
|
+
#
|
170
|
+
# @return [Array<Scrobbler::Track>]
|
173
171
|
def top_tracks(period=:overall)
|
174
172
|
call('user.gettoptracks', :toptracks, Track, {:user => @name, :period => period})
|
175
173
|
end
|
176
174
|
|
177
175
|
# Setup the parameters for a *chart API call
|
178
|
-
|
176
|
+
#
|
177
|
+
# @param [Class] type
|
178
|
+
# @return [Array]
|
179
|
+
def get_chart(type, from, to)
|
179
180
|
parameters = {:user => @name}
|
180
181
|
parameters[:from] = from unless from.nil?
|
181
182
|
parameters[:to] = to unless to.nil?
|
182
|
-
|
183
|
+
downType = type.to_s.sub("Scrobbler::","").downcase
|
184
|
+
call('user.getweekly'+ downType + 'chart',
|
185
|
+
'weekly' + downType + 'chart', type, parameters)
|
183
186
|
end
|
184
187
|
|
185
188
|
# Get an album chart for a user profile, for a given date range. If no date
|
186
189
|
# range is supplied, it will return the most recent album chart for this
|
187
190
|
# user.
|
191
|
+
#
|
192
|
+
# @param [int] from Starttime
|
193
|
+
# @param [int] to Endtime
|
194
|
+
# @return [Array<Scrobbler::Album>]
|
188
195
|
def weekly_album_chart(from=nil, to=nil)
|
189
|
-
|
190
|
-
call('user.getweeklyalbumchart', :weeklyalbumchart, Album, parameters)
|
196
|
+
get_chart(Album, from, to)
|
191
197
|
end
|
192
198
|
|
193
199
|
# Get an artist chart for a user profile, for a given date range. If no date
|
194
200
|
# range is supplied, it will return the most recent artist chart for this
|
195
201
|
# user.
|
202
|
+
#
|
203
|
+
# @param [int] from Starttime
|
204
|
+
# @param [int] to Endtime
|
205
|
+
# @return [Array<Scrobbler::Artist>]
|
196
206
|
def weekly_artist_chart(from=nil, to=nil)
|
197
|
-
|
198
|
-
call('user.getweeklyartistchart', :weeklyartistchart, Artist, parameters)
|
207
|
+
get_chart(Artist, from, to)
|
199
208
|
end
|
200
209
|
|
201
210
|
# Get a list of available charts for this user, expressed as date ranges
|
@@ -208,9 +217,12 @@ module Scrobbler
|
|
208
217
|
# Get a track chart for a user profile, for a given date range. If no date
|
209
218
|
# range is supplied, it will return the most recent track chart for this
|
210
219
|
# user.
|
220
|
+
#
|
221
|
+
# @param [int] from Starttime
|
222
|
+
# @param [int] to Endtime
|
223
|
+
# @return [Array<Scrobbler::Track>]
|
211
224
|
def weekly_track_chart(from=nil, to=nil)
|
212
|
-
|
213
|
-
call('user.getweeklytrackchart', :weeklytrackchart, Track, parameters)
|
225
|
+
get_chart(Track, from, to)
|
214
226
|
end
|
215
227
|
|
216
228
|
# Shout on this user's shoutbox
|
data/scrobbler-ng.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{scrobbler-ng}
|
8
|
-
s.version = "2.0.
|
8
|
+
s.version = "2.0.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["John Nunemaker", "Jonathan Rudenberg", "Uwe L. Korn"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-08-05}
|
13
13
|
s.description = %q{A ruby library for accessing the Last.fm 2.0 API. It is higly optimized so that it uses less memory and parses XML (through Nokogiri) than other implementations.}
|
14
14
|
s.email = %q{uwelk@xhochy.org}
|
15
15
|
s.extra_rdoc_files = [
|
data/test/mocks/rest.rb
CHANGED
@@ -103,7 +103,7 @@ register_fw('user=jnunemaker&period=overall&api_key=foo123&method=user.gettopalb
|
|
103
103
|
'user', 'topalbums.xml')
|
104
104
|
register_fw('user=jnunemaker&api_key=foo123&method=user.getneighbours',
|
105
105
|
'user', 'neighbours.xml')
|
106
|
-
register_fw('user=jnunemaker&
|
106
|
+
register_fw('user=jnunemaker&api_key=foo123&method=user.getfriends',
|
107
107
|
'user', 'friends.xml')
|
108
108
|
register_fw('user=jnunemaker&api_key=foo123&method=user.getrecenttracks',
|
109
109
|
'user', 'recenttracks.xml')
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scrobbler-ng
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 2.0.
|
9
|
+
- 6
|
10
|
+
version: 2.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Nunemaker
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-
|
20
|
+
date: 2010-08-05 00:00:00 +02:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|