require 'musicbrainz' require 'nokogiri' class ImportController < ApplicationController def self.importArtist name, dry_run = false artist = Artist.find_or_create_by_name(name) return 3 if artist.status == 1 begin lastfm_artist = LastFM::Artist.get_info( :artist => name ) unless artist.mbid.nil? or artist.mbid.empty? brainz_artist = MusicBrainz::Artist.find(artist.mbid) else brainz_artist = MusicBrainz::Artist.find_by_name(name) end rescue => e lastfm_artist = { 'artist' => { 'bio' => { 'summary' => '' }, 'image' => [ nil, nil, nil, { '#text' => '' } ], 'stats' => { 'listeners' => 0 } } } ap e.message ap e.backtrace end if brainz_artist.nil? artist.mbid = nil artist.status = 2 artist.save return 2 end begin # Save artist artist.desc = lastfm_artist['artist']['bio']['summary'] artist.pic_url = lastfm_artist['artist']['image'][3]['#text'] artist.listeners = lastfm_artist['artist']['stats']['listeners'] artist.artist_type = brainz_artist.type artist.mbid = brainz_artist.id artist.save brainz_artist.urls.each do |service, url| ArtistLink.new( :artist_id => artist.id, :service => service.to_s, :url => url ).save end brainz_artist.release_groups.each do |brainz_release_group| # Saving album begin album_lastfm = LastFM::Album.get_info( :artist => lastfm_artist['artist']['name'], :album => brainz_release_group.title ) album_image = album_lastfm['album']['image'][3]['#text'] rescue album_image = '' end album = Album.new album.name = brainz_release_group.title album.year = brainz_release_group.first_release_date.year album.artist_id = artist.id album.mbid = brainz_release_group.id album.album_type = brainz_release_group.type album.pic_url = album_image album.has_pic = (album_image != '' and not album_image.nil?) album.status = 0 album.save # Tracks from the first release tracks_hashed = [] brainz_release_group.releases.each_with_index do |brainz_release, i| local_brainz_release = LocalBrainz::Release.new( :mbid => brainz_release.id, :title => brainz_release.title, :status => brainz_release.status, :date => brainz_release.date, :country => brainz_release.country, :format => brainz_release.format, :album_id => album.id ) local_brainz_release.save # Processing tracks brainz_release.tracks.each do |brainz_track| local_brainz_track = LocalBrainz::Track.new( :position => brainz_track.position, :recording_id => brainz_track.recording_id, :title => brainz_track.title, :length => brainz_track.length, :release_id => local_brainz_release.id ) local_brainz_track.save track_title = brainz_track.title.gsub(/\s\/\s\[.*?\]/, '') if tracks_hashed.include? track_title.downcase.scan(/[a-z0-9]*/).join next end tracks_hashed << track_title.downcase.scan(/[a-z0-9]*/).join track = Track.new track.name = track_title track.album_id = album.id track.position = brainz_track.position track.length = brainz_track.length track.country = brainz_release.country track.bonus = (i == 0 ? 0 : 1) track.live = track_title.downcase.include? 'live' track.acoustic = track_title.downcase.include? 'acoustic' track.mbid = brainz_track.recording_id track.save end end album.status = 1 album.save unless dry_run end artist.status = 1 rescue => e ap e.message ap e.backtrace artist.status = 2 end artist.save unless dry_run artist.status end def self.parseLastfmXML path Nokogiri::XML(open(path)).css('lfm > artists > artist').map do |node| artist = {} artist[:name] = node.css('name').text artist[:mbid] = nil artist[:mbid] = node.css('mbid').text unless node.css('mbid').empty? artist end end end