diff --git a/lib/models/music_brainz.rb b/lib/models/music_brainz.rb index 74ac0b6..9f5fb4c 100644 --- a/lib/models/music_brainz.rb +++ b/lib/models/music_brainz.rb @@ -13,7 +13,7 @@ module MusicBrainz url = WEB_SERVICE_URL + resourse.to_s.gsub('_', '-') + '/' + (params[:id].to_s || '') params.delete(:id) unless params[:id].nil? url << '?' + params.map{ |k, v| - k.to_s + '=' + (v.is_a?(Array) ? v.map{ |_| _.to_s.gsub('_', '-') }.join(',') : v.to_s) + k.to_s.gsub('_', '-') + '=' + (v.is_a?(Array) ? v.map{ |_| _.to_s.gsub('_', '-') }.join(',') : v.to_s) }.join('&') unless params.empty? self.get_contents url end diff --git a/lib/models/music_brainz/artist.rb b/lib/models/music_brainz/artist.rb index fa1ef67..e13446a 100644 --- a/lib/models/music_brainz/artist.rb +++ b/lib/models/music_brainz/artist.rb @@ -49,8 +49,8 @@ module MusicBrainz :name => a.first_element_child.text, :weight => 0, :desc => self.safe_get_value(a, 'disambiguation'), - :type => self.safe_get_attr(a, 'type'), - :mbid => self.safe_get_attr(a, 'id') + :type => self.safe_get_attr(a, nil, 'type'), + :mbid => self.safe_get_attr(a, nil, 'id') } aliases = a.css('alias-list > alias').map{ |item| item.text } if aliases.include? name diff --git a/lib/models/music_brainz/base.rb b/lib/models/music_brainz/base.rb index 1bfeb4d..b7e10bf 100644 --- a/lib/models/music_brainz/base.rb +++ b/lib/models/music_brainz/base.rb @@ -1,7 +1,8 @@ module MusicBrainz class Base def self.safe_get_attr xml, path, name - xml.css(path).first.attr(name) unless xml.css(path).empty? or xml.css(path).first.attr(name).nil? + node = path.nil? ? xml : (xml.css(path).first unless xml.css(path).empty?) + node.attr(name) unless node.nil? or node.attr(name).nil? end def self.safe_get_value xml, path diff --git a/lib/models/music_brainz/release.rb b/lib/models/music_brainz/release.rb index 6b6a500..344cdbf 100644 --- a/lib/models/music_brainz/release.rb +++ b/lib/models/music_brainz/release.rb @@ -1,12 +1,12 @@ module MusicBrainz - class Release + class Release < MusicBrainz::Base attr_accessor :id, :title, :status, :date, :country @tracks def tracks if @tracks.nil? and not self.id.nil? @tracks = [] - Nokogiri::XML(MusicBrainz.load('http://musicbrainz.org/ws/2/release/' + self.id + '?inc=recordings&limit=100')).css('medium-list > medium > track-list > track').each do |r| + Nokogiri::XML(MusicBrainz.load(:release, :id => self.id, :inc => [:recordings], :limit => 100)).css('medium-list > medium > track-list > track').each do |r| @tracks << MusicBrainz::Track.parse_xml(r) end end @@ -14,15 +14,15 @@ module MusicBrainz end def self.find mbid - xml = Nokogiri::XML(MusicBrainz.load('http://musicbrainz.org/ws/2/release/' + mbid)).css('release').first + xml = Nokogiri::XML(MusicBrainz.load(:release, :id => mbid)).css('release').first self.parse_xml(xml) unless xml.nil? end def self.parse_xml xml @release = MusicBrainz::Release.new - @release.id = xml.attr('id') - @release.title = xml.css('title').text unless xml.css('title').empty? - @release.status = xml.css('status').text unless xml.css('status').empty? + @release.id = self.safe_get_attr(xml, nil, 'id') + @release.title = self.safe_get_value(xml, 'title') + @release.status = self.safe_get_value(xml, 'status') date = xml.css('date').empty? ? '2030-12-31' : xml.css('date').text if date.length == 0 date = '2030-12-31' @@ -33,7 +33,7 @@ module MusicBrainz end date = date.split('-') @release.date = Time.utc(date[0], date[1], date[2]) - @release.country = xml.css('country').text unless xml.css('country').empty? + @release.country = self.safe_get_value(xml, 'country') @release end end diff --git a/lib/models/music_brainz/release_group.rb b/lib/models/music_brainz/release_group.rb index 167d237..5e1cff4 100644 --- a/lib/models/music_brainz/release_group.rb +++ b/lib/models/music_brainz/release_group.rb @@ -1,12 +1,12 @@ module MusicBrainz - class ReleaseGroup + class ReleaseGroup < MusicBrainz::Base attr_accessor :id, :type, :title, :disambiguation, :first_release_date @releases def releases if @releases.nil? and not self.id.nil? @releases = [] - Nokogiri::XML(MusicBrainz.load('http://musicbrainz.org/ws/2/release/?release-group=' + self.id + '&limit=100')).css('release').each do |r| + Nokogiri::XML(MusicBrainz.load(:release, :release_group => self.id, :inc => [:media], :limit => 100)).css('release').each do |r| @releases << MusicBrainz::Release.parse_xml(r) end end @@ -14,16 +14,16 @@ module MusicBrainz end def self.find mbid - xml = Nokogiri::XML(MusicBrainz.load('http://musicbrainz.org/ws/2/release-group/' + mbid)).css('release-group').first + xml = Nokogiri::XML(MusicBrainz.load(:release_group, :id => mbid)).css('release-group').first self.parse_xml(xml) unless xml.nil? end def self.parse_xml xml @release_group = MusicBrainz::ReleaseGroup.new - @release_group.id = xml.attr('id') - @release_group.type = xml.attr('type') - @release_group.title = xml.css('title').text - @release_group.disambiguation = xml.css('disambiguation').empty? ? '' : xml.css('disambiguation').text + @release_group.id = self.safe_get_attr(xml, nil, 'id') + @release_group.type = self.safe_get_attr(xml, nil, 'type') + @release_group.title = self.safe_get_value(xml, 'title') + @release_group.disambiguation = self.safe_get_value(xml, 'disambiguation') date = xml.css('first-release-date').empty? ? '2030-12-31' : xml.css('first-release-date').text if date.length == 0 date = '2030-12-31' diff --git a/lib/models/music_brainz/track.rb b/lib/models/music_brainz/track.rb index eabcbd7..44957d6 100644 --- a/lib/models/music_brainz/track.rb +++ b/lib/models/music_brainz/track.rb @@ -1,19 +1,19 @@ module MusicBrainz - class Track + class Track < MusicBrainz::Base attr_accessor :position, :recording_id, :title, :length def self.find mbid - xml = Nokogiri::XML(MusicBrainz.load('http://musicbrainz.org/ws/2/recording/' + mbid + '?limit=100')) + xml = Nokogiri::XML(MusicBrainz.load(:recording, :id => mbid)) self.parse_xml(xml) unless xml.nil? end def self.parse_xml xml @track = MusicBrainz::Track.new - @track.position = xml.css('position').text.to_i unless xml.css('position').empty? - @track.recording_id = xml.css('recording').attr('id').value unless xml.css('recording').empty? - @track.title = xml.css('recording > title').text unless xml.css('recording > title').empty? - @track.length = xml.css('length').first.text.to_i unless xml.css('length').empty? - @track.length = xml.css('recording > length').first.text.to_i unless xml.css('recording > length').empty? + @track.position = self.safe_get_value(xml, 'position').to_i + @track.recording_id = self.safe_get_attr(xml, 'recording', 'id') + @track.title = self.safe_get_value(xml, 'recording > title') + @track.length = self.safe_get_value(xml, 'length').to_i + @track.length = self.safe_get_value(xml, 'recording > length').to_i @track end end