module VoiceBase::V2::Client

Constants

BOUNDARY
MULTIPART_CONTENT_TYPE

Public Class Methods

extended(client, args = {}) click to toggle source
# File lib/voicebase/v2/client.rb, line 7
def self.extended(client, args = {})
  client.api_host     = client.args[:host] || ENV.fetch('VOICEBASE_V2_API_HOST', 'https://apis.voicebase.com')
  client.api_endpoint = client.args[:api_endpoint] || ENV.fetch('VOICEBASE_V2_API_ENDPOINT', '/v2-beta')
end

Public Instance Methods

authenticate!() click to toggle source
# File lib/voicebase/v2/client.rb, line 12
def authenticate!
  auth = {:username => @auth_key, :password => @auth_secret}
  response = VoiceBase::Response.new(
    self.class.get(
      uri + '/access/users/admin/tokens',
      basic_auth: auth,
      headers: {
        'User-Agent'   => @user_agent,
        'Accept'       => 'application/json'
      }
    ), api_version)
  @token = VoiceBase::Client::Token.new(response.tokens.any? && response.tokens.first.fetch("token"))
rescue NoMethodError => ex
  raise VoiceBase::AuthenticationError, response.status_message
end
delete_file(args = {}, headers = {}) click to toggle source
# File lib/voicebase/v2/client.rb, line 105
def delete_file(args = {}, headers = {})
  raise ArgumentError, "Missing argument :media_id" unless args[:media_id]
  url = uri + "/media/#{args[:media_id]}"

  response = self.class.delete(
      url,
      headers: default_headers(headers)
  )

  VoiceBase::Response.new(response, api_version)
end
get_json_transcript(args, headers) click to toggle source
# File lib/voicebase/v2/client.rb, line 62
def get_json_transcript(args, headers)
  raise ArgumentError, "Missing argument :media_id" unless args[:media_id]
  url = uri + "/media/#{args[:media_id]}"

  response = self.class.get(
      url,
      headers: default_headers(headers)
  )

  VoiceBase::Response.new(response, api_version)
end
get_media(args = {}, headers = {}) click to toggle source

I presume this method exists for parity with the V1 API however we are not using it

# File lib/voicebase/v2/client.rb, line 42
def get_media(args = {}, headers = {})
  raise ArgumentError, "Missing argument :media_id" unless args[:media_id]
  url = if args[:media_id]
    uri + "/media/#{args[:media_id]}"
  elsif args[:external_id]
    uri + "/media?externalID=#{args[:external_id]}"
  else
    raise ArgumentError, "Missing argument :media_url or :media_file"
  end
  if args[:external_id]
    uri + "/media?externalID=#{args[:external_id]}"
  else
    raise ArgumentError, "Missing argument :external_id"
  end

  VoiceBase::Response.new(self.class.get(
    url, headers: default_headers(headers)
  ), api_version)
end
get_media_progress(args = {}, headers = {}) click to toggle source

I presume this method exists for parity with the V1 API however we are not using it

# File lib/voicebase/v2/client.rb, line 97
def get_media_progress(args = {}, headers = {})
  raise ArgumentError, "Missing argument :media_id" unless args[:media_id]
  VoiceBase::Response.new(self.class.get(
    uri + "/media/#{args[:media_id]}/progress",
    headers: default_headers(headers)
  ), api_version)
end
get_text_transcript(args, headers) click to toggle source
# File lib/voicebase/v2/client.rb, line 74
def get_text_transcript(args, headers)
  raise ArgumentError, "Missing argument :media_id" unless args[:media_id]
  url = uri + "/media/#{args[:media_id]}/transcripts/latest"
  
  headers.merge!({ 'Accept' => 'text/plain' })

  response = self.class.get(
      url,
      headers: default_headers(headers)
  )

  response.parsed_response
end
get_transcript(args = {}, headers = {}) click to toggle source
# File lib/voicebase/v2/client.rb, line 88
def get_transcript(args = {}, headers = {})
  if args[:format] == "txt"
    get_text_transcript(args, headers)
  else
    get_json_transcript(args, headers)
  end
end
upload_media(args = {}, headers = {}) click to toggle source
# File lib/voicebase/v2/client.rb, line 28
def upload_media(args = {}, headers = {})
  media_url = require_media_file_or_url(args)
  form_args = form_args(media_url, args[:language]) # language codes: en-US (default), en-UK, en-AU
  form_args.merge! metadata(args[:external_id]) if args[:external_id]

  response = self.class.post(
      uri + '/media',
      headers: multipart_headers(headers),
      body: multipart_query(form_args)
  )
  VoiceBase::Response.new(response, api_version)
end

Private Instance Methods

blank?(value) click to toggle source
# File lib/voicebase/v2/client.rb, line 144
def blank?(value)
  value.nil? || value.empty?
end
default_headers(headers = {}) click to toggle source
# File lib/voicebase/v2/client.rb, line 148
def default_headers(headers = {})
  authenticate! unless token
  headers = {
      'Authorization' => "Bearer #{token.token}",
      'User-Agent' => user_agent
  }.reject { |k, v| blank?(v) }.merge(headers)
  puts "> headers\n> #{headers}" if debug
  headers
end
form_args(media_url, language = nil) click to toggle source
# File lib/voicebase/v2/client.rb, line 119
def form_args(media_url, language = nil)
  args = {
    'media' => media_url,
    'configuration' => {
      'configuration' => {
        'executor' => 'v2'
      }
    }
  }
  args['configuration']['configuration'].merge!({'language' => language}) if language
  args
end
metadata(external_id) click to toggle source
# File lib/voicebase/v2/client.rb, line 132
def metadata(external_id)
  {
    'metadata' => {
      'metadata' => {
        'external' => {
          'id' => "#{external_id}"
        }
      }
    }
  }
end
multipart_headers(headers = {}) click to toggle source
# File lib/voicebase/v2/client.rb, line 158
def multipart_headers(headers = {})
  default_headers(headers.merge({'Content-Type' => MULTIPART_CONTENT_TYPE}))
end
multipart_query(params) click to toggle source
# File lib/voicebase/v2/client.rb, line 162
def multipart_query(params)
  fp = []

  params.each do |k, v|
    if v.respond_to?(:path) and v.respond_to?(:read) then
      fp.push(FileParam.new(k, v.path, v.read))
    elsif v.is_a?(Hash)
      fp.push(HashParam.new(k, v))
    else
      fp.push(StringParam.new(k, v))
    end
  end

  query = fp.map {|p| "--" + BOUNDARY + "\r\n" + p.to_multipart }.join("") + "--" + BOUNDARY + "--"
  puts "> multipart-query\n> #{query}" if debug
  query
end
require_media_file_or_url(args = {}) click to toggle source
# File lib/voicebase/v2/client.rb, line 180
def require_media_file_or_url(args = {})
  media = if args[:media_url]
    args[:media_url]
  elsif args[:media_file]
    args[:media_file]
  else
    raise ArgumentError, "Missing argument :media_url or :media_file"
  end
end