scrobbler-ng 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/VERSION.yml +2 -1
- data/lib/scrobbler/album.rb +91 -113
- data/lib/scrobbler/artist.rb +174 -134
- data/lib/scrobbler/auth.rb +12 -0
- data/lib/scrobbler/base.rb +114 -64
- data/lib/scrobbler/basexml.rb +17 -0
- data/lib/scrobbler/event.rb +109 -74
- data/lib/scrobbler/geo.rb +3 -11
- data/lib/scrobbler/helper/image.rb +37 -12
- data/lib/scrobbler/helper/streamable.rb +11 -3
- data/lib/scrobbler/library.rb +49 -75
- data/lib/scrobbler/playlist.rb +74 -32
- data/lib/scrobbler/radio.rb +11 -0
- data/lib/scrobbler/shout.rb +40 -14
- data/lib/scrobbler/tag.rb +19 -2
- data/lib/scrobbler/track.rb +62 -67
- data/lib/scrobbler/user.rb +93 -111
- data/lib/scrobbler.rb +1 -2
- data/tasks/jeweler.rake +10 -6
- data/tasks/metric_fu.rake +27 -0
- data/tasks/reek.rake +13 -0
- data/tasks/roodi.rake +13 -0
- data/tasks/tests.rake +8 -0
- data/test/mocks/library.rb +35 -0
- data/test/mocks/rest.rb +91 -189
- data/test/test_helper.rb +2 -16
- data/test/unit/album_spec.rb +1 -1
- data/test/unit/artist_spec.rb +4 -2
- data/test/unit/event_spec.rb +2 -2
- data/test/unit/library_spec.rb +70 -70
- data/test/unit/playlist_spec.rb +1 -1
- data/test/unit/scrobble_spec.rb +1 -1
- data/test/unit/tag_spec.rb +3 -1
- data/test/unit/track_spec.rb +1 -1
- data/test/unit/user_spec.rb +1 -1
- metadata +38 -6
data/lib/scrobbler/base.rb
CHANGED
@@ -5,64 +5,109 @@ $KCODE = 'u'
|
|
5
5
|
include LibXML
|
6
6
|
|
7
7
|
module Scrobbler
|
8
|
-
|
8
|
+
|
9
9
|
API_URL = 'http://ws.audioscrobbler.com/'
|
10
10
|
|
11
|
-
class Base
|
11
|
+
class Base
|
12
|
+
# Set the default API key.
|
13
|
+
#
|
14
|
+
# This key will be used by all Scrobbler classes and objects.
|
15
|
+
#
|
16
|
+
# @param [String] api_key The default API key.
|
17
|
+
# @return [nil]
|
12
18
|
def Base.api_key=(api_key)
|
13
|
-
|
19
|
+
@@api_key = api_key
|
14
20
|
end
|
15
|
-
|
21
|
+
|
22
|
+
# Set the default API secret.
|
23
|
+
#
|
24
|
+
# This secret will be used by all Scrobbler classes and objects.
|
25
|
+
#
|
26
|
+
# @param [String] secret The default API secret.
|
27
|
+
# @return [nil]
|
16
28
|
def Base.secret=(secret)
|
17
|
-
|
29
|
+
@@secret = secret
|
18
30
|
end
|
19
|
-
|
31
|
+
|
32
|
+
# Get a HTTP/REST connection to the webservice.
|
33
|
+
#
|
34
|
+
# @return [REST::Connection]
|
20
35
|
def Base.connection
|
21
|
-
|
36
|
+
@connection ||= REST::Connection.new(API_URL)
|
22
37
|
end
|
23
38
|
|
39
|
+
# Clean up a URL parameter.
|
40
|
+
#
|
41
|
+
# @param [String, Symbol] param The parameter which needs cleanup.
|
42
|
+
# @return [String]
|
24
43
|
def Base.sanitize(param)
|
25
44
|
URI.escape(param.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
26
45
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
names = camel_cased_word.split('::')
|
46
|
+
|
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('::')
|
38
56
|
names.shift if names.empty? || names.first.empty?
|
39
|
-
|
57
|
+
|
40
58
|
constant = Object
|
41
59
|
names.each do |name|
|
42
60
|
constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
|
43
61
|
end
|
44
62
|
constant
|
45
63
|
end
|
46
|
-
|
64
|
+
|
65
|
+
# Initiate a API and parse it.
|
66
|
+
#
|
67
|
+
# @param [String,Symbol] api_method The API method to call.
|
68
|
+
# @param [String,Symbol] parent The parent node to inspect.
|
69
|
+
# @param [Class,String,Symbol] element The name of the node to turn into objects.
|
70
|
+
# @param [Hash<String,Symbol>] parameters The parameters for the method call.
|
71
|
+
# @return [Array<Scrobbler::Base>]
|
47
72
|
def Base.get(api_method, parent, element, parameters = {})
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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
|
80
|
+
doc = request(api_method, parameters)
|
81
|
+
elements = []
|
82
|
+
doc.root.children.each do |child|
|
83
|
+
next unless child.name == parent.to_s
|
84
|
+
child.children.each do |child2|
|
85
|
+
next unless child2.name == element
|
86
|
+
elements << scrobbler_class.new_from_libxml(child2)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
elements
|
59
90
|
end
|
60
91
|
|
61
|
-
|
92
|
+
# Execute a request to the Audioscrobbler webservice
|
93
|
+
#
|
94
|
+
# @param [String,Symbol] api_method The method which shall be called.
|
95
|
+
# @param [Hash] parameter The parameters passed as URL params.
|
96
|
+
# @return [LibXML::XML::Document]
|
97
|
+
def Base.post_request(api_method, parameters = {})
|
62
98
|
Base.request(api_method, parameters, 'post')
|
63
99
|
end
|
64
|
-
|
100
|
+
|
101
|
+
# Execute a request to the Audioscrobbler webservice
|
102
|
+
#
|
103
|
+
# @param [String,Symbol] api_method The method which shall be called.
|
104
|
+
# @param [Hash] parameter The parameters passed as URL params.
|
105
|
+
# @param [String] request_method The HTTP verb to be used.
|
106
|
+
# @return [LibXML::XML::Document]
|
65
107
|
def Base.request(api_method, parameters = {}, request_method = 'get')
|
108
|
+
raise ArgumentError unless [String, Symbol].member?(api_method.class)
|
109
|
+
raise ArgumentError unless parameters.kind_of?(Hash)
|
110
|
+
|
66
111
|
parameters = {:signed => false}.merge(parameters)
|
67
112
|
parameters['api_key'] = @@api_key
|
68
113
|
parameters['method'] = api_method.to_s
|
@@ -70,7 +115,7 @@ class Base
|
|
70
115
|
# Check if we want a signed call and pop :signed
|
71
116
|
if parameters.delete :signed
|
72
117
|
#1: Sort alphabetically
|
73
|
-
params = parameters.sort{|a,b| a
|
118
|
+
params = parameters.sort{|a,b| a.at(0).to_s<=>b.at(0).to_s}
|
74
119
|
#2: concat them into one string
|
75
120
|
str = params.join('')
|
76
121
|
#3: Append secret
|
@@ -79,7 +124,7 @@ class Base
|
|
79
124
|
md5 = Digest::MD5.hexdigest(str)
|
80
125
|
params << [:api_sig, md5]
|
81
126
|
params.each do |a|
|
82
|
-
paramlist << "#{sanitize(a
|
127
|
+
paramlist << "#{sanitize(a.at(0))}=#{sanitize(a.at(1))}"
|
83
128
|
end
|
84
129
|
else
|
85
130
|
parameters.each do |key, value|
|
@@ -90,35 +135,40 @@ class Base
|
|
90
135
|
XML::Document.string(self.connection.send(request_method,url))
|
91
136
|
end
|
92
137
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
def Base.mixins(*args)
|
97
|
-
args.each do |arg|
|
98
|
-
if arg == :image
|
99
|
-
extend Scrobbler::ImageClassFuncs
|
100
|
-
include Scrobbler::ImageObjectFuncs
|
101
|
-
elsif arg == :streamable
|
102
|
-
attr_reader :streamable
|
103
|
-
extend StreamableClassFuncs
|
104
|
-
include StreamableObjectFuncs
|
105
|
-
else
|
106
|
-
raise ArgumentError, "#{arg} is not a known mixin"
|
107
|
-
end
|
108
|
-
end
|
138
|
+
# @deprecated
|
139
|
+
def get_response(api_method, instance_name, parent, element, params, force=true)
|
140
|
+
Base.get(api_method, parent, element, params)
|
109
141
|
end
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
if instance_variable_get("@#{instance_name}").nil? || force
|
119
|
-
instance_variable_set("@#{instance_name}", Base.get(api_method, parent, element, params))
|
120
|
-
end
|
121
|
-
instance_variable_get("@#{instance_name}")
|
142
|
+
|
143
|
+
# Load information into instance variables.
|
144
|
+
#
|
145
|
+
# @param [Hash<String,Symbol>] data Each entry will be stored as a variable.
|
146
|
+
# @return [nil]
|
147
|
+
def populate_data(data = {})
|
148
|
+
data.each do |key, value|
|
149
|
+
instance_variable_set("@#{key.to_s}", value)
|
122
150
|
end
|
123
|
-
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# Execute a request to the Audioscrobbler webservice
|
154
|
+
#
|
155
|
+
# @param [String,Symbol] api_method The method which shall be called.
|
156
|
+
# @param [Hash] parameter The parameters passed as URL params.
|
157
|
+
# @return [LibXML::XML::Document]
|
158
|
+
def request(api_method, parameters = {}, request_method = 'get')
|
159
|
+
Base.request(api_method, parameters, request_method)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Call a API method
|
163
|
+
#
|
164
|
+
# @param [String,Symbol] api_method The method which shall be called.
|
165
|
+
# @param [Hash] params The parameters passed as URL params.
|
166
|
+
# @param [String,Symbol] parent the parent XML node to look for.
|
167
|
+
# @param [Class,String,Symbol] element The xml node name which shall
|
168
|
+
# be converted into an object.
|
169
|
+
# @return [Array]
|
170
|
+
def call(api_method, parent, element, params)
|
171
|
+
Base.get(api_method, parent, element, params)
|
172
|
+
end
|
173
|
+
end # class Base
|
124
174
|
end # module Scrobbler
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path('base.rb', File.dirname(__FILE__))
|
4
|
+
|
5
|
+
module Scrobbler
|
6
|
+
class BaseXml < Base
|
7
|
+
# Load data out of a XML node
|
8
|
+
def initialize(data = {})
|
9
|
+
raise ArgumentError unless data.kind_of?(Hash)
|
10
|
+
super()
|
11
|
+
unless data[:xml].nil?
|
12
|
+
load_from_xml(data[:xml])
|
13
|
+
data.delete(:xml)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/scrobbler/event.rb
CHANGED
@@ -1,81 +1,125 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path('basexml.rb', File.dirname(__FILE__))
|
4
|
+
|
1
5
|
module Scrobbler
|
2
|
-
class Event <
|
6
|
+
class Event < BaseXml
|
3
7
|
# Load Helper modules
|
4
8
|
include ImageObjectFuncs
|
5
|
-
extend ImageClassFuncs
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
+
attr_reader :id, :title, :start_date, :start_time, :description
|
11
|
+
attr_reader :reviews, :tag, :url, :artists, :headliner
|
12
|
+
attr_reader :attendance, :venue, :website, :end_date
|
10
13
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
venue = nil
|
14
|
+
# Alias for Event.new(:xml => xml)
|
15
|
+
#
|
16
|
+
# @deprecated
|
17
|
+
def self.new_from_libxml(xml)
|
18
|
+
Event.new(:xml => xml)
|
19
|
+
end
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
# Create a new Scrobbler::Event instance
|
22
|
+
#
|
23
|
+
# @param [Hash] data The options to initialize the class
|
24
|
+
def initialize(data = {})
|
25
|
+
raise ArgumentError unless data.kind_of?(Hash)
|
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)
|
22
31
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
32
|
+
raise ArgumentError, "ID is required" if @id.nil?
|
33
|
+
end
|
34
|
+
|
35
|
+
# Load the data for this object out of a XML-Node
|
36
|
+
#
|
37
|
+
# @param [LibXML::XML::Node] node The XML node containing the information
|
38
|
+
# @return [nil]
|
39
|
+
def load_from_xml(node)
|
40
|
+
# Get all information from the root's children nodes
|
41
|
+
node.children.each do |child|
|
42
|
+
case child.name.to_s
|
43
|
+
when 'id'
|
44
|
+
@id = child.content.to_i
|
45
|
+
when 'title'
|
46
|
+
@title = child.content.to_s
|
47
|
+
when 'artists'
|
48
|
+
@artists = [] if @artists.nil?
|
49
|
+
child.children.each do |artist|
|
50
|
+
@artists << Artist.new(:name => artist.content) if artist.name == 'artist'
|
51
|
+
@headliner = Artist.new(:name => artist.content) if artist.name == 'headliner'
|
27
52
|
end
|
28
|
-
artists << headliner unless headliner.nil? || headliner_alrady_listed_in_artist_list?
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
53
|
+
@artists << @headliner unless @headliner.nil? || headliner_alrady_listed_in_artist_list?
|
54
|
+
when 'image'
|
55
|
+
check_image_node(child)
|
56
|
+
when 'url'
|
57
|
+
@url = child.content
|
58
|
+
when 'description'
|
59
|
+
@description = child.content
|
60
|
+
when 'attendance'
|
61
|
+
@attendance = child.content.to_i
|
62
|
+
when 'reviews'
|
63
|
+
@reviews = child.content.to_i
|
64
|
+
when 'tag'
|
65
|
+
@tag = child.content
|
66
|
+
when 'startDate'
|
67
|
+
@start_date = Time.parse(child.content)
|
68
|
+
when 'startTime'
|
69
|
+
@start_time = child.content
|
70
|
+
when 'endDate'
|
71
|
+
@end_date = Time.parse(child.content)
|
72
|
+
when 'tickets'
|
73
|
+
# @todo Handle tickets
|
74
|
+
when 'venue'
|
75
|
+
@venue = Venue.new_from_xml(child)
|
76
|
+
when 'website'
|
77
|
+
@website = child.content.to_s
|
78
|
+
when 'text'
|
79
|
+
# ignore, these are only blanks
|
80
|
+
when '#text'
|
81
|
+
# libxml-jruby version of blanks
|
82
|
+
else
|
83
|
+
raise NotImplementedError, "Field '#{child.name}' not known (#{child.content})"
|
84
|
+
end #^ case
|
85
|
+
end #^ do |child|
|
86
|
+
@artists.uniq!
|
87
|
+
end #^ load_from_xml
|
88
|
+
|
89
|
+
def headliner_alrady_listed_in_artist_list?
|
90
|
+
@artists.each do |artist|
|
91
|
+
return true if artist.name == @headliner.name
|
63
92
|
end
|
93
|
+
false
|
64
94
|
end
|
65
95
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
96
|
+
# Indicates if the info was already loaded
|
97
|
+
@info_loaded = false
|
98
|
+
|
99
|
+
# Load additional information about this album
|
100
|
+
#
|
101
|
+
# Calls "album.getinfo" REST method
|
102
|
+
#
|
103
|
+
# @todo Parse wiki content
|
104
|
+
# @todo Add language code for wiki translation
|
105
|
+
def load_info
|
106
|
+
return nil if @info_loaded
|
107
|
+
xml = Base.request('event.getinfo', {:event => @id})
|
108
|
+
unless xml.root['status'] == 'failed'
|
109
|
+
xml.root.children.each do |childL1|
|
110
|
+
next unless childL1.name == 'event'
|
111
|
+
load_from_xml(childL1)
|
112
|
+
end # xml.children.each do |childL1|
|
113
|
+
@info_loaded = true
|
114
|
+
end
|
71
115
|
end
|
72
116
|
|
73
|
-
def shouts
|
74
|
-
|
117
|
+
def shouts
|
118
|
+
call('event.getshouts', :shouts, Shout, {:event => @id})
|
75
119
|
end
|
76
120
|
|
77
|
-
def attendees
|
78
|
-
|
121
|
+
def attendees
|
122
|
+
call('event.getattendees', :attendees, User, {:event => @id})
|
79
123
|
end
|
80
124
|
|
81
125
|
def shout
|
@@ -84,22 +128,13 @@ module Scrobbler
|
|
84
128
|
end
|
85
129
|
|
86
130
|
def attend(session, attendance_status)
|
87
|
-
|
131
|
+
Base.post_request('event.attend',{:event => @id, :signed => true, :status => attendance_status, :sk => session.key})
|
88
132
|
end
|
89
133
|
|
90
134
|
def share
|
91
|
-
# This function
|
135
|
+
# This function requires authentication, but SimpleAuth is not yet 2.0
|
92
136
|
raise NotImplementedError
|
93
137
|
end
|
94
138
|
|
95
|
-
# Load additional informatalbumion about this event
|
96
|
-
#
|
97
|
-
# Calls "event.getinfo" REST method
|
98
|
-
def load_info
|
99
|
-
doc = Base.request('event.getinfo', {'event' => @id})
|
100
|
-
doc.root.children.each do |child|
|
101
|
-
Event.update_or_create_from_xml(child, self) if child.name == 'event'
|
102
|
-
end
|
103
|
-
end
|
104
139
|
end
|
105
140
|
end
|
data/lib/scrobbler/geo.rb
CHANGED
@@ -4,24 +4,16 @@ module Scrobbler
|
|
4
4
|
# Gets a list of events based on the location that
|
5
5
|
# the Geo object is set to
|
6
6
|
def events(options={})
|
7
|
-
|
8
|
-
get_response('geo.getevents', :events, 'events', 'event', options, options[:force])
|
7
|
+
call('geo.getevents', :events, Event, options)
|
9
8
|
end
|
10
9
|
|
11
10
|
def top_artists(options={})
|
12
|
-
|
13
|
-
get_response('geo.gettopartists', :artists, 'topartists', 'artist', options, options[:force])
|
11
|
+
call('geo.gettopartists', :topartists, Artist, options)
|
14
12
|
end
|
15
13
|
|
16
14
|
def top_tracks(options={})
|
17
|
-
|
18
|
-
get_response('geo.gettoptracks', :tracks, 'toptracks', 'track', options, options[:force])
|
15
|
+
call('geo.gettoptracks', :toptracks, Track, options)
|
19
16
|
end
|
20
17
|
|
21
|
-
private
|
22
|
-
|
23
|
-
def set_default_options(options={})
|
24
|
-
{:force => false, :page => 1}.merge options
|
25
|
-
end
|
26
18
|
end
|
27
19
|
end
|
@@ -7,14 +7,28 @@ module Scrobbler
|
|
7
7
|
module ImageClassFuncs
|
8
8
|
# Check if the given libxml node is an image referencing node and in case
|
9
9
|
# of, read it into that given hash of data
|
10
|
+
#
|
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
|
10
13
|
def maybe_image_node(data, node)
|
14
|
+
raise ArgumentError unless data.kind_of?(Hash)
|
15
|
+
raise ArgumentError unless node.kind_of?(LibXML::XML::Node)
|
11
16
|
if node.name == 'image'
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
case node['size'].to_s # convert to string to fix libxml-ruby bug
|
18
|
+
when 'small'
|
19
|
+
data[:image_small] = node.content
|
20
|
+
when 'medium'
|
21
|
+
data[:image_medium] = node.content
|
22
|
+
when 'large'
|
23
|
+
data[:image_large] = node.content
|
24
|
+
when 'extralarge'
|
25
|
+
data[:image_extralarge] = node.content
|
26
|
+
else
|
27
|
+
raise NotImplementedError, "Image size '#{node['size'].to_s}' not supported."
|
28
|
+
end #^ case
|
29
|
+
end #^ if
|
30
|
+
end #^ maybe_ ...
|
31
|
+
|
18
32
|
end
|
19
33
|
|
20
34
|
# Defines some functions that are used nearly all Scrobbler classes which
|
@@ -27,10 +41,20 @@ module Scrobbler
|
|
27
41
|
# of, read it into the object
|
28
42
|
def check_image_node(node)
|
29
43
|
if node.name == 'image'
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
44
|
+
case node['size'].to_s # convert to string to fix libxml-ruby bug
|
45
|
+
when 'small'
|
46
|
+
@image_small = node.content
|
47
|
+
when 'medium'
|
48
|
+
@image_medium = node.content
|
49
|
+
when 'large'
|
50
|
+
@image_large = node.content
|
51
|
+
when 'extralarge'
|
52
|
+
@image_extralarge = node.content
|
53
|
+
when 'mega'
|
54
|
+
@image_mega = node.content
|
55
|
+
else
|
56
|
+
raise NotImplementedError, "Image size '#{node['size'].to_s}' not supported."
|
57
|
+
end #^ case
|
34
58
|
end
|
35
59
|
end
|
36
60
|
|
@@ -40,7 +64,8 @@ module Scrobbler
|
|
40
64
|
# 'load_info'-function is defined, it will be called.
|
41
65
|
def image(which=:small)
|
42
66
|
which = which.to_s
|
43
|
-
raise ArgumentError unless ['small', 'medium', 'large', 'extralarge'
|
67
|
+
raise ArgumentError unless ['small', 'medium', 'large', 'extralarge',
|
68
|
+
'mega'].include?(which)
|
44
69
|
img_url = instance_variable_get("@image_#{which}")
|
45
70
|
if img_url.nil? && responds_to?(:load_info)
|
46
71
|
load_info
|
@@ -49,4 +74,4 @@ module Scrobbler
|
|
49
74
|
img_url
|
50
75
|
end
|
51
76
|
end
|
52
|
-
end
|
77
|
+
end
|
@@ -7,7 +7,7 @@ module Scrobbler
|
|
7
7
|
module StreamableClassFuncs
|
8
8
|
# Check if the given libxml node is defining if the given content is
|
9
9
|
# streamable. If so, set the flag in the given hash
|
10
|
-
def
|
10
|
+
def maybe_streamable_node(data, node)
|
11
11
|
if node.name == 'streamable'
|
12
12
|
data[:streamable] = ['1', 'true'].include?(node.content)
|
13
13
|
end
|
@@ -15,7 +15,7 @@ module Scrobbler
|
|
15
15
|
|
16
16
|
# Check if the given libxml node has a streamable attribute defining if the
|
17
17
|
# given content is streamable. If so, set the flag in the given hash
|
18
|
-
def
|
18
|
+
def maybe_streamable_attribute(data, node)
|
19
19
|
if node['streamable']
|
20
20
|
data[:streamable] = ['1', 'true'].include?(node['streamable'])
|
21
21
|
end
|
@@ -36,5 +36,13 @@ module Scrobbler
|
|
36
36
|
@streamable = ['1', 'true'].include?(node.content)
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
40
|
+
# Check if the given libxml node has a streamable attribute defining if the
|
41
|
+
# given content is streamable. If so, set the flag in the given hash
|
42
|
+
def maybe_streamable_attribute(node)
|
43
|
+
if node['streamable']
|
44
|
+
@streamable = ['1', 'true'].include?(node['streamable'])
|
45
|
+
end
|
46
|
+
end
|
39
47
|
end
|
40
|
-
end
|
48
|
+
end
|