class ImportController < ApplicationController @@user_agent = 'BeatHaven.org' @@lastfm_api_key = '04fda005dbf61a50af5abc3e90f111f2' def self.importArtist name # Get artist info artist_mb_xml = open( 'http://musicbrainz.org/ws/2/artist/?query='+ URI.escape(name).gsub(/\&/, '%26').gsub(/\?/, '%3F') +'&limit=1', 'User-Agent' => @@user_agent ).read artist_mb_data = artist_mb_xml.scan(/<artist.*?type=\"(.+?)\"\sid=\"([a-f0-9-]+?)\">.*?<name>(.+?)<\/name>/m) artist_lastfm_xml = open( 'http://ws.audioscrobbler.com/2.0/'+ '?method=artist.getinfo&api_key='+ @@lastfm_api_key + '&artist='+ URI.escape(name).gsub(/\&/, '%26').gsub(/\?/, '%3F') ).read # Save artist artist = Artist.new artist.name = artist_mb_data[0][2] artist.desc = artist_lastfm_xml.scan(/<summary><\!\[CDATA\[?(.*)\]\]><\/summary>/m)[0][0] artist.pic_url = artist_lastfm_xml.scan(/<image\ssize=\"extralarge\">?(.*)<\/image>/)[0][0] artist.artist_type = artist_mb_data[0][0] artist.mbid = artist_mb_data[0][1] artist.save # Get albums from MB release_groups_mb_xml = open( 'http://musicbrainz.org/ws/2/release-group/?artist='+ artist_mb_data[0][1], 'User-Agent' => @@user_agent ).read release_groups_mb_data = release_groups_mb_xml.scan(/<release-group\stype=\"([a-zA-Z]+?)\"\sid=\"([a-f0-9-]+?)\"><title>(.+?)<\/title>/m) release_groups_mb_data.each do |mb_album| # Get album releases from MB releases_mb_xml = open( 'http://musicbrainz.org/ws/2/release/?release-group='+ mb_album[1], 'User-Agent' => @@user_agent ).read releases_mb_data = releases_mb_xml.scan(/<release\sid=\"([a-f0-9-]+?)\">.*?<status>([a-zA-Z]+?)<\/status>.*?<date>([0-9-]+?)<\/date>.*?<country>([A-Z]+?)<\/country>/m) releases_mb_data.each do |item| if item[2].length == 4 item[2] += '-01-01' end end unless releases_mb_data.empty? # Sorting releases by date releases_mb_data.sort! { |a, b| a[2].to_date <=> b[2].to_date } main_release = releases_mb_data.shift # Get tracks from the first release and then exclude release main_tracks_mb_xml = open( 'http://musicbrainz.org/ws/2/release/'+ main_release[0] +'/?inc=recordings', 'User-Agent' => @@user_agent ).read mb_tracks = main_tracks_mb_xml.scan(/<track>.*?<position>(\d+?)<\/position><recording\sid=\"([a-f0-9-]+?)\"><title>(.*?)<\/title><length>(.*?)<\/length>/m) mb_tracks.map! do |item| item << main_release[3] end unless mb_tracks.empty? # Saving album begin album_lastm_xml = open( 'http://ws.audioscrobbler.com/2.0/'+ '?method=album.getinfo&api_key='+ @@lastfm_api_key + '&artist='+ URI.escape(name).gsub(/\&/, '%26').gsub(/\?/, '%3F')+ '&album='+ URI.escape(mb_album[2]).gsub(/\&/, '%26').gsub(/\?/, '%3F') ).read album_image = album_lastm_xml.scan(/<image\ssize=\"extralarge\">?(.*)<\/image>/)[0][0] rescue album_image = '' end album = Album.new album.name = mb_album[2] album.year = main_release[2].to_date.year album.artist_id = artist.id album.mbid = mb_album[1] album.album_type = mb_album[0] album.pic_url = album_image album.save # Creating hashed array for matching mb_main_tracks_hashed = [] mb_tracks.each do |mb_track| mb_main_tracks_hashed << mb_track[2].downcase.scan(/[a-z0-9]*/).join mb_track << main_release[3] # Release country mb_track << 0 # Bonus flag end # Searching for tracks in other releases releases_mb_data.each do |mb_release| other_tracks_mb_xml = open( 'http://musicbrainz.org/ws/2/release/'+ mb_release[0] +'/?inc=recordings', 'User-Agent' => @@user_agent ).read mb_other_tracks = other_tracks_mb_xml.scan(/<track>.*?<position>(\d+?)<\/position><recording\sid=\"([a-f0-9-]+?)\"><title>(.*?)<\/title><length>(.*?)<\/length>/m) mb_other_tracks.each do |item| unless mb_main_tracks_hashed.include? item[2].downcase.scan(/[a-z0-9]*/).join item << mb_release[3] # Release country item << 1 # Bonus flag mb_tracks << item end end end # Saving tracks mb_tracks.each do |mb_track| track = Track.new track.name = mb_track[2] track.album_id = album.id track.position = mb_track[0] track.length = mb_track[3] track.country = mb_track[4] track.bonus = mb_track[5] track.live = mb_track[2].downcase.include? 'live' track.acoustic = mb_track[2].downcase.include? 'acoustic' track.save end end # unless mb_main_tracks.empty? end # unless mb_releases.empty? end # mb_albums.each do |mb_album| end # def self.importArtist name end