84 lines
2.9 KiB
Ruby
84 lines
2.9 KiB
Ruby
require 'open-uri'
|
|
|
|
class ArtistController < ApplicationController
|
|
def data
|
|
data = {}
|
|
name = params[:name].gsub('%20', ' ').gsub('+', ' ')
|
|
artist = Artist.find_by_name(name)
|
|
unless artist
|
|
results = ArtistController.musicBrainzSearch(name)
|
|
if results[0] == name
|
|
ImportController.importArtist(name)
|
|
render :json => {status: 'loaded'}
|
|
return
|
|
elsif (results[0].downcase == name.downcase or results[0].downcase == 'the '+ name.downcase) and results[0] != name
|
|
render :json => {status: 'corrected', page: results[0]}
|
|
return
|
|
else
|
|
render :json => {status: 'suggestions', values: results}
|
|
return
|
|
end
|
|
end
|
|
data['artist'] = {name: artist.name, desc: ActionController::Base.helpers.strip_tags(artist.desc), pic: artist.pic_url}
|
|
data['albums'] = []
|
|
albums = artist.albums
|
|
albums.each do |album|
|
|
if album.album_type == 'Album'
|
|
tmp_album = {name: album.name, year: album.year, pic: album.pic_url}
|
|
album_tracks = []
|
|
bonus_tracks = []
|
|
album.tracks.each do |track|
|
|
tmp_track = {name: track.name, live: track.live, acoustic: track.acoustic}
|
|
if track.length
|
|
time = (track.length / 1000).round
|
|
time_m = (time / 60).floor
|
|
time_s = time - time_m * 60
|
|
tmp_track['duration'] = time_m.to_s + ':' + (time_s < 10 ? '0' : '') + time_s.to_s
|
|
else
|
|
tmp_track['duration'] = '0:00'
|
|
end
|
|
(track.bonus == 0 ? album_tracks : bonus_tracks) << tmp_track
|
|
end
|
|
tmp_album['tracks'] = {album: album_tracks, bonus: bonus_tracks}
|
|
data['albums'] << tmp_album
|
|
end
|
|
end
|
|
render :json => data
|
|
end
|
|
|
|
def autocomplete
|
|
autocomplete = ArtistController.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(10)
|
|
}
|
|
end
|
|
|
|
def self.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)
|
|
return json.empty? ? nil : json
|
|
end
|
|
|
|
def self.musicBrainzSearch(query)
|
|
begin
|
|
response = ActiveSupport::JSON.decode(open('http://search.test.musicbrainz.org/ws/2/artist/?fmt=json&query='+ URI.escape(query).gsub(/\&/, '%26').gsub(/\?/, '%3F') +'~&limit=100').read)
|
|
artists = []
|
|
response['artist-list']['artist'].each do |artist|
|
|
artists << artist['name'] unless artist['type'] == 'unknown'
|
|
end
|
|
artists.take(10)
|
|
rescue
|
|
return {}
|
|
end
|
|
end
|
|
end
|