Class: Faceapp::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/faceapp/client.rb

Constant Summary collapse

DEFAULT_API_HOST =
'https://node-01.faceapp.io'.freeze
DEFAULT_USER_AGENT =
'FaceApp/1.0.229 (Linux; Android 4.4)'.freeze
DEVICE_ID_LENGTH =
8
DEVICE_ID_LETTERS =
('a'..'z').to_a.freeze
KNOWN_FACEAPP_ERRORS =
{
  'bad_filter_id' => 'Unknown filter'
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Client

Returns a new instance of Client.



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/faceapp/client.rb', line 21

def initialize(options = {})
  @options = options

  options[:api_host]    ||= DEFAULT_API_HOST
  options[:user_agent]  ||= DEFAULT_USER_AGENT
  options[:device_id]   ||= generate_device_id

  options[:headers] = {
    'User-Agent' => options[:user_agent],
    'X-FaceApp-DeviceID' => options[:device_id]
  }.merge!(options[:headers] || {})
end

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



19
20
21
# File 'lib/faceapp/client.rb', line 19

def options
  @options
end

Instance Method Details

#apply_filter(photo_code, filter, io = nil, &block) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/faceapp/client.rb', line 61

def apply_filter(photo_code, filter, io = nil, &block)
  cropped = options.fetch(:cropped, true) ? 1 : 0

  url = "/api/v2.3/photos/#{photo_code}/filters/#{filter}?cropped=#{cropped}"

  request = Net::HTTP::Get.new(url, options[:headers])

  dest = io ? io : StringIO.new

  http.request(request) do |response|
    unless response.is_a?(Net::HTTPSuccess)
      error_code =
        if response['x-faceapp-errorcode']
          response['x-faceapp-errorcode']
        elsif response.code == '404'
          'bad_photo_code'
        else
          'unknown_error'
        end

      error_message = KNOWN_FACEAPP_ERRORS.fetch(error_code, error_code)
      error_message = format(error_message, photo_code, filter)

      raise Faceapp::RequestError, error_message
    end

    dest = handler_filter_response(response, dest, &block)
  end

  dest.rewind if !io && !block_given?

  dest
end

#upload_photo(photo) ⇒ Object



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
# File 'lib/faceapp/client.rb', line 34

def upload_photo(photo)
  photo_io = UploadIO.new(photo, 'image/jpeg', 'image.jpg')

  request =
    Net::HTTP::Post::Multipart.new '/api/v2.3/photos',
                                   { 'file' => photo_io },
                                   options[:headers]

  response = http.request(request)

  body = JSON.parse(response.body)

  unless response.is_a?(Net::HTTPSuccess)
    if body.is_a?(Hash) && body['err']
      error = body['err']

      error_message = "(#{error['code']}) #{error['desc']}"
    else
      error_message = response.body.to_s
    end

    raise Faceapp::RequestError, error_message
  end

  body['code']
end