145 lines
4.6 KiB
Ruby
145 lines
4.6 KiB
Ruby
require 'open-uri'
|
|
require 'musicbrainz'
|
|
|
|
class ArtistController < ApplicationController
|
|
@@default_album_types = [:album, :soundtrack]
|
|
def data
|
|
@data = {
|
|
:status => '',
|
|
:correct_name => '',
|
|
:html => ''
|
|
}
|
|
@loading = false
|
|
|
|
# Bad params
|
|
if params[:name].nil? or params[:name].length == 0
|
|
@data[:status] = 'loading_failed';
|
|
render :json => @data
|
|
return
|
|
end
|
|
|
|
# Searching for artist
|
|
name = params[:name].gsub('%20', ' ').gsub('+', ' ').gsub('.html', '')
|
|
@artist = Artist.find_by_name(name)
|
|
|
|
# Artist not found
|
|
unless @artist
|
|
results = MusicBrainz::Artist.search(name)
|
|
if results.empty?
|
|
@data[:status] = 'not_found'
|
|
render :json => @data
|
|
elsif results[0][:name] != name and (results[0][:name].downcase == name.downcase or results[0][:name].downcase == 'the '+ name.downcase)
|
|
@data[:status] = 'corrected'
|
|
@data[:correct_name] = results[0][:name]
|
|
render :json => @data
|
|
elsif results[0][:name] == name
|
|
# Saving artist and queueing job
|
|
@artist = Artist.new
|
|
@artist.name = name
|
|
@artist.mbid = results[0][:mbid]
|
|
@artist.status = 0
|
|
@artist.save
|
|
Delayed::Job.enqueue LoadArtistJob.new(name)
|
|
# Rendering loading info
|
|
@artist = { :artist => @artist, :albums => [] }
|
|
@loading = true
|
|
@data[:status] = 'loading'
|
|
@data[:html] = (render_to_string :partial => 'page').gsub(/\n\s+/, '').gsub(/\n/, '')
|
|
render :json => @data
|
|
else
|
|
@suggestions = results.take(5)
|
|
@data[:status] = 'suggestions'
|
|
@data[:html] = (render_to_string :partial => 'suggestions').gsub(/\n\s+/, '').gsub(/\n/, '')
|
|
render :json => @data
|
|
end
|
|
return
|
|
end
|
|
|
|
if @artist and @artist.status == 2
|
|
@data[:status] = 'fail'
|
|
@data[:html] = (render_to_string :partial => 'fail').gsub(/\n\s+/, '').gsub(/\n/, '')
|
|
render :json => @data
|
|
return
|
|
end
|
|
|
|
if @artist.status == 1
|
|
@data[:status] = 'ok'
|
|
else
|
|
@data[:status] = 'loading'
|
|
@loading = true
|
|
end
|
|
|
|
@data[:albums], @data[:html] = buildArtistHTML(@artist)
|
|
render :json => @data
|
|
end
|
|
|
|
def buildArtistHTML artist
|
|
@artist[:artist] = {
|
|
id: artist.id,
|
|
name: artist.name,
|
|
desc: ActionController::Base.helpers.strip_tags(artist.desc),
|
|
pic: artist.pic_url,
|
|
urls: artist.artist_links
|
|
}
|
|
ap artist.artist_links
|
|
media_types = @@default_album_types
|
|
session = Session.find_by_key(session_key)
|
|
unless session.nil?
|
|
media_types = session.user.music
|
|
end
|
|
|
|
@artist[:albums] = []
|
|
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, :tracks => []}
|
|
album.tracks.each do |track|
|
|
tmp_track = {id: track.id, name: track.name, live: track.live, acoustic: track.acoustic}
|
|
tmp_track[:length] = (track.length / 1000).round unless track.length.nil?
|
|
tmp_track[:duration] = formatTrackDuration(track.length)
|
|
tmp_track[:position] = track.position.to_s 36
|
|
# tmp_track[:mbid] = track.mbid
|
|
# (track.bonus == 0 ? album_tracks : bonus_tracks) << tmp_track
|
|
tmp_album[:tracks] << tmp_track
|
|
end
|
|
# tmp_album[:tracks] = {album: album_tracks, bonus: bonus_tracks}
|
|
@artist[:albums] << tmp_album unless tmp_album[:tracks].empty?
|
|
end
|
|
end
|
|
|
|
return @artist[:albums], (render_to_string :partial => 'page').gsub(/\n\s+/, '').gsub(/\n/, '')
|
|
end
|
|
|
|
def formatTrackDuration length
|
|
if length
|
|
time = length # (length / 1000).round
|
|
time_m = (time / 60).floor
|
|
time_s = time - time_m * 60
|
|
time_m.to_s + ':' + (time_s < 10 ? '0' : '') + time_s.to_s
|
|
else
|
|
'0:00'
|
|
end
|
|
end
|
|
|
|
def autocomplete
|
|
autocomplete = getLastFmAutocomplete(params[:query])
|
|
return render :nothing => true if autocomplete.nil?
|
|
suggestions = []
|
|
autocomplete["response"]["docs"].each do |doc|
|
|
suggestions << doc["artist"] unless suggestions.include?(doc["artist"]) or doc["artist"].nil? or doc['restype'] != 6
|
|
end
|
|
render :json => {
|
|
:query => params[:query],
|
|
:suggestions => suggestions.take(5)
|
|
}
|
|
end
|
|
|
|
def getLastFmAutocomplete query
|
|
return nil if query.nil? or query.strip.empty?
|
|
json = ActiveSupport::JSON.decode(open(
|
|
'http://www.last.fm/search/autocomplete' <<
|
|
'?rows=30&q=' << URI.escape(query)
|
|
).read)
|
|
json.empty? ? nil : json
|
|
end
|
|
end
|