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 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 dry_run ? ap(artist) : artist.save 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 dry_run ? ap(album) : album.save # Tracks from the first release tracks_hashed = [] brainz_release_group.releases.each_with_index do |brainz_release, i| # Processing tracks brainz_release.tracks.each do |brainz_track| 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 dry_run ? ap(track) : 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