113 lines
3.2 KiB
Ruby
113 lines
3.2 KiB
Ruby
class Artist < ActiveRecord::Base
|
|
has_many :albums
|
|
has_many :performers
|
|
has_many :tracks, through: :performers
|
|
has_many :genres, through: :artist_genres
|
|
|
|
attr_accessible :bio, :is_group, :name, :pic, :rovi_id
|
|
|
|
def loaded?
|
|
pic? && bio?
|
|
end
|
|
|
|
def url
|
|
"/artist/#{name.gsub(/\s/, "+")}"
|
|
end
|
|
|
|
def dump_json
|
|
Jbuilder.encode do |j|
|
|
j.artist_title name
|
|
j.artist_pic pic
|
|
j.artist_bio bio
|
|
j.artist_loaded loaded?
|
|
j.artist_url url
|
|
j.artist_albums albums.shown.to_a do |j, album|
|
|
j.album_title album.title
|
|
j.album_year album.year
|
|
j.album_pic album.pic_safe
|
|
j.album_tracks album.tracks.to_a do |j, track|
|
|
j.track_id track.id
|
|
j.track_title track.title
|
|
j.track_duration track.duration
|
|
j.track_disc track.disc_id
|
|
j.track_position track.position
|
|
j.meta do |j|
|
|
j.id track.id
|
|
j.title track.title
|
|
j.duration track.duration
|
|
j.length track.length
|
|
j.artists track.artists.map(&:name)
|
|
j.album album.title
|
|
j.album_pic album.pic_safe
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def import
|
|
return unless rovi_id?
|
|
|
|
Artist.import(Robbie::Artist.find(rovi_id))
|
|
end
|
|
|
|
class << self
|
|
def with_name(name)
|
|
# DB lookup
|
|
artist = find_by_name(name)
|
|
return artist unless artist.nil?
|
|
|
|
# Rovi correction
|
|
rovi_artist = Robbie::Artist.find_by_name(name)
|
|
return artist if rovi_artist && artist = find_by_rovi_id(rovi_artist.id)
|
|
|
|
# Parsing artist if ok
|
|
import(rovi_artist) if rovi_artist
|
|
end
|
|
|
|
def import(rovi_artist)
|
|
data = BeatParser::Aggregator.new.artist(rovi_artist.id)
|
|
artist = Artist.find_or_create_by_rovi_id(data[:id])
|
|
artist.update_attributes(
|
|
name: data[:name],
|
|
is_group: data[:is_group],
|
|
pic: data[:pic],
|
|
bio: data[:bio]
|
|
)
|
|
data[:albums].each do |album_meta|
|
|
album = Album.find_or_create_by_rovi_id(album_meta[:id])
|
|
album.update_attributes(
|
|
artist_id: artist.id,
|
|
title: album_meta[:title],
|
|
year: album_meta[:year].to_i
|
|
)
|
|
album_meta[:tracks].each do |track_meta|
|
|
track = Track.find_or_create_by_rovi_id(track_meta[:id])
|
|
track.update_attributes(
|
|
album_id: album.id,
|
|
disc_id: track_meta[:disc_id],
|
|
position: track_meta[:position],
|
|
title: track_meta[:title],
|
|
duration: track_meta[:duration]
|
|
)
|
|
track_meta[:artists].each do |performer|
|
|
performer_artist = Artist.find_or_create_by_rovi_id(performer[:id])
|
|
performer_artist.update_attributes(
|
|
name: performer[:name]
|
|
)
|
|
Performer.find_or_create_by_artist_id_and_track_id(performer_artist.id, track.id)
|
|
end
|
|
end
|
|
end
|
|
data[:genres].each do |genre_meta|
|
|
genre = Genre.find_or_create_by_rovi_id(genre_meta[:id])
|
|
genre.update_attributes(
|
|
name: genre_meta[:name]
|
|
)
|
|
ArtistGenre.find_or_create_by_artist_id_and_genre_id(artist.id, genre.id)
|
|
end
|
|
artist
|
|
end
|
|
end
|
|
end
|