class AlexaRuby::AudioPlayer

AudioPlayer class encapsulates all Alexa audio player directives

Public Instance Methods

clear_queue(behavior = :clear_all) click to toggle source

Build AudioPlayer.ClearQueue directive

@param behavior [Symbol] clearing behavior @return [Hash] AudioPlayer.ClearQueue directive

# File lib/alexa_ruby/response/audio_player.rb, line 34
def clear_queue(behavior = :clear_all)
  clear_behavior =
    case behavior
    when :clear_all
      'CLEAR_ALL'
    when :clear_queue
      'CLEAR_ENQUEUED'
    else
      'CLEAR_ALL'
    end
  { type: 'AudioPlayer.ClearQueue', clearBehavior: clear_behavior }
end
play(params) click to toggle source

Build an AudioPlayer.Play directive

@param params [Hash] optional request parameters:

behavior [Symbol] playback behavior
url [String] streaming URL
token [String] streaming service token
previous_token [String] previous played audio token
offset [Integer] playback offset

@return [Hash] AudioPlayer.Play directive @raise [ArgumentError] if audio URL isn't valid

# File lib/alexa_ruby/response/audio_player.rb, line 14
def play(params)
  @opts = params
  if invalid_url?(@opts[:url])
    raise ArgumentError, 'Audio URL must be a valid ' \
                          'SSL-enabled (HTTPS) endpoint'
  end
  play_directive
end
stop() click to toggle source

Build AudioPlayer.Stop directive

@return [Hash] AudioPlayer.Stop directive

# File lib/alexa_ruby/response/audio_player.rb, line 26
def stop
  { type: 'AudioPlayer.Stop' }
end

Private Instance Methods

invalid_url?(url) click to toggle source

Check if given URL isn't an SSL-enabled endpoint

@param url [String] some URL @return [Boolean]

# File lib/alexa_ruby/response/audio_player.rb, line 86
def invalid_url?(url)
  Addressable::URI.parse(url).scheme != 'https'
end
play_directive() click to toggle source

Build play directive

@return [Hash] ready to use AudioPlayer.Play directive

# File lib/alexa_ruby/response/audio_player.rb, line 69
def play_directive
  directive = { type: 'AudioPlayer.Play' }
  directive[:playBehavior] = playback_behavior(@opts[:play_behavior])
  directive[:audioItem] = { stream: { url: @opts[:url] } }
  stream = directive[:audioItem][:stream]
  stream[:token] = token(@opts[:token])
  stream[:offsetInMilliseconds] = @opts[:offset] || 0
  if directive[:playBehavior] == 'ENQUEUE'
    stream[:expectedPreviousToken] = @opts[:previous_token] || ''
  end
  directive
end
playback_behavior(behavior) click to toggle source

Define playback behavior

@param behavior [Symbol] playback behavior @return [String] Amazon behavior type

# File lib/alexa_ruby/response/audio_player.rb, line 53
def playback_behavior(behavior)
  case behavior
  when :replace_all
    'REPLACE_ALL'
  when :enqueue
    'ENQUEUE'
  when :replace_enqueued
    'REPLACE_ENQUEUED'
  else
    'REPLACE_ALL'
  end
end
token(token) click to toggle source

Get station token

@param token [String] station token @return [Boolean]

# File lib/alexa_ruby/response/audio_player.rb, line 94
def token(token)
  token.nil? || token.empty? ? SecureRandom.uuid : token
end