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 cache_for 1.week compile_page( data: @artist.serialize, partial: "artist/page", title: @artist.name, status: @artist.status_str, callback: {object: :player, action: :updateLibrary} ) 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