scrobbler-ng 2.0.1 → 2.0.2

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.
Files changed (122) hide show
  1. data/VERSION.yml +2 -2
  2. data/lib/scrobbler.rb +4 -2
  3. data/lib/scrobbler/album.rb +2 -8
  4. data/lib/scrobbler/artist.rb +5 -7
  5. data/lib/scrobbler/base.rb +9 -34
  6. data/lib/scrobbler/basexml.rb +1 -0
  7. data/lib/scrobbler/basexmlinfo.rb +18 -0
  8. data/lib/scrobbler/event.rb +3 -7
  9. data/lib/scrobbler/helper/image.rb +1 -2
  10. data/lib/scrobbler/playlist.rb +2 -7
  11. data/lib/scrobbler/shout.rb +0 -2
  12. data/lib/scrobbler/tag.rb +55 -93
  13. data/lib/scrobbler/user.rb +12 -16
  14. data/lib/scrobbler/venue.rb +6 -6
  15. data/tasks/jeweler.rake +5 -6
  16. data/tasks/tests.rake +8 -6
  17. data/test/mocks/rest.rb +1 -1
  18. data/test/unit/tag_spec.rb +1 -1
  19. data/test/unit/venue_spec.rb +3 -2
  20. metadata +56 -134
  21. data/lib/scrobbler/scrobble.rb +0 -116
  22. data/test/fixtures/xml/album/info.xml +0 -43
  23. data/test/fixtures/xml/artist/fans.xml +0 -52
  24. data/test/fixtures/xml/artist/info.xml +0 -58
  25. data/test/fixtures/xml/artist/similar.xml +0 -1004
  26. data/test/fixtures/xml/artist/topalbums.xml +0 -61
  27. data/test/fixtures/xml/artist/toptags.xml +0 -19
  28. data/test/fixtures/xml/artist/toptracks.xml +0 -62
  29. data/test/fixtures/xml/auth/session.xml +0 -7
  30. data/test/fixtures/xml/auth/token.xml +0 -3
  31. data/test/fixtures/xml/event/attend.xml +0 -3
  32. data/test/fixtures/xml/event/attendees.xml +0 -53
  33. data/test/fixtures/xml/event/event.xml +0 -35
  34. data/test/fixtures/xml/event/shouts.xml +0 -35
  35. data/test/fixtures/xml/geo/events-distance-p1.xml +0 -151
  36. data/test/fixtures/xml/geo/events-lat-long.xml +0 -167
  37. data/test/fixtures/xml/geo/events-p1.xml +0 -152
  38. data/test/fixtures/xml/geo/events-p2.xml +0 -380
  39. data/test/fixtures/xml/geo/events-p3.xml +0 -427
  40. data/test/fixtures/xml/geo/top_artists-p1.xml +0 -76
  41. data/test/fixtures/xml/geo/top_tracks-p1.xml +0 -77
  42. data/test/fixtures/xml/library/albums-f30.xml +0 -454
  43. data/test/fixtures/xml/library/albums-p1.xml +0 -754
  44. data/test/fixtures/xml/library/albums-p2.xml +0 -754
  45. data/test/fixtures/xml/library/albums-p3.xml +0 -754
  46. data/test/fixtures/xml/library/albums-p4.xml +0 -739
  47. data/test/fixtures/xml/library/albums-p5.xml +0 -754
  48. data/test/fixtures/xml/library/albums-p6.xml +0 -754
  49. data/test/fixtures/xml/library/albums-p7.xml +0 -739
  50. data/test/fixtures/xml/library/albums-p8.xml +0 -724
  51. data/test/fixtures/xml/library/artists-f30.xml +0 -334
  52. data/test/fixtures/xml/library/artists-p1.xml +0 -554
  53. data/test/fixtures/xml/library/artists-p2.xml +0 -554
  54. data/test/fixtures/xml/library/artists-p3.xml +0 -554
  55. data/test/fixtures/xml/library/artists-p4.xml +0 -554
  56. data/test/fixtures/xml/library/artists-p5.xml +0 -554
  57. data/test/fixtures/xml/library/artists-p6.xml +0 -554
  58. data/test/fixtures/xml/library/artists-p7.xml +0 -444
  59. data/test/fixtures/xml/library/tracks-f30.xml +0 -472
  60. data/test/fixtures/xml/library/tracks-p1.xml +0 -789
  61. data/test/fixtures/xml/library/tracks-p10.xml +0 -771
  62. data/test/fixtures/xml/library/tracks-p11.xml +0 -792
  63. data/test/fixtures/xml/library/tracks-p12.xml +0 -777
  64. data/test/fixtures/xml/library/tracks-p13.xml +0 -762
  65. data/test/fixtures/xml/library/tracks-p14.xml +0 -759
  66. data/test/fixtures/xml/library/tracks-p15.xml +0 -762
  67. data/test/fixtures/xml/library/tracks-p16.xml +0 -756
  68. data/test/fixtures/xml/library/tracks-p17.xml +0 -780
  69. data/test/fixtures/xml/library/tracks-p18.xml +0 -756
  70. data/test/fixtures/xml/library/tracks-p19.xml +0 -774
  71. data/test/fixtures/xml/library/tracks-p2.xml +0 -765
  72. data/test/fixtures/xml/library/tracks-p20.xml +0 -777
  73. data/test/fixtures/xml/library/tracks-p21.xml +0 -777
  74. data/test/fixtures/xml/library/tracks-p22.xml +0 -771
  75. data/test/fixtures/xml/library/tracks-p23.xml +0 -765
  76. data/test/fixtures/xml/library/tracks-p24.xml +0 -783
  77. data/test/fixtures/xml/library/tracks-p25.xml +0 -777
  78. data/test/fixtures/xml/library/tracks-p26.xml +0 -777
  79. data/test/fixtures/xml/library/tracks-p27.xml +0 -756
  80. data/test/fixtures/xml/library/tracks-p28.xml +0 -771
  81. data/test/fixtures/xml/library/tracks-p29.xml +0 -753
  82. data/test/fixtures/xml/library/tracks-p3.xml +0 -771
  83. data/test/fixtures/xml/library/tracks-p30.xml +0 -780
  84. data/test/fixtures/xml/library/tracks-p31.xml +0 -753
  85. data/test/fixtures/xml/library/tracks-p32.xml +0 -771
  86. data/test/fixtures/xml/library/tracks-p33.xml +0 -762
  87. data/test/fixtures/xml/library/tracks-p34.xml +0 -538
  88. data/test/fixtures/xml/library/tracks-p4.xml +0 -792
  89. data/test/fixtures/xml/library/tracks-p5.xml +0 -780
  90. data/test/fixtures/xml/library/tracks-p6.xml +0 -789
  91. data/test/fixtures/xml/library/tracks-p7.xml +0 -789
  92. data/test/fixtures/xml/library/tracks-p8.xml +0 -780
  93. data/test/fixtures/xml/library/tracks-p9.xml +0 -774
  94. data/test/fixtures/xml/tag/similar.xml +0 -254
  95. data/test/fixtures/xml/tag/topalbums.xml +0 -805
  96. data/test/fixtures/xml/tag/topartists.xml +0 -605
  97. data/test/fixtures/xml/tag/toptags.xml +0 -1254
  98. data/test/fixtures/xml/tag/toptracks.xml +0 -852
  99. data/test/fixtures/xml/track/fans.xml +0 -34
  100. data/test/fixtures/xml/track/info.xml +0 -53
  101. data/test/fixtures/xml/track/toptags.xml +0 -504
  102. data/test/fixtures/xml/user/events.xml +0 -401
  103. data/test/fixtures/xml/user/friends.xml +0 -30
  104. data/test/fixtures/xml/user/lovedtracks.xml +0 -678
  105. data/test/fixtures/xml/user/neighbours.xml +0 -23
  106. data/test/fixtures/xml/user/playlists.xml +0 -61
  107. data/test/fixtures/xml/user/profile.xml +0 -12
  108. data/test/fixtures/xml/user/recentbannedtracks.xml +0 -24
  109. data/test/fixtures/xml/user/recentlovedtracks.xml +0 -24
  110. data/test/fixtures/xml/user/recenttracks.xml +0 -124
  111. data/test/fixtures/xml/user/systemrecs.xml +0 -18
  112. data/test/fixtures/xml/user/topalbums.xml +0 -61
  113. data/test/fixtures/xml/user/topartists.xml +0 -41
  114. data/test/fixtures/xml/user/toptags.xml +0 -44
  115. data/test/fixtures/xml/user/toptracks.xml +0 -65
  116. data/test/fixtures/xml/user/weeklyalbumchart.xml +0 -256
  117. data/test/fixtures/xml/user/weeklyartistchart.xml +0 -220
  118. data/test/fixtures/xml/user/weeklytrackchart.xml +0 -746
  119. data/test/fixtures/xml/venue/events.xml +0 -151
  120. data/test/fixtures/xml/venue/venue.xml +0 -16
  121. data/test/unit/scrobble_spec.rb +0 -55
  122. data/test/unit/scrobble_test.rb +0 -69
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- :minor: 0
3
- :patch: 1
4
2
  :major: 2
3
+ :minor: 0
4
+ :patch: 2
5
5
  :build:
data/lib/scrobbler.rb CHANGED
@@ -1,5 +1,8 @@
1
+ # encoding: utf-8
1
2
 
2
- %w{uri rubygems libxml time}.each { |x| require x }
3
+ require 'rubygems'
4
+ require 'uri'
5
+ require 'time'
3
6
 
4
7
  $: << File.expand_path(File.dirname(__FILE__))
5
8
 
@@ -27,7 +30,6 @@ require 'scrobbler/playlist'
27
30
  require 'scrobbler/radio'
28
31
 
29
32
  require 'scrobbler/simpleauth'
30
- require 'scrobbler/scrobble'
31
33
  require 'scrobbler/playing'
32
34
 
33
35
  require 'scrobbler/rest'
@@ -1,10 +1,10 @@
1
1
  # encoding: utf-8
2
2
 
3
- require File.expand_path('basexml.rb', File.dirname(__FILE__))
3
+ require File.expand_path('basexmlinfo.rb', File.dirname(__FILE__))
4
4
 
5
5
  module Scrobbler
6
6
  # @todo Add missing functions that require authentication
7
- class Album < BaseXml
7
+ class Album < BaseXmlInfo
8
8
  include Scrobbler::ImageObjectFuncs
9
9
 
10
10
  attr_reader :artist, :artist_mbid, :name, :mbid, :playcount, :rank, :url
@@ -28,16 +28,10 @@ module Scrobbler
28
28
  # If the additional parameter :include_info is set to true, additional
29
29
  # information is loaded
30
30
  #
31
- # @todo Albums should be able to be created via a MusicBrainz id too
32
- #
33
31
  # @param [Hash] data The options to initialize the class
34
32
  def initialize(data={})
35
33
  raise ArgumentError unless data.kind_of?(Hash)
36
34
  super(data)
37
- data = {:include_info => false}.merge(data)
38
- # Load data given as method-parameter
39
- load_info() if data.delete(:include_info)
40
- populate_data(data)
41
35
 
42
36
  raise ArgumentError, "Artist or mbid is required" if @artist.nil? && @mbid.nil?
43
37
  raise ArgumentError, "Name is required" if @name.empty?
@@ -1,11 +1,11 @@
1
1
  # encoding: utf-8
2
2
 
3
- require File.expand_path('basexml.rb', File.dirname(__FILE__))
3
+ require File.expand_path('basexmlinfo.rb', File.dirname(__FILE__))
4
4
 
5
5
  module Scrobbler
6
6
  # @todo Add missing functions that require authentication
7
7
  # @todo Integrate search functionality into this class which is already implemented in Scrobbler::Search
8
- class Artist < BaseXml
8
+ class Artist < BaseXmlInfo
9
9
  include Scrobbler::ImageObjectFuncs
10
10
  include Scrobbler::StreamableObjectFuncs
11
11
 
@@ -25,14 +25,12 @@ module Scrobbler
25
25
  def initialize(data = {})
26
26
  raise ArgumentError unless data.kind_of?(Hash)
27
27
  super(data)
28
- # Load data given as method-parameter
29
- populate_data(data)
30
28
  raise ArgumentError, "Name is required" if @name.nil? || @name.strip.empty?
31
29
  end
32
30
 
33
31
  # Load the data for this object out of a XML-Node
34
32
  #
35
- # @param [LibXML::XML::Node] node The XML node containing the information
33
+ # @param [XML::Node] node The XML node containing the information
36
34
  # @return [nil]
37
35
  def load_from_xml(node)
38
36
  # Get all information from the root's children nodes
@@ -51,7 +49,7 @@ module Scrobbler
51
49
  when 'chartposition'
52
50
  @chartposition = child.content
53
51
  when 'name'
54
- @name = child.content.to_s
52
+ @name = child.content
55
53
  when 'image'
56
54
  check_image_node(child)
57
55
  when 'streamable'
@@ -77,7 +75,7 @@ module Scrobbler
77
75
  end #^ do |child|
78
76
 
79
77
  # Get all information from the root's attributes
80
- @name = node['name'].to_s unless node['name'].nil?
78
+ @name = node['name'] unless node['name'].nil?
81
79
  @rank = node['rank'].to_i unless node['rank'].nil?
82
80
  maybe_streamable_attribute(node)
83
81
  @mbid = node['mbid'] unless node['mbid'].nil?
@@ -1,9 +1,8 @@
1
1
  require 'digest/md5'
2
+ require 'nokogiri'
2
3
 
3
4
  $KCODE = 'u'
4
5
 
5
- include LibXML
6
-
7
6
  module Scrobbler
8
7
 
9
8
  API_URL = 'http://ws.audioscrobbler.com/'
@@ -44,24 +43,6 @@ module Scrobbler
44
43
  URI.escape(param.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
45
44
  end
46
45
 
47
- # Camelize and Constanize a string.
48
- #
49
- # @param [String,Symbol] word The word which should be camelized and
50
- # constanized.
51
- # @return [Constant]
52
- def Base.constanize(word)
53
- names = word.to_s.gsub(/\/(.?)/) do
54
- "::#{$1.upcase}"
55
- end.gsub(/(?:^|_)(.)/) { $1.upcase }.split('::')
56
- names.shift if names.empty? || names.first.empty?
57
-
58
- constant = Object
59
- names.each do |name|
60
- constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
61
- end
62
- constant
63
- end
64
-
65
46
  # Initiate a API and parse it.
66
47
  #
67
48
  # @param [String,Symbol] api_method The API method to call.
@@ -70,13 +51,8 @@ module Scrobbler
70
51
  # @param [Hash<String,Symbol>] parameters The parameters for the method call.
71
52
  # @return [Array<Scrobbler::Base>]
72
53
  def Base.get(api_method, parent, element, parameters = {})
73
- if (element.is_a?(Class))
74
- scrobbler_class = element
75
- element = element.to_s.sub("Scrobbler::","").downcase
76
- else
77
- element = element.to_s
78
- scrobbler_class = constanize("scrobbler/#{element}")
79
- end
54
+ scrobbler_class = element
55
+ element = element.to_s.sub("Scrobbler::","").downcase
80
56
  doc = request(api_method, parameters)
81
57
  elements = []
82
58
  doc.root.children.each do |child|
@@ -131,15 +107,14 @@ module Scrobbler
131
107
  paramlist << "#{sanitize(key)}=#{sanitize(value)}"
132
108
  end
133
109
  end
134
- url = '/2.0/?' + paramlist.join('&')
135
- XML::Document.string(self.connection.send(request_method,url))
110
+ url = "/2.0/?#{paramlist.join('&')}"
111
+ xml = self.connection.send(request_method, url)
112
+ doc = Nokogiri::XML(xml) do |config|
113
+ config.noent.noblanks.nonet
114
+ end
115
+ doc
136
116
  end
137
117
 
138
- # @deprecated
139
- def get_response(api_method, instance_name, parent, element, params, force=true)
140
- Base.get(api_method, parent, element, params)
141
- end
142
-
143
118
  # Load information into instance variables.
144
119
  #
145
120
  # @param [Hash<String,Symbol>] data Each entry will be stored as a variable.
@@ -12,6 +12,7 @@ module Scrobbler
12
12
  load_from_xml(data[:xml])
13
13
  data.delete(:xml)
14
14
  end
15
+ populate_data(data)
15
16
  end
16
17
  end
17
18
  end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('basexml.rb', File.dirname(__FILE__))
4
+
5
+ module Scrobbler
6
+ class BaseXmlInfo < BaseXml
7
+ # Load data out of a XML node, fetch addtional info if requested
8
+ #
9
+ # @param [Hash] data
10
+ def initialize(data = {})
11
+ raise ArgumentError unless data.kind_of?(Hash)
12
+ data = {:include_info => false}.merge(data)
13
+ fetch_info = data.delete(:include_info)
14
+ super(data)
15
+ load_info() if fetch_info
16
+ end
17
+ end
18
+ end
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
2
 
3
- require File.expand_path('basexml.rb', File.dirname(__FILE__))
3
+ require File.expand_path('basexmlinfo.rb', File.dirname(__FILE__))
4
4
 
5
5
  module Scrobbler
6
- class Event < BaseXml
6
+ class Event < BaseXmlInfo
7
7
  # Load Helper modules
8
8
  include ImageObjectFuncs
9
9
 
@@ -24,11 +24,7 @@ module Scrobbler
24
24
  def initialize(data = {})
25
25
  raise ArgumentError unless data.kind_of?(Hash)
26
26
  super(data)
27
- data = {:include_info => false}.merge(data)
28
- # Load data given as method-parameter
29
- load_info() if data.delete(:include_info)
30
- populate_data(data)
31
-
27
+
32
28
  raise ArgumentError, "ID is required" if @id.nil?
33
29
  end
34
30
 
@@ -9,10 +9,9 @@ module Scrobbler
9
9
  # of, read it into that given hash of data
10
10
  #
11
11
  # @param [Hash<Symbol, String>] data The data extracted from an API response
12
- # @param [LibXML::XML::Node] node XML node, part of the API response
12
+ # @param [(LibXML::)XML::Node] node XML node, part of the API response
13
13
  def maybe_image_node(data, node)
14
14
  raise ArgumentError unless data.kind_of?(Hash)
15
- raise ArgumentError unless node.kind_of?(LibXML::XML::Node)
16
15
  if node.name == 'image'
17
16
  case node['size'].to_s # convert to string to fix libxml-ruby bug
18
17
  when 'small'
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
2
 
3
- require File.expand_path('basexml.rb', File.dirname(__FILE__))
3
+ require File.expand_path('basexmlinfo.rb', File.dirname(__FILE__))
4
4
 
5
5
  module Scrobbler
6
- class Playlist < BaseXml
6
+ class Playlist < BaseXmlInfo
7
7
  # Load Helper modules
8
8
  include ImageObjectFuncs
9
9
  include Scrobbler::StreamableObjectFuncs
@@ -26,11 +26,6 @@ module Scrobbler
26
26
  def initialize(data={})
27
27
  raise ArgumentError unless data.kind_of?(Hash)
28
28
  super(data)
29
- data = {:include_info => false}.merge(data)
30
- # Load data given as method-parameter
31
- load_info() if data.delete(:include_info)
32
- populate_data(data)
33
-
34
29
  raise ArgumentError, "Url is required" if @url.empty?
35
30
  end
36
31
 
@@ -16,8 +16,6 @@ module Scrobbler
16
16
  def initialize(data={})
17
17
  raise ArgumentError unless data.kind_of?(Hash)
18
18
  super(data)
19
- # Load data given as method-parameter
20
- populate_data(data)
21
19
  end
22
20
 
23
21
  # Load the data for this object out of a XML-Node
data/lib/scrobbler/tag.rb CHANGED
@@ -1,106 +1,69 @@
1
- # Below is code samples for how to find the top albums and tracks for a tag.
2
- #
3
- # tag = Scrobbler::Tag.new('country')
4
- #
5
- # puts 'Top Albums'
6
- # tag.top_albums.each { |a| puts "(#{a.count}) #{a.name} by #{a.artist}" }
7
- #
8
- # puts
9
- #
10
- # puts 'Top Tracks'
11
- # tag.top_tracks.each { |t| puts "(#{t.count}) #{t.name} by #{t.artist}" }
12
- #
13
- # Which would output something similar to:
14
- #
15
- # Top Albums
16
- # (29) American IV: The Man Comes Around by Johnny Cash
17
- # (14) Folks Pop In at the Waterhouse by Various Artists
18
- # (13) Hapless by Flowers From The Man Who Shot Your Cousin
19
- # (9) Taking The Long Way by Dixie Chicks
20
- # (8) Unchained by Johnny Cash
21
- # (8) American III: Solitary Man by Johnny Cash
22
- # (8) Wide Open Spaces by Dixie Chicks
23
- # (7) It's Now or Later by Tangled Star
24
- # (7) Greatest Hits by Hank Williams
25
- # (7) American Recordings by Johnny Cash
26
- # (6) Forgotten Landscape by theNoLifeKing
27
- # (6) At Folsom Prison by Johnny Cash
28
- # (6) Fox Confessor Brings the Flood by Neko Case
29
- # (6) Murder by Johnny Cash
30
- # (5) Gloom by theNoLifeKing
31
- # (5) Set This Circus Down by Tim McGraw
32
- # (5) Blacklisted by Neko Case
33
- # (5) Breathe by Faith Hill
34
- # (5) Unearthed (disc 4: My Mother's Hymn Book) by Johnny Cash
35
- # (4) Home by Dixie Chicks
36
- #
37
- # Top Tracks
38
- # (221) Hurt by Johnny Cash
39
- # (152) I Walk the Line by Johnny Cash
40
- # (147) Ring of Fire by Johnny Cash
41
- # (125) Folsom Prison Blues by Johnny Cash
42
- # (77) The Man Comes Around by Johnny Cash
43
- # (67) Personal Jesus by Johnny Cash
44
- # (65) Not Ready To Make Nice by Dixie Chicks
45
- # (63) Before He Cheats by Carrie Underwood
46
- # (62) Give My Love to Rose by Johnny Cash
47
- # (49) Jackson by Johnny Cash
48
- # (49) What Hurts The Most by Rascal Flatts
49
- # (48) Big River by Johnny Cash
50
- # (46) Man in Black by Johnny Cash
51
- # (46) Jolene by Dolly Parton
52
- # (46) Friends in Low Places by Garth Brooks
53
- # (46) One by Johnny Cash
54
- # (44) Cocaine Blues by Johnny Cash
55
- # (41) Get Rhythm by Johnny Cash
56
- # (41) I Still Miss Someone by Johnny Cash
57
- # (40) The Devil Went Down to Georgia by Charlie Daniels Band
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('basexml.rb', File.dirname(__FILE__))
4
+
58
5
  module Scrobbler
59
- class Tag < Base
60
- attr_accessor :name, :count, :url, :streamable
6
+ class Tag < BaseXml
7
+ include Scrobbler::StreamableObjectFuncs
8
+
9
+ attr_reader :name, :count, :url, :streamable
61
10
 
62
- class << self
63
- def new_from_libxml(xml)
64
- data = {}
65
- xml.children.each do |child|
66
- data[:name] = child.content if child.name == 'name'
67
- data[:count] = child.content.to_i if child.name == 'count'
68
- data[:url] = child.content if child.name == 'url'
69
- if child.name == 'streamable'
70
- if ['1', 'true'].include?(child.content)
71
- data[:streamable] = true
72
- else
73
- data[:streamable] = false
74
- end
75
- end
76
- end
77
-
78
- Tag.new(data[:name], data)
79
- end
11
+ # Alias for Artist.new(:xml => xml)
12
+ #
13
+ # @deprecated
14
+ def self.new_from_libxml(xml)
15
+ Tag.new(:xml => xml)
80
16
  end
81
17
 
82
- def initialize(name, data={})
83
- raise ArgumentError, "Name is required" if name.empty?
84
- @name = name
85
- @url = data[:url] unless data[:url].nil?
86
- @count = data[:count] unless data[:count].nil?
87
- @streamable = data[:streamable] unless data[:streamable].nil?
18
+ # Create a new Scrobbler::Artist instance
19
+ #
20
+ # @param [Hash] data The options to initialize the class
21
+ def initialize(data = {})
22
+ raise ArgumentError unless data.kind_of?(Hash)
23
+ super(data)
24
+ raise ArgumentError, "Name is required" if @name.nil? || @name.strip.empty?
88
25
  end
89
26
 
90
- def top_artists(force=false)
91
- get_response('tag.gettopartists', :top_artists, 'topartists', 'artist', {'tag'=>@name}, force)
27
+ # Load the data for this object out of a XML-Node
28
+ #
29
+ # @param [XML::Node] node The XML node containing the information
30
+ # @return [nil]
31
+ def load_from_xml(node)
32
+ # Get all information from the root's children nodes
33
+ node.children.each do |child|
34
+ case child.name
35
+ when 'count'
36
+ @count = child.content.to_i
37
+ when 'url'
38
+ @url = child.content
39
+ when 'name'
40
+ @name = child.content
41
+ when 'streamable'
42
+ check_streamable_node(child)
43
+ when 'text'
44
+ # ignore, these are only blanks
45
+ when '#text'
46
+ # libxml-jruby version of blanks
47
+ else
48
+ raise NotImplementedError, "Field '#{child.name}' not known (#{child.content})"
49
+ end #^ case
50
+ end #^ do |child|
51
+ end #^ load_from_xml
52
+
53
+ def top_artists
54
+ call('tag.gettopartists', :topartists, Artist, {:tag => @name})
92
55
  end
93
56
 
94
- def top_albums(force=false)
95
- get_response('tag.gettopalbums', :top_albums, 'topalbums', 'album', {'tag'=>@name}, force)
57
+ def top_albums
58
+ call('tag.gettopalbums', :topalbums, Album, {:tag => @name})
96
59
  end
97
60
 
98
- def top_tracks(force=false)
99
- get_response('tag.gettoptracks', :top_tracks, 'toptracks', 'track', {'tag'=>@name}, force)
61
+ def top_tracks
62
+ call('tag.gettoptracks', :toptracks, Track, {:tag => @name})
100
63
  end
101
64
 
102
65
  def self.top_tags
103
- Base.get('tag.gettoptags', :toptags, :tag)
66
+ Base.get('tag.gettoptags', :toptags, Tag)
104
67
  end
105
68
 
106
69
  def self.search
@@ -111,9 +74,8 @@ module Scrobbler
111
74
 
112
75
  # Search for tags similar to this one. Returns tags ranked by similarity,
113
76
  # based on listening data.
114
- def similar(force=false)
115
- params = {:tag => @name}
116
- get_response('tag.getsimilar', :similar, 'similartags', 'tag', params, force)
77
+ def similar
78
+ call('tag.getsimilar', :similartags, Tag, {:tag => @name})
117
79
  end
118
80
 
119
81
  def weekly_artist_chart