From 61271d77656ebc99c51317929f8d500776811b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Bucho=CC=88ster?= Date: Wed, 4 May 2011 09:56:34 +0200 Subject: [PATCH 1/2] optimized LastFM module (added limit + page params & beautified results) --- app/controllers/search_controller.rb | 17 ++++---- app/helpers/application_helper.rb | 7 +++- app/views/layouts/application.html.haml | 4 +- app/views/search/index.html.haml | 32 ++++++++------- lib/LastFM/LastFM.rb | 53 ++++++++++++------------- lib/LastFM/LastFMRequest.rb | 30 ++++++++++---- 6 files changed, 82 insertions(+), 61 deletions(-) diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 37e8100..34348c9 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -1,14 +1,13 @@ class SearchController < ApplicationController def index - - if !params[:search_term].nil? - puts "TRACK SEARCH" - @results = LastFM::Artist.search(params[:search_term].to_s.lstrip) - @resultsArtists = @results["results"] - @results = LastFM::Track.search(params[:search_term].to_s.lstrip) - @resultsTracks = @results["results"] - @results = LastFM::Album.search(params[:search_term].to_s.lstrip) - @resultsAlbums = @results["results"] + if params[:q].nil? + params[:q] = "foobar" + end + + if !params[:q].nil? + @artists = LastFM::Artist.search(params[:q].to_s.lstrip, 18) + @tracks = LastFM::Track.search(params[:q].to_s.lstrip, 24) + @albums = LastFM::Album.search(params[:q].to_s.lstrip, 16) end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 1fa31c6..7423133 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,3 +1,4 @@ +# encoding: UTF-8 module ApplicationHelper def validate_img_url image, size @@ -16,5 +17,9 @@ module ApplicationHelper @result = LastFM::Album.getInfo(album, artist) @result.album end + + def trimString str, length + truncate str, :length => length.to_i, :omission => "…" + end -end +end \ No newline at end of file diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 0906ab4..889b7c5 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -10,6 +10,6 @@ #head %h1 = image_tag "9minutes.png" - - form_tag search_index_path, :method => 'get', :id => "search_form", :class => "right" do - = text_field_tag 'search_term', params[:search_term], :class => "input", :placeholder => "Search for" + = form_tag search_index_path, :method => 'get', :id => "search_form", :class => "right" do + = text_field_tag 'q', params[:q], :class => "input", :placeholder => "Search for" = yield \ No newline at end of file diff --git a/app/views/search/index.html.haml b/app/views/search/index.html.haml index 0c8ca2c..f4af5af 100644 --- a/app/views/search/index.html.haml +++ b/app/views/search/index.html.haml @@ -1,5 +1,5 @@ %h2.headline - =raw "Search for „#{params[:search_term]}“" + =raw "Search for „#{params[:q]}“" %ul.navigation{:steering => "search"} %li.active ALL %li ARTISTS @@ -11,7 +11,7 @@ #search_all_artists %ul.artists - count = 0 - - @resultsArtists.artistmatches.artist.each_with_index do |artist, i| + - @artists.artist.each_with_index do |artist, i| - break if (i >= 6 && count >= 6) - next unless artist.listeners.to_i > 15 - count += 1 @@ -19,37 +19,38 @@ = link_to "LINK" do = image_tag validate_img_url(artist.image, :large) %p - = artist.name + = trimString(artist.name, 22) %br.clean #search_all_songs %h2.headline.small Songs %ul.songs - - @resultsTracks.trackmatches.track.each_with_index do |track, i| + - @tracks.track.each_with_index do |track, i| - break if i == 10 %li = image_tag "ico/play.png", :class=>"play" = image_tag "ico/add.png", :class=>"add" %span = track.name - =raw " by #{track.artist}" + =raw " " + = "by #{trimString(track.artist, 50)}" #search_all_albums %h2.headline.small Albums %ul.albums - - @resultsAlbums.albummatches.album.each_with_index do |album, i| + - @albums.album.each_with_index do |album, i| - break if i == 8 %li .img = image_tag validate_img_url(album.image, :medium) %p %span - = album.name + = trimString(album.name, 38) %br - = album.artist + = trimString(album.artist, 22) %sub #search_artists %ul.artists - count = 0 - - @resultsArtists.artistmatches.artist.each_with_index do |artist, i| + - @artists.artist.each_with_index do |artist, i| - break if (i >= 18 && count >= 18) - next unless artist.listeners.to_i > 15 - count += 1 @@ -58,36 +59,37 @@ = link_to "LINK" do = image_tag validate_img_url(artist.image, :large) %p - = artist.name + = trimString(artist.name, 22) %br.clean = link_to "NACHLADEN", :class => "more" do = image_tag "ico/more.png" #search_albums %ul.albums - - @resultsAlbums.albummatches.album.each_with_index do |album, i| + - @albums.album.each_with_index do |album, i| - break if i == 16 %li .img = image_tag validate_img_url(album.image, :medium) %p %span - = album.name + = trimString(album.name, 38) %br - = album.artist + = trimString(album.artist, 22) %sub %br.clean = link_to "NACHLADEN", :class => "more" do = image_tag "ico/more.png" #search_songs %ul.songs.tab - - @resultsTracks.trackmatches.track.each_with_index do |track, i| + - @tracks.track.each_with_index do |track, i| - break if i == 24 %li = image_tag "ico/play.png", :class=>"play" = image_tag "ico/add.png", :class=>"add" %span = track.name - =raw " by #{track.artist}" + =raw " " + = "by #{trimString(track.artist, 50)}" %br.clean %br = link_to "NACHLADEN", :class => "more" do diff --git a/lib/LastFM/LastFM.rb b/lib/LastFM/LastFM.rb index fb24941..0e06070 100644 --- a/lib/LastFM/LastFM.rb +++ b/lib/LastFM/LastFM.rb @@ -1,75 +1,74 @@ - module LastFM class Artist < LastFMRequest - def self.search artist - get('/', :query => {:method => 'artist.search', :artist => artist}) + def self.search query, limit = nil, page = nil + artist_request "search", "artistmatches", query, limit, page end # return: artist name, tags, similar artists, artist bio (summary / long), mbid, image urls ( different sizes ) - def self.getInfo artist = nil, mbid = nil, autocorrect = 1 - get('/', :query => {:method => 'artist.getInfo', :artist => artist, :mbid => mbid, :autocorrect => autocorrect}) + def self.getInfo artist + artist_request "getInfo", nil, artist end # return: artists ( name, mbid, image urls ( different sizes ) ) - def self.getSimilar artist = nil, mbid = nil, autocorrect = 1 - get('/', :query => {:method => 'artist.getSimilar', :artist => artist, :mbid => mbid, :autocorrect => autocorrect}) + def self.getSimilar artist, limit = nil + artist_request "getSimilar", "similarartists", artist, limit end # return: tags ( name, tag´s last.fm-url ) ordered by popularity - def self.getTopTags artist = nil, mbid = nil, autocorrect = 1 - get('/', :query => {:method => 'artist.getTopTags', :artist => artist, :mbid => mbid, :autocorrect => autocorrect}) + def self.getTopTags artist + artist_request "getTopTags", "toptags", artist end # return: tracks ( name, image urls ( different sizes ) ) ordered by popularity - def self.getTopTracks artist = nil, mbid = nil, autocorrect = 1 - get('/', :query => {:method => 'artist.getTopTracks', :artist => artist, :mbid => mbid, :autocorrect => autocorrect}) + def self.getTopTracks artist, limit = nil, page = nil + artist_request "getTopTracks", "toptracks", artist, limit, page end # return: albums ( name, mbid, album url, image urls ( different sizes ) ) ordered by popularity - def self.getTopAlbums artist = nil, mbid = nil, autocorrect = 1 - get('/', :query => {:method => 'artist.getTopAlbums', :artist => artist, :mbid => mbid, :autocorrect => autocorrect}) + def self.getTopAlbums artist, limit = nil, page = nil + artist_request "getTopAlbums", "topalbums", artist, limit, page end end class Album < LastFMRequest - def self.search album - get('/', :query => {:method => 'album.search', :album => album}) + def self.search query, limit = nil, page = nil + album_request "search", "albummatches", query, nil, limit, page end # return: album name, artist, (top)tags, tracks ( name, duration (in sec) ) mbid (album), release date, image urls ( different sizes ) - def self.getInfo album = nil, artist = nil, mbid = nil, autocorrect = 1 - get('/', :query => {:method => 'album.getInfo', :album =>album, :artist => artist, :mbid => mbid, :autocorrect => autocorrect}) + def self.getInfo album, artist + album_request "getInfo", nil, album, artist end # return: tags ( name, tag´s last.fm-url ) ordered by popularity - def self.getTopTags album = nil, artist = nil, mbid = nil, autocorrect = 1 - get('/', :query => {:method => 'album.getTopTags', :album =>album, :artist => artist, :mbid => mbid, :autocorrect => autocorrect}) + def self.getTopTags album, artist + album_request "getTopTags", "toptags", album, artist end end class Track < LastFMRequest - def self.search track - get('/', :query => {:method => 'track.search', :track => track}) + def self.search query, limit = nil, page = nil + track_request "search", "trackmatches", query, nil, limit, page end # return: track name, id, (top)tags, artist, duration (in msec), album ( artist, title, image urls ( different sizes) ), mbid - def self.getInfo track = nil, artist = nil, autocorrect = 1 - get('/', :query => {:method => 'track.getInfo', :track => track, :artist => artist, :autocorrect => autocorrect}) + def self.getInfo track, artist + track_request "getInfo", nil, track, artist end # return: tracks ( name, artist (name, mbid), duration (in msec), image urls (sometimes) ) - def self.getSimilar track = nil, artist = nil, autocorrect = 1 - get('/', :query => {:method => 'track.getSimilar', :track => track, :artist => artist, :autocorrect => autocorrect}) + def self.getSimilar track, artist, limit = nil + track_request "getSimilar", "similartracks", track, artist, limit end # return: tags ( name, tag´s last.fm-url ) ordered by popularity - def self.getTopTags track = nil, artist = nil, autocorrect = 1 - get('/', :query => {:method => 'track.getTopTags', :track => track, :artist => artist, :autocorrect => autocorrect}) + def self.getTopTags track, artist + track_request "getTopTags", "toptags", track, artist end end diff --git a/lib/LastFM/LastFMRequest.rb b/lib/LastFM/LastFMRequest.rb index 46283f0..32bd238 100644 --- a/lib/LastFM/LastFMRequest.rb +++ b/lib/LastFM/LastFMRequest.rb @@ -7,7 +7,7 @@ class LastFMRequest base_uri "ws.audioscrobbler.com/2.0/" parser Proc.new { |data| Hashie::Mash.new(ActiveSupport::JSON.decode(data)) } - default_params :format => 'json' + default_params :format => 'json', :autocorrect => '1' debug_output $> format :json @@ -16,13 +16,8 @@ class LastFMRequest default_params :api_key => key end - def self.api_key - @@api_key - end - def self.limit=(limit) @limit = limit - default_params :limit => limit end def self.limit @@ -31,11 +26,32 @@ class LastFMRequest def self.page=(page) @page = page - default_params :page => page end def self.page @page end + + def self.artist_request method, node, q, limit = nil, page = nil + prepare_result method, node, get('/', :query => { :method => "artist.#{method.to_s}", :artist => q, :limit => limit, :page => page }) + end + + def self.album_request method, node, q, artist = nil, limit = nil, page = nil + prepare_result method, node, get('/', :query => { :method => "album.#{method.to_s}", :album => q, :artist => artist, :limit => limit, :page => page }) + end + + def self.track_request method, node, q, artist = nil, limit = nil, page = nil + prepare_result method, node, get('/', :query => { :method => "track.#{method.to_s}", :track => q, :artist => artist, :limit => limit, :page => page }) + end + + private + + def self.prepare_result method, node, response_hash + if method.to_s == "search" + response_hash = response_hash.results + end + response_hash.send(node.to_sym) + end + end \ No newline at end of file From f0a85a3527dd50c95c7f2a99cc16a24e041c77a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Bucho=CC=88ster?= Date: Wed, 4 May 2011 15:53:59 +0200 Subject: [PATCH 2/2] tried to autoload modules (does not yet work as expected) --- app/controllers/search_controller.rb | 1 + config/application.rb | 4 +- config/environments/development.rb | 7 +- config/initializers/lastfm_api_key.rb | 8 +- lib/LastFM/Album.rb | 20 +++++ lib/LastFM/Artist.rb | 35 +++++++++ lib/LastFM/LastFM.rb | 75 ------------------- lib/LastFM/LastFMRequest.rb | 101 +++++++++++++------------- lib/LastFM/Track.rb | 24 ++++++ 9 files changed, 145 insertions(+), 130 deletions(-) create mode 100644 lib/LastFM/Album.rb create mode 100644 lib/LastFM/Artist.rb delete mode 100644 lib/LastFM/LastFM.rb create mode 100644 lib/LastFM/Track.rb diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 34348c9..4f352cd 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -1,4 +1,5 @@ class SearchController < ApplicationController + def index if params[:q].nil? params[:q] = "foobar" diff --git a/config/application.rb b/config/application.rb index ad3d717..657e629 100644 --- a/config/application.rb +++ b/config/application.rb @@ -13,8 +13,8 @@ module Nineminutes # -- all .rb files in that directory are automatically loaded. # Custom directories with classes and modules you want to be autoloadable. - # config.autoload_paths += %W(#{config.root}/lib/LastFM) - # config.autoload_paths += Dir["#{config.root}/lib/LastFM"] + # config.autoload_paths += %W(#{config.root}/lib) + # config.autoload_paths += Dir["#{config.root}/lib/LastFM/"] # config.autoload_paths << config.root.join('lib') # Only load the plugins named here, in the order given (default is alphabetical). diff --git a/config/environments/development.rb b/config/environments/development.rb index 2468ab9..7797bdd 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,6 +1,11 @@ Nineminutes::Application.configure do # Settings specified here will take precedence over those in config/application.rb - + + # Reloads modules and files in lib directory + config.autoload_paths += %W(#{config.root}/lib) + config.autoload_paths += Dir["#{config.root}/lib/**/"] + + # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development # since you don't have to restart the webserver when you make code changes. diff --git a/config/initializers/lastfm_api_key.rb b/config/initializers/lastfm_api_key.rb index 4945555..5c268fe 100644 --- a/config/initializers/lastfm_api_key.rb +++ b/config/initializers/lastfm_api_key.rb @@ -1,4 +1,6 @@ -require "#{Rails.root.to_s}/lib/LastFM/LastFMRequest.rb" -require "#{Rails.root.to_s}/lib/LastFM/LastFM.rb" +require 'LastFM/LastFMRequest' +require 'LastFM/Artist' +require 'LastFM/Album' +require 'LastFM/Track' -LastFMRequest::api_key = '4c32e360f68553ec8fdca3711456b4f9' \ No newline at end of file +LastFM::LastFMRequest::api_key = '4c32e360f68553ec8fdca3711456b4f9' \ No newline at end of file diff --git a/lib/LastFM/Album.rb b/lib/LastFM/Album.rb new file mode 100644 index 0000000..ee5ba15 --- /dev/null +++ b/lib/LastFM/Album.rb @@ -0,0 +1,20 @@ +module LastFM + + class Album < LastFMRequest + def self.search query, limit = nil, page = nil + album_request "search", "albummatches", query, nil, limit, page + end + + # return: album name, artist, (top)tags, tracks ( name, duration (in sec) ) mbid (album), release date, image urls ( different sizes ) + def self.getInfo album, artist + album_request "getInfo", nil, album, artist + end + + # return: tags ( name, tag´s last.fm-url ) ordered by popularity + def self.getTopTags album, artist + album_request "getTopTags", "toptags", album, artist + end + + end + +end \ No newline at end of file diff --git a/lib/LastFM/Artist.rb b/lib/LastFM/Artist.rb new file mode 100644 index 0000000..0b16ab9 --- /dev/null +++ b/lib/LastFM/Artist.rb @@ -0,0 +1,35 @@ +module LastFM + + class Artist < LastFMRequest + def self.search query, limit = nil, page = nil + artist_request "search", "artistmatches", query, limit, page + end + + # return: artist name, tags, similar artists, artist bio (summary / long), mbid, image urls ( different sizes ) + def self.getInfo artist + artist_request "getInfo", nil, artist + end + + # return: artists ( name, mbid, image urls ( different sizes ) ) + def self.getSimilar artist, limit = nil + artist_request "getSimilar", "similarartists", artist, limit + end + + # return: tags ( name, tag´s last.fm-url ) ordered by popularity + def self.getTopTags artist + artist_request "getTopTags", "toptags", artist + end + + # return: tracks ( name, image urls ( different sizes ) ) ordered by popularity + def self.getTopTracks artist, limit = nil, page = nil + artist_request "getTopTracks", "toptracks", artist, limit, page + end + + # return: albums ( name, mbid, album url, image urls ( different sizes ) ) ordered by popularity + def self.getTopAlbums artist, limit = nil, page = nil + artist_request "getTopAlbums", "topalbums", artist, limit, page + end + + end + +end \ No newline at end of file diff --git a/lib/LastFM/LastFM.rb b/lib/LastFM/LastFM.rb deleted file mode 100644 index 0e06070..0000000 --- a/lib/LastFM/LastFM.rb +++ /dev/null @@ -1,75 +0,0 @@ -module LastFM - - class Artist < LastFMRequest - def self.search query, limit = nil, page = nil - artist_request "search", "artistmatches", query, limit, page - end - - # return: artist name, tags, similar artists, artist bio (summary / long), mbid, image urls ( different sizes ) - def self.getInfo artist - artist_request "getInfo", nil, artist - end - - # return: artists ( name, mbid, image urls ( different sizes ) ) - def self.getSimilar artist, limit = nil - artist_request "getSimilar", "similarartists", artist, limit - end - - # return: tags ( name, tag´s last.fm-url ) ordered by popularity - def self.getTopTags artist - artist_request "getTopTags", "toptags", artist - end - - # return: tracks ( name, image urls ( different sizes ) ) ordered by popularity - def self.getTopTracks artist, limit = nil, page = nil - artist_request "getTopTracks", "toptracks", artist, limit, page - end - - # return: albums ( name, mbid, album url, image urls ( different sizes ) ) ordered by popularity - def self.getTopAlbums artist, limit = nil, page = nil - artist_request "getTopAlbums", "topalbums", artist, limit, page - end - - end - - - class Album < LastFMRequest - def self.search query, limit = nil, page = nil - album_request "search", "albummatches", query, nil, limit, page - end - - # return: album name, artist, (top)tags, tracks ( name, duration (in sec) ) mbid (album), release date, image urls ( different sizes ) - def self.getInfo album, artist - album_request "getInfo", nil, album, artist - end - - # return: tags ( name, tag´s last.fm-url ) ordered by popularity - def self.getTopTags album, artist - album_request "getTopTags", "toptags", album, artist - end - - end - - - class Track < LastFMRequest - def self.search query, limit = nil, page = nil - track_request "search", "trackmatches", query, nil, limit, page - end - - # return: track name, id, (top)tags, artist, duration (in msec), album ( artist, title, image urls ( different sizes) ), mbid - def self.getInfo track, artist - track_request "getInfo", nil, track, artist - end - - # return: tracks ( name, artist (name, mbid), duration (in msec), image urls (sometimes) ) - def self.getSimilar track, artist, limit = nil - track_request "getSimilar", "similartracks", track, artist, limit - end - - # return: tags ( name, tag´s last.fm-url ) ordered by popularity - def self.getTopTags track, artist - track_request "getTopTags", "toptags", track, artist - end - end - -end \ No newline at end of file diff --git a/lib/LastFM/LastFMRequest.rb b/lib/LastFM/LastFMRequest.rb index 32bd238..2e34199 100644 --- a/lib/LastFM/LastFMRequest.rb +++ b/lib/LastFM/LastFMRequest.rb @@ -2,56 +2,59 @@ require 'httparty' require 'active_support' require 'hashie' -class LastFMRequest - include HTTParty - - base_uri "ws.audioscrobbler.com/2.0/" - parser Proc.new { |data| Hashie::Mash.new(ActiveSupport::JSON.decode(data)) } - default_params :format => 'json', :autocorrect => '1' - debug_output $> - format :json +module LastFM - def self.api_key=(key) - @@api_key = key - default_params :api_key => key - end + class LastFMRequest + include HTTParty - def self.limit=(limit) - @limit = limit - end - - def self.limit - @limit - end - - def self.page=(page) - @page = page - end - - def self.page - @page - end - - def self.artist_request method, node, q, limit = nil, page = nil - prepare_result method, node, get('/', :query => { :method => "artist.#{method.to_s}", :artist => q, :limit => limit, :page => page }) - end - - def self.album_request method, node, q, artist = nil, limit = nil, page = nil - prepare_result method, node, get('/', :query => { :method => "album.#{method.to_s}", :album => q, :artist => artist, :limit => limit, :page => page }) - end - - def self.track_request method, node, q, artist = nil, limit = nil, page = nil - prepare_result method, node, get('/', :query => { :method => "track.#{method.to_s}", :track => q, :artist => artist, :limit => limit, :page => page }) - end - - private - - def self.prepare_result method, node, response_hash - if method.to_s == "search" - response_hash = response_hash.results + base_uri "ws.audioscrobbler.com/2.0/" + parser Proc.new { |data| Hashie::Mash.new(ActiveSupport::JSON.decode(data)) } + default_params :format => 'json', :autocorrect => '1' + debug_output $> + format :json + + def self.api_key=(key) + @@api_key = key + default_params :api_key => key end - response_hash.send(node.to_sym) + + def self.limit=(limit) + @limit = limit + end + + def self.limit + @limit + end + + def self.page=(page) + @page = page + end + + def self.page + @page + end + + def self.artist_request method, node, q, limit = nil, page = nil + prepare_result method, node, get('/', :query => { :method => "artist.#{method.to_s}", :artist => q, :limit => limit, :page => page }) + end + + def self.album_request method, node, q, artist = nil, limit = nil, page = nil + prepare_result method, node, get('/', :query => { :method => "album.#{method.to_s}", :album => q, :artist => artist, :limit => limit, :page => page }) + end + + def self.track_request method, node, q, artist = nil, limit = nil, page = nil + prepare_result method, node, get('/', :query => { :method => "track.#{method.to_s}", :track => q, :artist => artist, :limit => limit, :page => page }) + end + + private + + def self.prepare_result method, node, response_hash + if method.to_s == "search" + response_hash = response_hash.results + end + response_hash.send(node.to_sym) + end + end - -end - \ No newline at end of file + +end \ No newline at end of file diff --git a/lib/LastFM/Track.rb b/lib/LastFM/Track.rb new file mode 100644 index 0000000..430a9b8 --- /dev/null +++ b/lib/LastFM/Track.rb @@ -0,0 +1,24 @@ +module LastFM + + class Track < LastFMRequest + def self.search query, limit = nil, page = nil + track_request "search", "trackmatches", query, nil, limit, page + end + + # return: track name, id, (top)tags, artist, duration (in msec), album ( artist, title, image urls ( different sizes) ), mbid + def self.getInfo track, artist + track_request "getInfo", nil, track, artist + end + + # return: tracks ( name, artist (name, mbid), duration (in msec), image urls (sometimes) ) + def self.getSimilar track, artist, limit = nil + track_request "getSimilar", "similartracks", track, artist, limit + end + + # return: tags ( name, tag´s last.fm-url ) ordered by popularity + def self.getTopTags track, artist + track_request "getTopTags", "toptags", track, artist + end + end + +end \ No newline at end of file