Cache power
This commit is contained in:
@@ -10,16 +10,28 @@ class ApplicationController < ActionController::Base
|
||||
end
|
||||
|
||||
def compile_page params
|
||||
@data = params[:data] unless params[:data].nil?
|
||||
@status = params[:status] unless params[:status].nil?
|
||||
render json: {
|
||||
renderer: "unified",
|
||||
data: @data,
|
||||
html: render_compact_partial(params[:partial]),
|
||||
title: params[:title],
|
||||
status: (params[:status] unless params[:status].nil?),
|
||||
callback: (params[:callback] unless params[:callback].nil?)
|
||||
}, include: (params[:include] unless params[:include].nil?)
|
||||
compiler = lambda do |params|
|
||||
@data = params[:data].call(&(params[:data].lambda? ? :call : :serialize)) unless params[:data].nil?
|
||||
@status = params[:status] unless params[:status].nil?
|
||||
{
|
||||
renderer: "unified",
|
||||
data: @data,
|
||||
html: render_compact_partial(params[:partial]),
|
||||
title: params[:title],
|
||||
status: (params[:status] unless params[:status].nil?),
|
||||
callback: (params[:callback] unless params[:callback].nil?)
|
||||
}.to_json.to_s
|
||||
end
|
||||
|
||||
unless params[:cache].nil?
|
||||
data = Rails.cache.fetch(params[:cache_key] || cache_key_for(params[:data]), expires_in: params[:cache]) do
|
||||
compiler.call(params)
|
||||
end
|
||||
else
|
||||
data = compiler.call(params)
|
||||
end
|
||||
|
||||
render text: data, content_type: 'application/json'
|
||||
end
|
||||
|
||||
def get_artist_name_from_query
|
||||
@@ -27,6 +39,10 @@ class ApplicationController < ActionController::Base
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def cache_key_for object
|
||||
"#{object.class.to_s.underscore}_#{object.id}"
|
||||
end
|
||||
|
||||
def authorize
|
||||
unless Vkontakte.check(params)
|
||||
|
||||
@@ -20,25 +20,19 @@ class ArtistController < ApplicationController
|
||||
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,
|
||||
data: @artist,
|
||||
partial: "artist/page",
|
||||
title: @artist.name,
|
||||
status: @artist.status_str,
|
||||
callback: {object: :player, action: :updateLibrary}
|
||||
callback: {object: :player, action: :updateLibrary},
|
||||
cache: 3.minutes
|
||||
)
|
||||
end
|
||||
|
||||
|
||||
@@ -8,18 +8,22 @@ class PlaylistController < ApplicationController
|
||||
artist = Artist.find_by_name(get_artist_name_from_query)
|
||||
return if artist.nil?
|
||||
|
||||
playlist = Playlist.new(name: "#{artist.name}: Last.fm TOP 50", artist: artist, pic_url: artist.pic_url)
|
||||
LastFM::Artist.get_top_tracks(artist: artist.name)["toptracks"]["track"].each do |track|
|
||||
tracks = Track.joins(:album, :artists).where(name: track["name"], "track_artists.artist_id" => artist.id)
|
||||
playlist.playlist_items << PlaylistItem.new(track_id: tracks.first.id) unless tracks.empty?
|
||||
compiler = lambda do
|
||||
playlist = Playlist.new(name: "#{artist.name}: Last.fm TOP 50", artist: artist, pic_url: artist.pic_url)
|
||||
LastFM::Artist.get_top_tracks(artist: artist.name)["toptracks"]["track"].each do |track|
|
||||
tracks = Track.joins(:album, :artists).where(name: track["name"], "track_artists.artist_id" => artist.id)
|
||||
playlist.playlist_items << PlaylistItem.new(track_id: tracks.first.id) unless tracks.empty?
|
||||
end
|
||||
playlist.serialize
|
||||
end
|
||||
|
||||
cache_for 1.week
|
||||
compile_page(
|
||||
data: playlist.serialize,
|
||||
data: compiler,
|
||||
partial: "playlist/tracks",
|
||||
title: playlist.name,
|
||||
callback: {object: :player, action: :updateLibrary}
|
||||
title: "#{artist.name}: Last.fm TOP 50",
|
||||
callback: {object: :player, action: :updateLibrary},
|
||||
cache: 3.minutes,
|
||||
cache_key: "lastfmtop50_#{artist.id}"
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user