parent
							
								
									24ca64a945
								
							
						
					
					
						commit
						c9ea9c6a27
					
				| @ -1,4 +1,3 @@ | ||||
| require 'uri' | ||||
| require 'open-uri' | ||||
| 
 | ||||
| class ArtistController < ApplicationController | ||||
| @ -8,15 +7,15 @@ class ArtistController < ApplicationController | ||||
|     artist = Artist.find_by_name(name) | ||||
|     unless artist | ||||
|       results = ArtistController.musicBrainzSearch(name) | ||||
|       if results[0].downcase == name.downcase and results[0] != name | ||||
|         render :json => {correct: results[0]} | ||||
|         return | ||||
|       elsif results[0] == name | ||||
|       if results[0] == name | ||||
|         ImportController.importArtist(name) | ||||
|         render :json => {status: 'loading'} | ||||
|         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 => {suggestions: results} | ||||
|         render :json => {status: 'suggestions', values: results} | ||||
|         return | ||||
|       end | ||||
|     end | ||||
| @ -71,12 +70,12 @@ class ArtistController < ApplicationController | ||||
| 	 | ||||
| 	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') +'~').read) | ||||
| 	    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'] | ||||
| 	      artists << artist['name'] unless artist['type'] == 'unknown' | ||||
| 	    end | ||||
| 	    return artists | ||||
| 	    artists.take(10) | ||||
| 	  rescue | ||||
| 	    return {} | ||||
| 	  end | ||||
|  | ||||
| @ -5,21 +5,28 @@ class ImportController < ApplicationController | ||||
| 
 | ||||
|     # Get artist info | ||||
|     artist_mb_xml = open( | ||||
|       'http://musicbrainz.org/ws/2/artist/?query='+ URI.escape(name).gsub(/\&/, '%26').gsub(/\?/, '%3F') +'&limit=1', | ||||
|       'http://musicbrainz.org/ws/2/artist/?query='+ URI.escape(name).gsub(/\&/, '%26').gsub(/\?/, '%3F') +'&limit=5', | ||||
|       'User-Agent' => @@user_agent | ||||
|     ).read | ||||
|     artist_mb_data = artist_mb_xml.scan(/<artist.*?type=\"(.+?)\"\sid=\"([a-f0-9-]+?)\">.*?<name>(.+?)<\/name>/m) | ||||
|     artist_lastfm_xml = open( | ||||
|       'http://ws.audioscrobbler.com/2.0/'+ | ||||
|       '?method=artist.getinfo&api_key='+ @@lastfm_api_key + | ||||
|       '&artist='+ URI.escape(name).gsub(/\&/, '%26').gsub(/\?/, '%3F') | ||||
|     ).read | ||||
|     begin | ||||
|       artist_lastfm_xml = open( | ||||
|         'http://ws.audioscrobbler.com/2.0/'+ | ||||
|         '?method=artist.getinfo&api_key='+ @@lastfm_api_key + | ||||
|         '&artist='+ URI.escape(name).gsub(/\&/, '%26').gsub(/\?/, '%3F') | ||||
|       ).read | ||||
|       artist_desc = artist_lastfm_xml.scan(/<summary><\!\[CDATA\[?(.*)\]\]><\/summary>/m)[0][0] | ||||
|       artist_pic = artist_lastfm_xml.scan(/<image\ssize=\"extralarge\">?(.*)<\/image>/)[0][0] | ||||
|     rescue | ||||
|       artist_desc = '' | ||||
|       artist_pic = '' | ||||
|     end | ||||
|      | ||||
|     # Save artist | ||||
|     artist = Artist.new | ||||
|     artist.name = artist_mb_data[0][2] | ||||
|     artist.desc = artist_lastfm_xml.scan(/<summary><\!\[CDATA\[?(.*)\]\]><\/summary>/m)[0][0] | ||||
|     artist.pic_url = artist_lastfm_xml.scan(/<image\ssize=\"extralarge\">?(.*)<\/image>/)[0][0] | ||||
|     artist.desc = artist_desc | ||||
|     artist.pic_url = artist_pic | ||||
|     artist.artist_type = artist_mb_data[0][0] | ||||
|     artist.mbid = artist_mb_data[0][1] | ||||
|     artist.save | ||||
| @ -42,6 +49,8 @@ class ImportController < ApplicationController | ||||
|       releases_mb_data.each do |item| | ||||
|         if item[2].length == 4 | ||||
|           item[2] += '-01-01' | ||||
|         elsif item[2].length == 7 | ||||
|           item[2] += '-01' | ||||
|         end | ||||
|       end | ||||
|        | ||||
|  | ||||
| @ -57,6 +57,5 @@ Beathaven::Application.routes.draw do | ||||
|   # match ':controller(/:action(/:id(.:format)))' | ||||
|    | ||||
|   match 'artist/autocomplete' => 'artist#autocomplete' | ||||
|   match 'artist/search' => 'artist#search' | ||||
|   match 'artist/(:name)/' => 'artist#data', :constraints => { :name => /[^\/]*/ } | ||||
| end | ||||
|  | ||||
| @ -3,7 +3,7 @@ require 'open-uri' | ||||
| namespace :db do | ||||
|   desc 'Imports test data from MusicBrainz database' | ||||
|   task :import => :environment do | ||||
|     ati = ['Jet'] | ||||
|     ati = ['The White Stripes'] | ||||
|     ati.each do |name| | ||||
|       ImportController.importArtist(name) | ||||
|     end | ||||
|  | ||||
| @ -4,6 +4,7 @@ | ||||
| 		<title>BetaHaven</title> | ||||
| 		<meta charset="utf-8"/> | ||||
| 		<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/layout.css" /> | ||||
| 		<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/search.css" /> | ||||
| 		<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/misc.css" /> | ||||
| 		<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/player.css" /> | ||||
| 		<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/albums.css" /> | ||||
| @ -13,6 +14,7 @@ | ||||
| 		<script type="text/javascript" charset="utf-8" src="/javascripts/jquery/jquery.contentchange.js"></script> | ||||
| 		<script type="text/javascript" charset="utf-8" src="/javascripts/beathaven/layout.js"></script> | ||||
| 		<script type="text/javascript" charset="utf-8" src="/javascripts/beathaven/ajax.js"></script> | ||||
| 		<script type="text/javascript" charset="utf-8" src="/javascripts/beathaven/search.js"></script> | ||||
| 		<script type="text/javascript" charset="utf-8" src="/javascripts/beathaven/pages.js"></script> | ||||
| 		<script type="text/javascript" charset="utf-8" src="/javascripts/beathaven/audio.js"></script> | ||||
| 		<script type="text/javascript" charset="utf-8" src="/javascripts/beathaven/player.js"></script> | ||||
|  | ||||
| @ -4,4 +4,19 @@ | ||||
| 		<input type="submit" value="Search" id="search_button"/> | ||||
| 	</form> | ||||
| 	<img src="/images/loader.gif" alt="" /> | ||||
| 	<div class="suggestions"> | ||||
| 		<div>Misspelled?</div> | ||||
| 		<ul> | ||||
| 			<li><a class="data artist">The Raconters</a></li> | ||||
| 			<li>The Raconteurs</li> | ||||
| 			<li>The Encounters</li> | ||||
| 			<li>Encounters</li> | ||||
| 			<li>The Encounter</li> | ||||
| 			<li>Carpenters</li> | ||||
| 			<li>The Dearhunters</li> | ||||
| 			<li>Jamhunters</li> | ||||
| 			<li>The Go Go Haunters</li> | ||||
| 			<li>The Beathunters</li> | ||||
| 		</ul> | ||||
| 	</div> | ||||
| </div> | ||||
| @ -1,20 +1,25 @@ | ||||
| var Ajax = { | ||||
| 	loadArtistData: function(name) { | ||||
| 		$('#search-container input').attr('disabled', 'disabled').blur(); | ||||
| 		$('#search-container img').show(); | ||||
| 		Search.showSpinner(); | ||||
| 		name = name.split(' ').join('+'); | ||||
| 		Ajax.setArchor('/artist/'+ name +'/'); | ||||
| 		$.get('/artist/'+ name +'/', function(data){ | ||||
| 			if (typeof data.error != 'undefined') { | ||||
| 				if (data.error == 'loading') { | ||||
| 			if (typeof data.status != 'undefined') { | ||||
| 				if (data.status == 'loaded') { | ||||
| 					Ajax.loadArtistData(name); | ||||
| 				} else if (data.error == 404) { | ||||
| 				} else if (data.status == 'corrected') { | ||||
| 					Ajax.loadArtistData(data.page); | ||||
| 				} else if (data.status == 'suggestions') { | ||||
| 					Search.hideSpinner(); | ||||
| 					Search.showSuggestions(data.values); | ||||
| 				} else if (data.status == 'error') { | ||||
| 					Ajax.load404Page(); | ||||
| 				} | ||||
| 				return false; | ||||
| 			} else { | ||||
| 				Ajax.setArchor('/artist/'+ name +'/'); | ||||
| 				Pages.renderArtist(data); | ||||
| 				beathaven.redrawScrollbar(); | ||||
| 			} | ||||
| 			Pages.renderArtist(data); | ||||
| 			beathaven.redrawScrollbar(); | ||||
| 		}) | ||||
| 	}, | ||||
| 	 | ||||
| @ -75,14 +80,5 @@ $(function(){ | ||||
| 		Ajax.loadArtistData($(this).html()); | ||||
| 		return false; | ||||
| 	}); | ||||
| 	$('.search').live('click', function(){ | ||||
| 		Ajax.loadSearchPage(); | ||||
| 		return false; | ||||
| 	}); | ||||
| 	$('#search_form').live('submit', function(){ | ||||
| 		$('.autocomplete-container').remove(); | ||||
| 		Ajax.loadArtistData($('#search_field').val()); | ||||
| 		return false; | ||||
| 	}); | ||||
| 	$(window).bind('hashchange', Ajax.detectPage); | ||||
| }) | ||||
							
								
								
									
										46
									
								
								public/javascripts/beathaven/search.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								public/javascripts/beathaven/search.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| var Search = { | ||||
| 	 | ||||
| 	showSpinner: function() { | ||||
| 		$('#search-container input').attr('disabled', 'disabled').blur(); | ||||
| 		$('#search-container img').show(); | ||||
| 		Search.hideSuggestions(); | ||||
| 	}, | ||||
| 	 | ||||
| 	hideSpinner: function() { | ||||
| 		$('#search-container input').removeAttr('disabled'); | ||||
| 		$('#search_field').focus(); | ||||
| 		$('#search-container img').hide(); | ||||
| 	}, | ||||
| 	 | ||||
| 	showSuggestions: function(values) { | ||||
| 		for (var i = 0; i < values.length; i++) { | ||||
| 			$('.suggestions ul').append('\ | ||||
| 				<li>\ | ||||
| 					<a class="data artist">'+ values[i] +'</a>\ | ||||
| 				</li>\ | ||||
| 			'); | ||||
| 		} | ||||
| 		$('.suggestions').show(); | ||||
| 	}, | ||||
| 	 | ||||
| 	hideSuggestions: function() { | ||||
| 		$('.suggestions ul li').remove(); | ||||
|  		$('.suggestions').hide(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| $(function(){ | ||||
| 	$('.search').live('click', function(){ | ||||
| 		Ajax.loadSearchPage(); | ||||
| 		return false; | ||||
| 	}); | ||||
| 	$('#search_form').live('submit', function(){ | ||||
| 		$('.autocomplete-container').remove(); | ||||
| 		Ajax.loadArtistData($('#search_field').val()); | ||||
| 		return false; | ||||
| 	}); | ||||
| 	$('.suggestions a').live('click', function(){ | ||||
| 		$('#search_field').val($(this).text()); | ||||
| 		return false; | ||||
| 	}); | ||||
| }); | ||||
| @ -79,48 +79,6 @@ | ||||
|     background: #AAA; | ||||
| } | ||||
| 
 | ||||
| #search-container { | ||||
| 	width: 100%; | ||||
| 	text-align: center; | ||||
| 	margin-top: 50px; | ||||
| } | ||||
| 	#search-container #search_field { | ||||
| 		width: 300px; | ||||
| 		font-size: 24px; | ||||
| 		padding: 4px; | ||||
| 		border: #CCC 1px solid; | ||||
| 		-webkit-border-radius: 3px; | ||||
| 		-moz-border-radius: 3px; | ||||
| 		border-radius: 3px; | ||||
| 	} | ||||
| 	#search-container #search_button { | ||||
| 		width: 100px; | ||||
| 		font-size: 24px; | ||||
| 		padding: 4px; | ||||
| 		background-color: #DDD; | ||||
| 		border: #CCC 1px solid; | ||||
| 		-webkit-border-radius: 3px; | ||||
| 		-moz-border-radius: 3px; | ||||
| 		border-radius: 3px; | ||||
| 	} | ||||
| 	#search-container img { | ||||
| 		margin-top: 30px; | ||||
| 		display: none; | ||||
| 	} | ||||
| 
 | ||||
| .autocomplete { | ||||
| 	margin: 4px 0 0 -1px; | ||||
| } | ||||
| 	.autocomplete div { | ||||
| 		font-size: 24px; | ||||
| 		padding: 6px 5px; | ||||
| 		background-color: #FAFAFA; | ||||
| 		margin-bottom: 1px; | ||||
| 	} | ||||
| 		.autocomplete div.selected { | ||||
| 			background-color: #EAEAEA; | ||||
| 		} | ||||
| 
 | ||||
| #error_page { | ||||
| 	position: relative; | ||||
| 	width: 600px; | ||||
|  | ||||
							
								
								
									
										64
									
								
								public/stylesheets/search.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								public/stylesheets/search.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| #search-container { | ||||
| 	width: 100%; | ||||
| 	text-align: center; | ||||
| 	margin-top: 50px; | ||||
| } | ||||
| 	#search-container #search_field { | ||||
| 		width: 300px; | ||||
| 		font-size: 24px; | ||||
| 		padding: 4px; | ||||
| 		border: #CCC 1px solid; | ||||
| 		-webkit-border-radius: 3px; | ||||
| 		-moz-border-radius: 3px; | ||||
| 		border-radius: 3px; | ||||
| 	} | ||||
| 	#search-container #search_button { | ||||
| 		width: 100px; | ||||
| 		font-size: 24px; | ||||
| 		padding: 4px; | ||||
| 		background-color: #DDD; | ||||
| 		border: #CCC 1px solid; | ||||
| 		-webkit-border-radius: 3px; | ||||
| 		-moz-border-radius: 3px; | ||||
| 		border-radius: 3px; | ||||
| 	} | ||||
| 	#search-container img { | ||||
| 		margin-top: 30px; | ||||
| 		display: none; | ||||
| 	} | ||||
| 
 | ||||
| .autocomplete { | ||||
| 	margin: 4px 0 0 -1px; | ||||
| } | ||||
| 	.autocomplete div { | ||||
| 		font-size: 24px; | ||||
| 		padding: 6px 5px; | ||||
| 		background-color: #FAFAFA; | ||||
| 		margin-bottom: 1px; | ||||
| 	} | ||||
| 		.autocomplete div.selected { | ||||
| 			background-color: #EAEAEA; | ||||
| 		} | ||||
| 
 | ||||
| .suggestions { | ||||
| 	display: none; | ||||
| 	position: absolute; | ||||
| 	left: 50%; | ||||
| 	margin: 30px 0 0 -380px; | ||||
| 	width: 400px; | ||||
| 	text-align: left; | ||||
| 	font-size: 24px; | ||||
| } | ||||
| 	.suggestions div { | ||||
| 		margin-bottom: 20px; | ||||
| 	} | ||||
| 	.suggestions ul li { | ||||
| 		display: block; | ||||
| 		width: auto; | ||||
| 		margin-bottom: 6px; | ||||
| 	} | ||||
| 		.suggestions .data.artist { | ||||
| 			color: #04F; | ||||
| 			border-bottom: #04F 1px dotted; | ||||
| 			cursor: pointer; | ||||
| 		} | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user