57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| class ArtistController < ApplicationController
 | |
|   def data
 | |
|     # Bad params
 | |
|     if params[:name].nil? or params[:name].empty?
 | |
|       return render json: { status: 'loading_failed' }
 | |
|     end
 | |
|     
 | |
|     # Searching for artist
 | |
|     artist_name = get_artist_name_from_query
 | |
|     @artist = Artist.find_by_name(artist_name, include: { artist_links: {}, albums: { tracks: {}}})
 | |
|     
 | |
|     # Artist not found in DB
 | |
|     unless @artist
 | |
|       results = MusicBrainz::Artist.search(artist_name)
 | |
|       if results.empty?
 | |
|         return render json: { status: 'not_found' }
 | |
|       end
 | |
|       best_match = results[0][:sort_name]
 | |
|       if best_match != artist_name and similar_names(artist_name, best_match)
 | |
|         return render json: { status: 'corrected', correct_name: best_match }
 | |
|       elsif best_match == artist_name
 | |
|         queue_loading(artist_name, results[0][:mbid])
 | |
|         return render json: { status: 'loading', html: render_compact_partial(:page) }
 | |
|       else
 | |
|         @suggestions = results.take(5)
 | |
|         return render json: { status: 'suggestions', html: render_compact_partial(:suggestions) }
 | |
|       end
 | |
|     end
 | |
|     
 | |
|     # Artist loading failed
 | |
|     if @artist.status == 2
 | |
|       return render json: { status: 'fail', html: render_compact_partial(:fail) }
 | |
|     end
 | |
|     
 | |
|     render json: {
 | |
|       status: @artist.status_str,
 | |
|       artist: @artist,
 | |
|       html: render_compact_partial(:page)
 | |
|     }, include: { albums: { include: { tracks: {}}}}
 | |
|   end
 | |
|   
 | |
| private
 | |
| 
 | |
|   def get_artist_name_from_query
 | |
|     params[:name].gsub('%20', ' ').gsub('+', ' ').gsub('.html', '')
 | |
|   end
 | |
|   
 | |
|   def queue_loading artist_name, mbid
 | |
|     @artist = Artist.create( name: artist_name, mbid: mbid, status: 0 )
 | |
|     Delayed::Job.enqueue(LoadArtistJob.new(artist_name))
 | |
|   end
 | |
|   
 | |
|   def similar_names name1, name2
 | |
|     (name2.downcase == name1.downcase or name2.downcase == 'the '+ name1.downcase)
 | |
|   end
 | |
| end
 |