From 05d009f3ace601bec4b3d5addac6baaee3480bc1 Mon Sep 17 00:00:00 2001 From: magnolia-fan Date: Wed, 14 Sep 2011 10:10:56 +0400 Subject: [PATCH] Search method added, request time check fixed --- lib/models/music_brainz.rb | 2 +- lib/models/music_brainz/artist.rb | 32 ++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/models/music_brainz.rb b/lib/models/music_brainz.rb index 1a92756..ae65601 100644 --- a/lib/models/music_brainz.rb +++ b/lib/models/music_brainz.rb @@ -15,12 +15,12 @@ module MusicBrainz 5.times do begin response = open(url, "User-Agent" => "gem musicbrainz (https://github.com/magnolia-fan/musicbrainz) @ " + Socket.gethostname) + self.last_query_time = Time.now.to_f rescue => e p "MusicBrainz: 503" end break unless response.nil? end - self.last_query_time = Time.now.to_f response end diff --git a/lib/models/music_brainz/artist.rb b/lib/models/music_brainz/artist.rb index a86c44d..2cfccb8 100644 --- a/lib/models/music_brainz/artist.rb +++ b/lib/models/music_brainz/artist.rb @@ -6,7 +6,9 @@ module MusicBrainz def release_groups if @release_groups.nil? and not self.id.nil? @release_groups = [] - Nokogiri::XML(MusicBrainz.load('http://musicbrainz.org/ws/2/release-group/?artist=' + self.id)).css('release-group').each do |rg| + Nokogiri::XML(MusicBrainz.load( + 'http://musicbrainz.org/ws/2/release-group/?artist=' + self.id + )).css('release-group').each do |rg| @release_groups << MusicBrainz::ReleaseGroup.parse_xml(rg) end end @@ -27,5 +29,33 @@ module MusicBrainz @artist.date_end = xml.css('artist > life-span > end').text unless xml.css('artist > life-span > end').empty? @artist end + + private + + def self.search name + artists = [] + xml = Nokogiri::XML(MusicBrainz.load( + 'http://musicbrainz.org/ws/2/artist/?query='+ URI.escape(query).gsub(/\&/, '%26').gsub(/\?/, '%3F') +'~&limit=50' + )) + xml.css('artist-list > artist').each do |a| + artist = { + :name => a.css('name').text, + :weight => 0, + :desc => a.css('disambiguation').text unless a.css('disambiguation').empty?, + :type => a.css('type').text.capitalize, + :mbid => a.attr('id') + } + aliases = a.css('alias-list > alias').map{ |item| item.text } + if aliases.include? name + artist[:weight] += 20 + elsif aliases.map{ |item| item.downcase }.include? name.downcase + artist[:weight] += 10 + elsif aliases.map{ |item| item.downcase.gsub(/\s/, '') }.include? name.downcase.gsub(/\s/, '') + artist[:weight] += 5 + end + artists << artist + end + artists.sort{ |a, b| b[:weight] <=> a[:weight] }.take(10) + end end end