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 CHANGED
@@ -12,3 +12,5 @@ catalog.xml
12
12
  tmp
13
13
  .project
14
14
  .loadpath
15
+ view*.sh
16
+ .chomrium/
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- :patch: 5
2
+ :patch: 6
3
3
  :major: 2
4
4
  :build:
5
5
  :minor: 0
@@ -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 [nil]
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 [nil]
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,nil]
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 [nil]
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 [nil]
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
  #
@@ -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
- request_library('library.getalbums', :albums, Album, options)
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
- request_library('library.getartists', :artists, Artist, options)
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
- request_library('library.gettracks', :tracks, Track, options)
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
@@ -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 [nil]
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
- result = []
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
- # Possible parameters:
129
- # - limit: An integer used to limit the number of tracks returned.
117
+ # @param [Hash] parameters
118
+ # @return [Array<Scrobbler::Track>]
130
119
  def recent_tracks(parameters={})
131
- parameters.merge!({:user => @name})
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
- # Get the top tags used by this user.
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
- def setup_chart_params(from=nil, to=nil)
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
- parameters
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
- parameters = setup_chart_params(from, to)
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
- parameters = setup_chart_params(from, to)
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
- parameters = setup_chart_params(from, to)
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.5"
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-07-30}
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&page=1&limit=50&api_key=foo123&method=user.getfriends',
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: 5
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 0
9
- - 5
10
- version: 2.0.5
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-07-30 00:00:00 +02:00
20
+ date: 2010-08-05 00:00:00 +02:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency