MB + Last.fm + Discogs = Import!

This commit is contained in:
magnolia-fan
2011-09-26 09:10:23 +04:00
parent 0e04dba130
commit 7582bd18a5
8 changed files with 246 additions and 154 deletions
+2 -3
View File
@@ -88,8 +88,7 @@ class ArtistController < ApplicationController
end
@artist[:albums] = []
artist.albums.with_format(:album).each do |album|
ap album
artist.albums.each do |album|
if true # media_types.include? album.album_type.downcase.to_sym and album.status == 1
tmp_album = {id: album.id, name: album.name, year: album.year, pic: album.pic_url}
album_tracks = []
@@ -103,7 +102,7 @@ class ArtistController < ApplicationController
(track.bonus == 0 ? album_tracks : bonus_tracks) << tmp_track
end
tmp_album[:tracks] = {album: album_tracks, bonus: bonus_tracks}
@artist[:albums] << tmp_album
@artist[:albums] << tmp_album if (album_tracks+bonus_tracks).length > 0
end
end
+101 -63
View File
@@ -1,5 +1,7 @@
require 'musicbrainz'
require 'discogs'
require 'nokogiri'
require 'zlib'
class ImportController < ApplicationController
def self.importArtist name, dry_run = false
@@ -46,70 +48,106 @@ class ImportController < ApplicationController
: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
unless brainz_artist.urls[:discogs].nil?
Discogs.get_master_albums(brainz_artist.urls[:discogs]).each do |info|
begin
puts " * "+info[:title]+" ("+info[:year]+") -- http://api.discogs.com/"+info[:uri]+")"
stream = open("http://api.discogs.com/"+info[:uri]+"?f=xml",
'User-Agent' => 'Haven Import Bot',
'Accept-Encoding' => 'gzip, deflate'
)
if (stream.content_encoding.empty?)
body = stream.read
else
body = Zlib::GzipReader.new(stream).read
end
# Creating album
album = Album.new(
:name => info[:title],
:artist_id => artist.id,
:year => info[:year],
:status => 1,
:master => true
)
begin
album_lastfm = LastFM::Album.get_info( :artist => lastfm_artist['artist']['name'], :album => info[:title] )
album_image = album_lastfm['album']['image'][3]['#text']
rescue
album_image = ''
end
album.pic_url = album_image
album.has_pic = (album_image != '' and not album_image.nil?)
album.save
Discogs.save_album(artist, album, Nokogiri::HTML(body))
end
sleep 1
end
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 => '' )
# 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
+1 -1
View File
@@ -1,6 +1,6 @@
class Album < ActiveRecord::Base
belongs_to :artist
has_many :tracks, :order => 'bonus ASC, position ASC', :dependent => :destroy
has_many :tracks, :conditions => ['length > 0'], :order => 'bonus ASC, position ASC', :dependent => :destroy
has_many :album_formats
has_many :release_formats, :through => :album_formats