scrobbler-ng 2.0.5 → 2.0.6

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/.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