Class: Segue::Scrobbler

Inherits:
Object
  • Object
show all
Defined in:
lib/segue/scrobbler.rb

Defined Under Namespace

Classes: SessionError, SubmissionError

Constant Summary collapse

SCROBBLER_URL =
"http://ws.audioscrobbler.com/2.0/"
REQUIRED =
%i[api_key secret user].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(api_key, secret, user, session_key = nil) ⇒ Scrobbler

Returns a new instance of Scrobbler.



58
59
60
61
62
63
# File 'lib/segue/scrobbler.rb', line 58

def initialize(api_key, secret, user, session_key = nil)
  @api_key     = api_key
  @secret      = secret
  @user        = user
  @session_key = session_key
end

Instance Attribute Details

#api_keyObject (readonly)

Returns the value of attribute api_key.



65
66
67
# File 'lib/segue/scrobbler.rb', line 65

def api_key
  @api_key
end

#secretObject (readonly)

Returns the value of attribute secret.



65
66
67
# File 'lib/segue/scrobbler.rb', line 65

def secret
  @secret
end

#userObject (readonly)

Returns the value of attribute user.



65
66
67
# File 'lib/segue/scrobbler.rb', line 65

def user
  @user
end

Class Method Details

.ask(prompt) ⇒ Object



20
21
22
23
# File 'lib/segue/scrobbler.rb', line 20

def self.ask(prompt)
  puts prompt
  gets.chomp.strip
end

.authorise(scrobbler) ⇒ Object



49
50
51
52
53
54
55
56
# File 'lib/segue/scrobbler.rb', line 49

def self.authorise(scrobbler)
  scrobbler.fetch_session_key do |url|
    puts "A browser will now launch to allow to authorise this application to access your lastfm account"
    `open '#{url}'`
    puts "Press enter when you have authorised the application"
    gets
  end
end

.blank?(attribute) ⇒ Boolean

Returns:

  • (Boolean)


27
28
29
# File 'lib/segue/scrobbler.rb', line 27

def self.blank?(attribute)
  (attribute || "").empty?
end

.loadObject



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/segue/scrobbler.rb', line 31

def self.load
  conf = Segue::Settings.new("~/.lastfm.yml")
  prompt_for_credentials(conf)
  return nil if REQUIRED.any? { |key| blank?(conf[key]) }

  scrobbler = new(conf[:api_key], conf[:secret], conf[:user], conf[:session])
  conf[:session] ||= authorise(scrobbler)
  return nil if blank?(conf[:session])

  scrobbler
end

.prompt_for_credentials(conf) ⇒ Object



43
44
45
46
47
# File 'lib/segue/scrobbler.rb', line 43

def self.prompt_for_credentials(conf)
  conf[:api_key] = ask("What is the api key? ") if blank?(conf[:api_key])
  conf[:secret] = ask("What is the secret? ") if blank?(conf[:secret])
  conf[:user] = ask("What is your lastfm username? ") if blank?(conf[:user])
end

Instance Method Details

#fetch_session_key {|"http://www.last.fm/api/auth/?api_key=#{api_key}&token=#{request_token}"| ... } ⇒ Object

Yields:

  • ("http://www.last.fm/api/auth/?api_key=#{api_key}&token=#{request_token}")

Raises:



71
72
73
74
75
76
77
78
79
80
# File 'lib/segue/scrobbler.rb', line 71

def fetch_session_key
  doc = lfm :get, "auth.gettoken"
  request_token = doc.root.elements["token"].text
  yield "http://www.last.fm/api/auth/?api_key=#{api_key}&token=#{request_token}"
  doc = lfm :get, "auth.getsession", token: request_token
  status = doc.root.attributes["status"]
  raise SubmissionError, status unless status == "ok"

  @session_key = doc.root.elements["session"].elements["key"].text
end

#love(artist, title, params = {}) ⇒ Object



97
98
99
# File 'lib/segue/scrobbler.rb', line 97

def love(artist, title, params = {})
  lfm_track "track.love", artist, title, params
end

#now_playing(artist, title, params = {}) ⇒ Object



92
93
94
# File 'lib/segue/scrobbler.rb', line 92

def now_playing(artist, title, params = {})
  lfm_track "track.updateNowPlaying", artist, title, params
end

#scrobble(artist, title, params = {}) ⇒ Object



87
88
89
# File 'lib/segue/scrobbler.rb', line 87

def scrobble(artist, title, params = {})
  lfm_track "track.scrobble", artist, title, params
end

#session_keyObject



67
68
69
# File 'lib/segue/scrobbler.rb', line 67

def session_key
  @session_key or raise SessionError, "The session key must be set or fetched"
end

#with_profile_url {|"http://www.last.fm/user/#{user}"| ... } ⇒ Object

Yields:



82
83
84
# File 'lib/segue/scrobbler.rb', line 82

def with_profile_url
  yield "http://www.last.fm/user/#{user}" if user
end