diff --git a/Gemfile b/Gemfile
index f686871..fe2b0cd 100644
--- a/Gemfile
+++ b/Gemfile
@@ -7,3 +7,5 @@ gem 'pg'
gem 'awesome_print', :require => 'ap'
gem 'delayed_job'
+
+gem 'lastfm', :git => 'git://github.com/magnolia-fan/ruby-lastfm.git'
diff --git a/Gemfile.lock b/Gemfile.lock
index af5cf1a..55485c2 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,3 +1,12 @@
+GIT
+ remote: git://github.com/magnolia-fan/ruby-lastfm.git
+ revision: 1c82d5616c99689162afa8df854d16ebaa604e23
+ specs:
+ lastfm (0.2.0)
+ activesupport
+ httparty
+ xml-simple
+
GEM
remote: http://rubygems.org/
specs:
@@ -31,12 +40,15 @@ GEM
arel (2.0.10)
awesome_print (0.4.0)
builder (2.1.2)
+ crack (0.1.8)
daemons (1.1.4)
delayed_job (2.1.4)
activesupport (~> 3.0)
daemons
erubis (2.6.6)
abstract (>= 1.0.0)
+ httparty (0.7.8)
+ crack (= 0.1.8)
i18n (0.5.0)
mail (2.2.19)
activesupport (>= 2.3.6)
@@ -70,6 +82,7 @@ GEM
treetop (1.4.9)
polyglot (>= 0.3.1)
tzinfo (0.3.27)
+ xml-simple (1.1.0)
PLATFORMS
ruby
@@ -77,6 +90,7 @@ PLATFORMS
DEPENDENCIES
awesome_print
delayed_job
+ lastfm!
pg
rails (= 3.0.8)
sqlite3
diff --git a/app/controllers/last_fm_controller.rb b/app/controllers/last_fm_controller.rb
index b1b8ff0..721a653 100644
--- a/app/controllers/last_fm_controller.rb
+++ b/app/controllers/last_fm_controller.rb
@@ -1,4 +1,5 @@
require 'open-uri'
+require 'lastfm'
class LastFmController < ApplicationController
@@ -9,7 +10,10 @@ class LastFmController < ApplicationController
unless params[:sid].nil? or params[:token].nil?
session = Session.find_by_key(params[:sid])
unless session.nil?
- session.user.lastfm_token = params[:token]
+ lastfm = Lastfm.new(@@api_key, @@secret)
+ lastfm.session = lastfm.auth.get_session(params[:token])
+ session.user.lastfm_key = lastfm.session['key']
+ session.user.lastfm_username = lastfm.session['name']
session.user.save
render :text => ''
else
@@ -21,52 +25,45 @@ class LastFmController < ApplicationController
end
def getinfo
- #return unless authorized?
+ return unless authorized?
@res = {}
- user = User.find_by_vkid(1217744)#params[:mid])
- @res[:connected] = false
- @res[:lastfm_login_url] = 'http://www.last.fm/api/auth?api_key='+ @@api_key +'&cb=http://localhost/lastfm/connect/?sid='+ user.session.key
-
- unless user.lastfm_token.nil?
- lastfm_response = auth_query({:method => 'auth.getSession', :token => user.lastfm_token})
- render :json => lastfm_response
- return
- if lastfm_response
- user.lastfm_token = lastfm_response[1]
- user.save
- @res[:connected] = true
- @res[:username] = lastfm_response[0];
- end
- end
-
- render :json => @res
- end
-
- private
-
- def auth_query params
- url = 'http://ws.audioscrobbler.com/2.0/?'
- params[:api_key] = @@api_key
- params.each do |k, v|
- url << k.to_s << '=' << v << '&'
- end
- url << 'api_sig=' << get_signature(params)
- begin
- open(url).read.match(/(.*?)<\/name>.*?(.*?)<\/key>/m)
- rescue
- false
+ user = User.find_by_vkid(params[:mid])
+ unless user.lastfm_key.nil?
+ render :json => {
+ :connected => true,
+ :username => user.lastfm_username
+ }
+ else
+ render :json => {
+ :connected => false,
+ :lastfm_login_url => 'http://www.last.fm/api/auth?api_key='+ @@api_key +'&cb=http://localhost/lastfm/connect/?sid='+ user.session.key
+ }
end
end
- def get_signature params
- params = params.to_a.sort! { |a, b| a[0] <=> b[0] }
- params = Hash[params]
- str = '';
- params.each do |k, v|
- str << k.to_s << v
- end
- Digest::MD5.hexdigest(str + @@secret)
+ def listening
+ return unless authorized?
+ return if params[:artist].nil? or params[:track].nil?
+
+ user = User.find_by_vkid(params[:mid])
+ return unless user.lastfm_key.nil?
+
+ lastfm = Lastfm.new(@@api_key, @@secret)
+ lastfm.session = user.lastfm_key
+ lastfm.update_now_playing(params[:artist], params[:track])
+ end
+
+ def scrobble
+ return unless authorized?
+ return if params[:artist].nil? or params[:track].nil?
+
+ user = User.find_by_vkid(params[:mid])
+ return unless user.lastfm_key.nil?
+
+ lastfm = Lastfm.new(@@api_key, @@secret)
+ lastfm.session = user.lastfm_key
+ lastfm.scrobble(params[:artist], params[:track])
end
end
diff --git a/config/routes.rb b/config/routes.rb
index 59d625a..614cb29 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -59,9 +59,10 @@ Beathaven::Application.routes.draw do
match 'user/auth' => 'user#auth'
match 'user/update' => 'user#update'
- match 'lastfm/login' => 'last_fm#login'
match 'lastfm/connect' => 'last_fm#connect'
match 'lastfm/getinfo' => 'last_fm#getinfo'
+ match 'lastfm/listening' => 'last_fm#listening'
+ match 'lastfm/scrobble' => 'last_fm#scrobble'
match 'artist/autocomplete' => 'artist#autocomplete'
match 'artist/(:name)/' => 'artist#data', :constraints => { :name => /[^\/]*/ }
diff --git a/db/migrate/20110622204123_add_lastfm_username_to_users.rb b/db/migrate/20110622204123_add_lastfm_username_to_users.rb
new file mode 100644
index 0000000..d4a52e2
--- /dev/null
+++ b/db/migrate/20110622204123_add_lastfm_username_to_users.rb
@@ -0,0 +1,11 @@
+class AddLastfmUsernameToUsers < ActiveRecord::Migration
+ def self.up
+ add_column :users, :lastfm_username, :string
+ rename_column :users, :lastfm_token, :lastfm_key
+ end
+
+ def self.down
+ rename_column :users, :lastfm_key, :lastfm_token
+ remove_column :users, :lastfm_username
+ end
+end
\ No newline at end of file
diff --git a/db/schema.rb b/db/schema.rb
index 2ceffd9..5968335 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20110622053238) do
+ActiveRecord::Schema.define(:version => 20110622204123) do
create_table "albums", :force => true do |t|
t.string "name"
@@ -98,7 +98,8 @@ ActiveRecord::Schema.define(:version => 20110622053238) do
t.integer "vkid"
t.datetime "created_at"
t.datetime "updated_at"
- t.string "lastfm_token"
+ t.string "lastfm_key"
+ t.string "lastfm_username"
end
end
diff --git a/public/javascripts/beathaven/pages.js b/public/javascripts/beathaven/pages.js
index 3062056..8b8477a 100644
--- a/public/javascripts/beathaven/pages.js
+++ b/public/javascripts/beathaven/pages.js
@@ -69,7 +69,7 @@ var Pages = {
.height(($('#data-container').height() - $('#search_form').height()) / 2);
setTimeout(function(){
- $('#search_field').autocomplete({
+ $('#search_field').bh_autocomplete({
serviceUrl: '/artist/autocomplete', // Страница для обработки запросов автозаполнения
minChars: 2, // Минимальная длина запроса для срабатывания автозаполнения
delimiter: /(,|;)\s*/, // Разделитель для нескольких запросов, символ или регулярное выражение
diff --git a/public/javascripts/beathaven/settings.js b/public/javascripts/beathaven/settings.js
index ea66075..ac22a93 100644
--- a/public/javascripts/beathaven/settings.js
+++ b/public/javascripts/beathaven/settings.js
@@ -33,8 +33,11 @@ $('.settings-container .tabs .tab').live('click', function(){
}
if ($(this).attr('data-fieldset') == 'lastfm') {
Session.query('/lastfm/getinfo', {}, function(data){
- console.log(data);
- Settings.lastfm_login_url = data.lastfm_login_url;
+ if (data.connected) {
+ $('.form-container input[name$="username"]').first().val(data.username);
+ } else {
+ Settings.lastfm_login_url = data.lastfm_login_url;
+ }
})
}
});
diff --git a/public/javascripts/jquery/jquery.autocomplete.js b/public/javascripts/jquery/jquery.autocomplete.js
index b6fc403..4c81a45 100644
--- a/public/javascripts/jquery/jquery.autocomplete.js
+++ b/public/javascripts/jquery/jquery.autocomplete.js
@@ -50,7 +50,7 @@
this.setOptions(options);
}
- $.fn.autocomplete = function(options) {
+ $.fn.bh_autocomplete = function(options) {
return new Autocomplete(this.get(0)||$(''), options);
};