scrobbler-ng 2.0.0 → 2.0.1

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.
@@ -1,3 +1,7 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('base.rb', File.dirname(__FILE__))
4
+
1
5
  module Scrobbler
2
6
  # Class for invocation of library.* API functions.
3
7
  class Library < Base
@@ -9,13 +13,13 @@ module Scrobbler
9
13
  # is requested.
10
14
  # @raise ArgumentError If a not supported type is given as user.
11
15
  def initialize(user)
12
- case user.class
13
- when user.class == Scrobbler::User
14
- @user = user
15
- when [String, Symbol].contains?(user.class)
16
- @user = Scrobbler::User.new(user.to_s)
17
- else
18
- raise ArgumentError("Invalid argument for user.")
16
+ super()
17
+ if user.kind_of?(Scrobbler::User)
18
+ @user = user
19
+ elsif user.kind_of?(String)
20
+ @user = Scrobbler::User.new(:name => user.to_s)
21
+ else
22
+ raise ArgumentError, "Invalid argument for user: #{user.class}"
19
23
  end
20
24
  end
21
25
 
@@ -37,85 +41,55 @@ module Scrobbler
37
41
  # A list of all the albums in a user's library, with play counts and tag
38
42
  # counts.
39
43
  def albums(options={})
40
- options = {:force => false, :all => true}.merge options
41
- options[:user] = @user.name
42
- albums = []
43
- if options[:all]
44
- doc = Base.request('library.getalbums', options)
45
- root = nil
46
- doc.root.children.each do |child|
47
- next unless child.name == 'albums'
48
- root = child
49
- end
50
- total_pages = root['totalPages'].to_i
51
- root.children.each do |child|
52
- next unless child.name == 'album'
53
- albums << Scrobbler::Album.new_from_libxml(child)
54
- end
55
- for i in 2..total_pages do
56
- options[:page] = i
57
- albums.concat get_response('library.getalbums', :none, 'albums', 'album', options, true)
58
- end
59
- else
60
- albums = get_response('library.getalbums', :get_albums, 'albums', 'album', options, true)
61
- end
62
- albums
44
+ request_library('library.getalbums', :albums, Album, options)
63
45
  end
64
46
 
65
47
  # A list of all the artists in a user's library, with play counts and tag
66
48
  # counts.
49
+ #
50
+ # @param [Hash<Symbol>] options The options to configure this API call.
51
+ # @return [Array<Scrobbler::Artist>] The artists included in this library.
67
52
  def artists(options={})
68
- options = {:force => false, :all => true}.merge options
69
- options[:user] = @user.name
70
- artists = []
71
- if options[:all]
72
- doc = Base.request('library.getartists', options)
73
- root = nil
74
- doc.root.children.each do |child|
75
- next unless child.name == 'artists'
76
- root = child
77
- end
78
- total_pages = root['totalPages'].to_i
79
- root.children.each do |child|
80
- next unless child.name == 'artist'
81
- artists << Scrobbler::Artist.new_from_libxml(child)
82
- end
83
- for i in 2..total_pages do
84
- options[:page] = i
85
- artists.concat get_response('library.getartists', :none, 'artists', 'artist', options, true)
86
- end
87
- else
88
- artists = get_response('library.getartists', :get_albums, 'artists', 'artist', options, true)
89
- end
90
- artists
53
+ request_library('library.getartists', :artists, Artist, options)
91
54
  end
92
55
 
93
56
  # A list of all the tracks in a user's library, with play counts and tag
94
57
  # counts.
95
58
  def tracks(options={})
96
- options = {:force => false, :all => true}.merge options
97
- options[:user] = @user.name
98
- tracks = []
99
- if options[:all]
100
- doc = Base.request('library.gettracks', options)
101
- root = nil
102
- doc.root.children.each do |child|
103
- next unless child.name == 'tracks'
104
- root = child
105
- end
106
- total_pages = root['totalPages'].to_i
107
- root.children.each do |child|
108
- next unless child.name == 'track'
109
- tracks << Scrobbler::Track.new_from_libxml(child)
110
- end
111
- for i in 2..total_pages do
112
- options[:page] = i
113
- tracks.concat get_response('library.gettracks', :none, 'tracks', 'track', options, true)
114
- end
115
- else
116
- tracks = get_response('library.gettracks', :get_albums, 'tracks', 'track', options, true)
59
+ request_library('library.gettracks', :tracks, Track, options)
60
+ end
61
+
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)
117
84
  end
118
- tracks
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
119
93
  end
120
94
 
121
95
  end
@@ -1,45 +1,87 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('basexml.rb', File.dirname(__FILE__))
4
+
1
5
  module Scrobbler
2
- # @todo everything
3
- class Playlist < Base
6
+ class Playlist < BaseXml
4
7
  # Load Helper modules
5
8
  include ImageObjectFuncs
6
- extend ImageClassFuncs
9
+ include Scrobbler::StreamableObjectFuncs
7
10
 
8
11
  attr_reader :url, :id, :title, :date, :creator
9
12
  attr_reader :description, :size, :duration, :streamable
10
- class << self
11
- def new_from_libxml(xml)
12
- data = {}
13
-
14
- xml.children.each do |child|
15
- data[:id] = child.content.to_i if child.name == 'id'
16
- data[:title] = child.content if child.name == 'title'
17
-
18
- maybe_image_node(data, child)
19
- data[:date] = Time.parse(child.content) if child.name == 'date'
13
+
14
+ # Alias for Playlist.new(:xml => xml)
15
+ #
16
+ # @deprecated
17
+ def self.new_from_libxml(xml)
18
+ Playlist.new(:xml => xml)
19
+ end
20
20
 
21
- data[:size] = child.content.to_i if child.name == 'size'
22
- data[:description] = child.content if child.name == 'description'
23
- data[:duration] = child.content.to_i if child.name == 'duration'
21
+ def self.create
22
+ # This function require authentication, but SimpleAuth is not yet 2.0
23
+ raise NotImplementedError
24
+ end
24
25
 
25
- if child.name == 'streamable'
26
- if ['1', 'true'].include?(child.content)
27
- data[:streamable] = true
28
- else
29
- data[:streamable] = false
30
- end
31
- end
32
- data[:creator] = child.content if child.name == 'creator'
33
- data[:url] = child.content if child.name == 'url'
34
- end
35
- Playlist.new(data[:url],data)
36
- end
26
+ def initialize(data={})
27
+ raise ArgumentError unless data.kind_of?(Hash)
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
+ raise ArgumentError, "Url is required" if @url.empty?
37
35
  end
38
-
39
- def initialize(url,data={})
40
- @url = url
41
- populate_data(data)
36
+
37
+ # Load the data for this object out of a XML-Node
38
+ #
39
+ # @param [LibXML::XML::Node] node The XML node containing the information
40
+ # @return [nil]
41
+ def load_from_xml(node)
42
+ # Get all information from the root's children nodes
43
+ node.children.each do |child|
44
+ case child.name.to_s
45
+ when 'id'
46
+ @id = child.content.to_i
47
+ when 'title'
48
+ @title = child.content
49
+ when 'image'
50
+ check_image_node(child)
51
+ when 'date'
52
+ @date = Time.parse(child.content)
53
+ when 'streamable'
54
+ check_streamable_node(child)
55
+ when 'size'
56
+ @size = child.content.to_i
57
+ when 'description'
58
+ @description = child.content
59
+ when 'duration'
60
+ @duration = child.content.to_i
61
+ when 'creator'
62
+ @creator = child.content
63
+ when 'url'
64
+ @url = child.content
65
+ when 'text'
66
+ # ignore, these are only blanks
67
+ when '#text'
68
+ # libxml-jruby version of blanks
69
+ else
70
+ raise NotImplementedError, "Field '#{child.name}' not known (#{child.content})"
71
+ end #^ case
72
+ end #^ do |child|
73
+ end
74
+
75
+ def add_track
76
+ # This function require authentication, but SimpleAuth is not yet 2.0
77
+ raise NotImplementedError
42
78
  end
79
+
80
+ def fetch
81
+ # This function require authentication, but SimpleAuth is not yet 2.0
82
+ raise NotImplementedError
83
+ end
84
+
43
85
  end
44
86
  end
45
87
 
@@ -6,6 +6,17 @@ module Scrobbler
6
6
  def initialize(station)
7
7
  @station = station
8
8
  end
9
+
10
+ def tune
11
+ # This function require authentication, but SimpleAuth is not yet 2.0
12
+ raise NotImplementedError
13
+ end
14
+
15
+ def playlist
16
+ # This function require authentication, but SimpleAuth is not yet 2.0
17
+ raise NotImplementedError
18
+ end
19
+
9
20
 
10
21
  end
11
22
  end
@@ -1,21 +1,47 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('basexml.rb', File.dirname(__FILE__))
4
+
1
5
  module Scrobbler
2
- class Shout < Base
6
+ class Shout < BaseXml
3
7
  attr_reader :author, :date, :body
4
-
5
- class << self
6
- def new_from_libxml(xml)
7
- data={}
8
- xml.children.each do |child|
9
- data[:body] = child.content if child.name == 'body'
10
- data[:author] = Scrobbler::User.new(child.content) if child.name == 'author'
11
- data[:date] = Time.parse(child.content) if child.name == 'date'
12
- end
13
- Shout.new(data)
14
- end
8
+
9
+ # Alias for Shout.new(:xml => xml)
10
+ #
11
+ # @deprecated
12
+ def self.new_from_libxml(xml)
13
+ Shout.new(:xml => xml)
15
14
  end
16
15
 
17
- def initialize(input={})
18
- populate_data(input)
16
+ def initialize(data={})
17
+ raise ArgumentError unless data.kind_of?(Hash)
18
+ super(data)
19
+ # Load data given as method-parameter
20
+ populate_data(data)
19
21
  end
22
+
23
+ # Load the data for this object out of a XML-Node
24
+ #
25
+ # @param [LibXML::XML::Node] node The XML node containing the information
26
+ # @return [nil]
27
+ def load_from_xml(node)
28
+ # Get all information from the root's children nodes
29
+ node.children.each do |child|
30
+ case child.name
31
+ when 'body'
32
+ @body = child.content
33
+ when 'author'
34
+ @author = Scrobbler::User.new(:name => child.content)
35
+ when 'date'
36
+ @date = Time.parse(child.content)
37
+ when 'text'
38
+ # ignore, these are only blanks
39
+ when '#text'
40
+ # libxml-jruby version of blanks
41
+ else
42
+ raise NotImplementedError, "Field '#{child.name}' not known (#{child.content})"
43
+ end #^ case
44
+ end #^ do |child|
45
+ end #^ load_from_xml
20
46
  end
21
47
  end
data/lib/scrobbler/tag.rb CHANGED
@@ -99,15 +99,32 @@ module Scrobbler
99
99
  get_response('tag.gettoptracks', :top_tracks, 'toptracks', 'track', {'tag'=>@name}, force)
100
100
  end
101
101
 
102
- def Tag.top_tags
103
- self.get('tag.gettoptags', :toptags, :tag)
102
+ def self.top_tags
103
+ Base.get('tag.gettoptags', :toptags, :tag)
104
104
  end
105
105
 
106
+ def self.search
107
+ # This function require authentication, but SimpleAuth is not yet 2.0
108
+ raise NotImplementedError
109
+ end
110
+
111
+
106
112
  # Search for tags similar to this one. Returns tags ranked by similarity,
107
113
  # based on listening data.
108
114
  def similar(force=false)
109
115
  params = {:tag => @name}
110
116
  get_response('tag.getsimilar', :similar, 'similartags', 'tag', params, force)
111
117
  end
118
+
119
+ def weekly_artist_chart
120
+ # This function require authentication, but SimpleAuth is not yet 2.0
121
+ raise NotImplementedError
122
+ end
123
+
124
+ def weekly_chart_list
125
+ # This function require authentication, but SimpleAuth is not yet 2.0
126
+ raise NotImplementedError
127
+ end
128
+
112
129
  end
113
130
  end
@@ -1,78 +1,43 @@
1
- # Below is an example of how to get the top fans for a track.
2
- #
3
- # track = Scrobbler::Track.new('Carrie Underwood', 'Before He Cheats')
4
- # puts 'Fans'
5
- # puts "=" * 4
6
- # track.fans.each { |u| puts u.username }
7
- #
8
- # Which would output something like:
9
- #
10
- # track = Scrobbler::Track.new('Carrie Underwood', 'Before He Cheats')
11
- # puts 'Fans'
12
- # puts "=" * 4
13
- # track.fans.each { |u| puts "(#{u.weight}) #{u.username}" }
14
- #
15
- # Fans
16
- # ====
17
- # (69163) PimpinRose
18
- # (7225) selene204
19
- # (7000) CelestiaLegends
20
- # (6817) muehllr
21
- # (5387) Mudley
22
- # (5368) ilovejohnny1984
23
- # (5232) MeganIAD
24
- # (5132) Veric
25
- # (5097) aeVnar
26
- # (3390) kristaaan
27
- # (3239) kelseaowns
28
- # (2780) syndication
29
- # (2735) mkumm
30
- # (2706) Kimmybeebee
31
- # (2648) skorpcroze
32
- # (2549) mistergreg
33
- # (2449) mlmjcace
34
- # (2302) tiNEey
35
- # (2169) ajsbabiegirl
1
+ # encoding: utf-8
2
+
36
3
  module Scrobbler
37
4
  class Track < Base
38
5
  # Load Helper modules
39
6
  include ImageObjectFuncs
40
7
  extend ImageClassFuncs
41
8
 
42
- attr_accessor :artist, :name, :mbid, :playcount, :rank, :url, :id, :count
43
- attr_accessor :streamable, :album, :date, :now_playing, :tagcount
44
- attr_accessor :duration, :listeners
9
+ attr_reader :artist, :name, :mbid, :playcount, :rank, :url, :id, :count
10
+ attr_reader :streamable, :album, :date, :now_playing, :tagcount
11
+ attr_reader :duration, :listeners
45
12
 
46
- class << self
47
- def new_from_libxml(xml)
48
- data = {}
49
- xml.children.each do |child|
50
- data[:name] = child.content if child.name == 'name'
51
- data[:mbid] = child.content if child.name == 'mbid'
52
- data[:url] = child.content if child.name == 'url'
53
- data[:date] = Time.parse(child.content) if child.name == 'date'
54
- data[:artist] = Artist.new_from_libxml(child) if child.name == 'artist'
55
- data[:album] = Album.new_from_libxml(child) if child.name == 'album'
56
- data[:playcount] = child.content.to_i if child.name == 'playcount'
57
- data[:tagcount] = child.content.to_i if child.name == 'tagcount'
58
- maybe_image_node(data, child)
59
- if child.name == 'streamable'
60
- if ['1', 'true'].include?(child.content)
61
- data[:streamable] = true
62
- else
63
- data[:streamable] = false
64
- end
13
+ def self.new_from_libxml(xml)
14
+ data = {}
15
+ xml.children.each do |child|
16
+ data[:name] = child.content if child.name == 'name'
17
+ data[:mbid] = child.content if child.name == 'mbid'
18
+ data[:url] = child.content if child.name == 'url'
19
+ data[:date] = Time.parse(child.content) if child.name == 'date'
20
+ data[:artist] = Artist.new(:xml => child) if child.name == 'artist'
21
+ data[:album] = Album.new(:xml => child) if child.name == 'album'
22
+ data[:playcount] = child.content.to_i if child.name == 'playcount'
23
+ data[:tagcount] = child.content.to_i if child.name == 'tagcount'
24
+ maybe_image_node(data, child)
25
+ if child.name == 'streamable'
26
+ if ['1', 'true'].include?(child.content)
27
+ data[:streamable] = true
28
+ else
29
+ data[:streamable] = false
65
30
  end
66
31
  end
67
-
68
-
69
- data[:rank] = xml['rank'].to_i if xml['rank']
70
- data[:now_playing] = true if xml['nowplaying'] && xml['nowplaying'] == 'true'
71
-
72
- data[:now_playing] = false if data[:now_playing].nil?
73
-
74
- Track.new(data[:artist], data[:name], data)
75
32
  end
33
+
34
+
35
+ data[:rank] = xml['rank'].to_i if xml['rank']
36
+ data[:now_playing] = true if xml['nowplaying'] && xml['nowplaying'] == 'true'
37
+
38
+ data[:now_playing] = false if data[:now_playing].nil?
39
+
40
+ Track.new(data[:artist], data[:name], data)
76
41
  end
77
42
 
78
43
  def initialize(artist, name, data={})
@@ -121,13 +86,43 @@ module Scrobbler
121
86
  end
122
87
 
123
88
  def top_fans(force=false)
124
- get_response('track.gettopfans', :fans, 'topfans', 'user', {:artist=>@artist.name, :track=>@name}, force)
89
+ call('track.gettopfans', :topfans, User, {:artist => @artist.name, :track => @name})
125
90
  end
126
91
 
127
92
  def top_tags(force=false)
128
- get_response('track.gettoptags', :top_tags, 'toptags', 'tag', {:artist=>@artist.name.to_s, :track=>@name}, force)
93
+ call('track.gettoptags', :toptags, Tag, {:artist => @artist.name, :track => @name})
94
+ end
95
+
96
+ def similar
97
+ # This function require authentication, but SimpleAuth is not yet 2.0
98
+ raise NotImplementedError
99
+ end
100
+
101
+ def tags
102
+ # This function require authentication, but SimpleAuth is not yet 2.0
103
+ raise NotImplementedError
104
+ end
105
+
106
+ def love
107
+ # This function require authentication, but SimpleAuth is not yet 2.0
108
+ raise NotImplementedError
129
109
  end
130
110
 
111
+ def remove_tag
112
+ # This function require authentication, but SimpleAuth is not yet 2.0
113
+ raise NotImplementedError
114
+ end
115
+
116
+ def search
117
+ # This function require authentication, but SimpleAuth is not yet 2.0
118
+ raise NotImplementedError
119
+ end
120
+
121
+ def share
122
+ # This function require authentication, but SimpleAuth is not yet 2.0
123
+ raise NotImplementedError
124
+ end
125
+
131
126
  def ==(otherTrack)
132
127
  if otherTrack.is_a?(Scrobbler::Track)
133
128
  return ((@name == otherTrack.name) && (@artist == otherTrack.artist))