public
Description: Scrobble Vinyl by packet sniffing iPhone shazam requests
Homepage: http://skillsmatter.com/podcast/ruby-on-rails/packet-sniffing
Clone URL: git://github.com/james/captor.git
captor / lastfm.rb
100644 71 lines (59 sloc) 2.203 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
require 'yaml'
config = YAML::load(File.read('config.yml'))
 
require 'net/http'
require 'digest/md5'
require 'uri'
 
APIKEY = config["lastfm"]["apikey"]
SECRET = config["lastfm"]["secret"]
 
def call_last_fm(parameters={})
  parameters["api_key"] = APIKEY
  # puts parameters.inspect
  ordered_parameters = parameters.keys.sort
  # puts ordered_parameters
  concatenated_parameters = ordered_parameters.inject(""){|memo, p| memo + p.to_s + parameters[p]}
  # puts concatenated_parameters
  parameters['api_sig'] = Digest::MD5.hexdigest(concatenated_parameters + SECRET)
  
  url_parameters = parameters.map{|k,v| "#{k}=#{v}"}.join('&')
  
  response = Net::HTTP.get_response('ws.audioscrobbler.com', "/2.0/?#{url_parameters}")
  response.body
end
 
def get_xml_tag(tagname, body)
  r = Regexp.new("<#{tagname}>(.+)<\/#{tagname}>")
  body.match(r)[1]
end
 
unless config["lastfmlogin"] && (username = config["lastfmlogin"]["username"]) && key = (config["lastfmlogin"]["key"])
  request_token = get_xml_tag("token", call_last_fm("method" => "auth.gettoken"))
  
  puts "Please visit:"
  puts "http://www.last.fm/api/auth?api_key=#{APIKEY}&token=#{request_token}"
  line = gets
  
  response = call_last_fm("method" => "auth.getsession", "token" => request_token)
  
  key = get_xml_tag('key', response)
  username = get_xml_tag('name', response)
  puts "LASTFM USER KEY: #{key}"
end
 
# handshake
timestamp = Time.now.utc.to_i.to_s
authentication_token = Digest::MD5.hexdigest(SECRET + timestamp)
querystring = "/?hs=true&p=1.2.1&c=tst&v=1.0&u=#{username}&t=#{timestamp}&a=#{authentication_token}&api_key=#{APIKEY}&sk=#{key}"
response = Net::HTTP.get_response('post.audioscrobbler.com', querystring)
responses = response.body.split("\n")
# puts responses.inspect
@scrobble_session_id = responses[1]
@submission_url = responses[3]
# print responses.inspect
# submission
def submit(artist,title)
  response = Net::HTTP.post_form(URI.parse(@submission_url), {
    's' => @scrobble_session_id,
    'a[0]' => artist,
    't[0]' => title,
    'i[0]' => Time.now.utc.to_i.to_s,
    'o[0]' => 'U',
    'r[0]' => '',
    'l[0]' => '',
    'b[0]' => '',
    'n[0]' => '',
    'm[0]' => ''
  })
  puts response.body
end