Mass artist controller refactoring
This commit is contained in:
		
							parent
							
								
									62d7d378bd
								
							
						
					
					
						commit
						73ce491479
					
				@ -53,9 +53,13 @@ class window.Player
 | 
			
		||||
      autoplay = false
 | 
			
		||||
    initial_count = $('.playlist li').length
 | 
			
		||||
    for item in tracks
 | 
			
		||||
      len = parseInt(item.length, 10)
 | 
			
		||||
      m = Math.floor(len / 60)
 | 
			
		||||
      s = len - Math.floor(len / 60) * 60
 | 
			
		||||
      duration = m + ':' + (if s < 10 then '0' else '') + s
 | 
			
		||||
      $('.playlist').append '
 | 
			
		||||
      <li id="i' +Math.round(Math.random() * 999999)+ '" data-id="'+item.id+'">
 | 
			
		||||
        <div class="song-duration">' +item.duration+ '</div>
 | 
			
		||||
        <div class="song-duration">' +duration+ '</div>
 | 
			
		||||
        <div class="remove">remove</div>
 | 
			
		||||
        <div class="artist-name">' +item.artist+ '</div>
 | 
			
		||||
        <div class="song-title">' +item.name+ '</div>
 | 
			
		||||
 | 
			
		||||
@ -20,8 +20,8 @@ class window.Search
 | 
			
		||||
        _ajax.setArchor '/artist/' +name+ '/'
 | 
			
		||||
        _page.print data.html
 | 
			
		||||
        if _session.getUser().id
 | 
			
		||||
          if data.albums?
 | 
			
		||||
            for album in data.albums
 | 
			
		||||
          if data.artist.albums?
 | 
			
		||||
            for album in data.artist.albums
 | 
			
		||||
              _player.albums[album.id] = album
 | 
			
		||||
          $('.button-container').show()
 | 
			
		||||
        _search.hideSpinner()
 | 
			
		||||
 | 
			
		||||
@ -15,12 +15,11 @@ class ApplicationController < ActionController::Base
 | 
			
		||||
    render :partial => 'about'
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  protected
 | 
			
		||||
protected
 | 
			
		||||
  
 | 
			
		||||
  def authorize
 | 
			
		||||
    unless Vkontakte.check(params)
 | 
			
		||||
      render :json => { :status => 'login failed' }
 | 
			
		||||
      false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
@ -40,4 +39,8 @@ class ApplicationController < ActionController::Base
 | 
			
		||||
    end
 | 
			
		||||
    cookies[:beathaven_sid]
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  def render_compact_partial partial_name
 | 
			
		||||
    (render_to_string :partial => partial_name.to_s).gsub(/\n(\s+)?/, '')
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -2,121 +2,52 @@ 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
 | 
			
		||||
    if params[:name].nil? or params[:name].empty?
 | 
			
		||||
      return render :json => { :status => 'loading_failed' }
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    # Searching for artist
 | 
			
		||||
    name = params[:name].gsub('%20', ' ').gsub('+', ' ').gsub('.html', '')
 | 
			
		||||
    @artist = Artist.find_by_name(name)
 | 
			
		||||
    artist_name = get_artist_name_from_query
 | 
			
		||||
    @artist = Artist.find_by_name(artist_name, include: {artist_links: {}, albums: {tracks: {}}})
 | 
			
		||||
    
 | 
			
		||||
    # Artist not found
 | 
			
		||||
    # Artist not found in DB
 | 
			
		||||
    unless @artist
 | 
			
		||||
      results = MusicBrainz::Artist.search(name)
 | 
			
		||||
      results = MusicBrainz::Artist.search(artist_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
 | 
			
		||||
        return render :json => { :status => 'not_found' }
 | 
			
		||||
      end
 | 
			
		||||
      best_match = results[0][:name]
 | 
			
		||||
      if best_match != artist_name and (best_match.downcase == artist_name.downcase or best_match.downcase == 'the '+ artist_name.downcase)
 | 
			
		||||
        return render :json => { :status => 'corrected', :correct_name => best_match }
 | 
			
		||||
      elsif results[0][:name] == artist_name
 | 
			
		||||
        queue_loading(artist_name, results[0][:mbid])
 | 
			
		||||
        @artist = { :artist => @artist, :albums => [] }
 | 
			
		||||
        @loading = true
 | 
			
		||||
        @data[:status] = 'loading'
 | 
			
		||||
        @data[:html] = (render_to_string :partial => 'page').gsub(/\n\s+/, '').gsub(/\n/, '')
 | 
			
		||||
        render :json => @data
 | 
			
		||||
        return render :json => { :status => 'loading', :html => render_compact_partial(:page) }
 | 
			
		||||
      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
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    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 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?
 | 
			
		||||
        return render :json => { :status => 'suggestions', :html => render_compact_partial(:suggestions) }
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    return @artist[:albums], (render_to_string :partial => 'page').gsub(/\n\s+/, '').gsub(/\n/, '')
 | 
			
		||||
    # 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
 | 
			
		||||
  
 | 
			
		||||
  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
 | 
			
		||||
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
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -8,8 +8,7 @@ class TrackController < ApplicationController
 | 
			
		||||
        if track.length == nil or track.length.to_i == 0 and params[:length].to_i > 0
 | 
			
		||||
          track.length = params[:length].to_i
 | 
			
		||||
          track.save
 | 
			
		||||
          render :json => { :result => :success }
 | 
			
		||||
          return
 | 
			
		||||
          return render :json => { :result => :success }
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
@ -21,8 +20,7 @@ class TrackController < ApplicationController
 | 
			
		||||
    unless track.nil? or track.available
 | 
			
		||||
      track.available = true
 | 
			
		||||
      track.save
 | 
			
		||||
      render :json => { :status => :success }
 | 
			
		||||
      return
 | 
			
		||||
      return render :json => { :status => :success }
 | 
			
		||||
    end
 | 
			
		||||
    render :json => { :status => :failed }
 | 
			
		||||
  end
 | 
			
		||||
@ -32,8 +30,7 @@ class TrackController < ApplicationController
 | 
			
		||||
    unless track.nil?
 | 
			
		||||
      # Saving track file
 | 
			
		||||
      vote(params[:track_id], params[:owner_id], params[:audio_id], -1)
 | 
			
		||||
      render :json => { :status => :success }
 | 
			
		||||
      return
 | 
			
		||||
      return render :json => { :status => :success }
 | 
			
		||||
    end
 | 
			
		||||
    render :json => { :status => :failed }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@ -5,10 +5,7 @@ class UserController < ApplicationController
 | 
			
		||||
    @res = {:status => 'hello', :newbie => false}
 | 
			
		||||
    user = User.find_by_vkid(params[:mid])
 | 
			
		||||
    if user.nil?
 | 
			
		||||
      user = User.new
 | 
			
		||||
      user.vkid = params[:mid]
 | 
			
		||||
      user.lang = 'ru'
 | 
			
		||||
      user.save
 | 
			
		||||
      user = User.new(:vkid => params[:mid], :lang => 'ru').save
 | 
			
		||||
      @res[:newbie] = true
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
@ -17,8 +14,7 @@ class UserController < ApplicationController
 | 
			
		||||
      session.key = session_key
 | 
			
		||||
      session.save
 | 
			
		||||
      @res[:ok_reload] = true
 | 
			
		||||
      render :json => @res
 | 
			
		||||
      return
 | 
			
		||||
      return render :json => @res
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    @res[:user] = {
 | 
			
		||||
@ -52,7 +48,6 @@ class UserController < ApplicationController
 | 
			
		||||
        if update_params.include? :show
 | 
			
		||||
          update_params[:show] = update_params[:show].map{ |k, v| k.to_sym }
 | 
			
		||||
        end
 | 
			
		||||
      
 | 
			
		||||
        params[:params].each do |k, v|
 | 
			
		||||
          user[k] = v
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
@ -3,4 +3,14 @@ class Artist < ActiveRecord::Base
 | 
			
		||||
  has_many :artist_links, :dependent => :destroy
 | 
			
		||||
  has_many :artist_aliases, :dependent => :destroy
 | 
			
		||||
  has_many :tracks, :through => :track_artists
 | 
			
		||||
  
 | 
			
		||||
  after_initialize :prepare_description
 | 
			
		||||
  
 | 
			
		||||
  def status_str
 | 
			
		||||
    %w(loading ok fail)[self.status]
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  def prepare_description
 | 
			
		||||
    self.desc.gsub! /[\[<].*?[\]>]/, ''
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -2,4 +2,16 @@ class Track < ActiveRecord::Base
 | 
			
		||||
  belongs_to :album
 | 
			
		||||
  has_many :track_artists
 | 
			
		||||
  has_many :artists, :through => :track_artists
 | 
			
		||||
  @duration
 | 
			
		||||
  
 | 
			
		||||
  def duration
 | 
			
		||||
    if self.length
 | 
			
		||||
      time = self.length
 | 
			
		||||
      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
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@ -1,32 +1,32 @@
 | 
			
		||||
- if @loading
 | 
			
		||||
- if @artist.status == 0
 | 
			
		||||
  .alert-message.warning
 | 
			
		||||
    %p= I18n.t 'search.loading'
 | 
			
		||||
.row.artist-info
 | 
			
		||||
  .span4.columns.pic
 | 
			
		||||
    = image_tag @artist[:artist][:pic] unless @artist[:artist][:pic].nil?
 | 
			
		||||
    = image_tag @artist.pic_url unless @artist.pic_url.nil?
 | 
			
		||||
  .span7.columns.desc
 | 
			
		||||
    %h2= @artist[:artist][:name]
 | 
			
		||||
    = @artist[:artist][:desc] unless @artist[:artist][:desc].nil?
 | 
			
		||||
    - unless @artist[:artist][:urls].nil?
 | 
			
		||||
    %h2= @artist.name
 | 
			
		||||
    = @artist.desc unless @artist.desc.nil?
 | 
			
		||||
    - unless @artist.artist_links.empty?
 | 
			
		||||
      .service-icons
 | 
			
		||||
        - @artist[:artist][:urls].each do |service|
 | 
			
		||||
        - @artist.artist_links.each do |service|
 | 
			
		||||
          - if ['wikipedia', 'microblog', 'official_homepage', 'social_network'].include?service.service
 | 
			
		||||
            %a.foreign-link{ :href => service.url, :target => '_blank' }
 | 
			
		||||
              = image_tag 'services/'+service.service+(service.service == 'official_homepage' ? '.png' : '.ico')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
- @artist[:albums].each do |album|
 | 
			
		||||
- @artist.albums.each do |album|
 | 
			
		||||
  .row.album
 | 
			
		||||
    .span4.columns.art
 | 
			
		||||
      %img{ :src => album[:pic] }
 | 
			
		||||
      %img{ :src => album.pic_url }
 | 
			
		||||
      .button-container
 | 
			
		||||
        %a.btn.add-album{ :'data-album-id' => album[:id] }= I18n.t 'player.add'
 | 
			
		||||
        %a.btn.add-album{ :'data-album-id' => album.id }= I18n.t 'player.add'
 | 
			
		||||
    .span7.columns.tracks
 | 
			
		||||
      %h3{ :'data-album-id' => album[:id] }= album[:name] + " (" + album[:year].to_s + ")"
 | 
			
		||||
      %h3{ :'data-album-id' => album.id }= album.name + " (" + album.year.to_s + ")"
 | 
			
		||||
      %table.zebra-striped.tracklist
 | 
			
		||||
        - album[:tracks].each do |track|
 | 
			
		||||
        - album.tracks.each do |track|
 | 
			
		||||
          %tr
 | 
			
		||||
            %td.song-title= track[:name]
 | 
			
		||||
            %td.song-title= track.name
 | 
			
		||||
            %td.song-duration
 | 
			
		||||
              .s-duration= (track[:duration] != '0:00' ? track[:duration] : ' '.html_safe)
 | 
			
		||||
              .s-add{ :'data-album-id' => album[:id], :'data-id' => track[:id] }= I18n.t 'player.add_one'
 | 
			
		||||
              .s-duration= (track.duration != '0:00' ? track.duration : ' '.html_safe)
 | 
			
		||||
              .s-add{ :'data-album-id' => album.id, :'data-id' => track.id }= I18n.t 'player.add_one'
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user