1
0
Fork 0
oldhaven/app/controllers/import_controller.rb

134 lines
4.4 KiB
Ruby

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