class NwmlsClient::Image

Constants

IMAGE_SCHEMA

Public Class Methods

new(config, image_destination = nil) click to toggle source
# File lib/nwmls_client/image.rb, line 10
def initialize(config, image_destination = nil)
  @listing_number = nil
  @image_destination = image_destination
  raise "Configuration data is required for authentication" if config.nil?
  @user_id = config.fetch("user_id")
  @password = config.fetch("password")      
end

Public Instance Methods

retrieve_images(listing_number) click to toggle source
# File lib/nwmls_client/image.rb, line 18
def retrieve_images(listing_number)

  @listing_number = listing_number

  request = { 'query' => build_request()}

  @client = create_client()
  response = @client.call(:retrieve_images, message: request)

  cdata = response.body[:retrieve_images_response][:retrieve_images_result] 
  nori_options = { :convert_tags_to => lambda { |tag| tag.snakecase.to_sym } }
  result = Nori.new(nori_options).parse(cdata)

  images_data = result[:results][:images]

  raise "No images found:\n#{result}" if images_data.nil?

  if @image_destination.nil?
    image_folder = File.join(Dir.pwd, "images")
    if not Dir.exist?(image_folder)
      Dir.mkdir(image_folder)
    end

    dirpath = File.join(Dir.pwd, "images/#{@listing_number}")
    if not Dir.exist?(dirpath)
      Dir.mkdir(dirpath)
    end
  else
    dirpath = File.join(@image_destination, "/#{@listing_number}")
    if not Dir.exist?(dirpath)
      Dir.mkdir(dirpath)
    end
  end

  image_data = images_data[:image]
  if image_data.is_a?(Array)
    image_data.each do |image|

      filename = File.join(dirpath, "#{@listing_number}_#{image[:image_order]}.jpg")
      File.open(filename, 'wb') do |f|
        f.write(Base64.decode64(image[:blob]))
      end
    end
  else
    image = image_data

    begin
      filename = File.join(dirpath, "#{@listing_number}_#{image[:image_order]}.jpg")
      File.open(filename, 'wb') do |f|
        f.write(Base64.decode64(image[:blob]))
      end          
    rescue Exception => e
      puts "Image retrieval error:  #{e.message}"
    end 
  end

end

Private Instance Methods

build_request() click to toggle source
# File lib/nwmls_client/image.rb, line 91
def build_request()

  xm = Builder::XmlMarkup.new

  # Generate query to obtain actual images of specified property
  xm.instruct! :xml, :version=>"1.0"
  xm.ImageQuery(:xmlns => "NWMLS:EverNet:ImageQuery:1.0") {
    xm.Auth {
      xm.UserId @user_id
      xm.Password @password
    }
    xm.Query {
      xm.ByListingNumber @listing_number
    }
    xm.Results {
      xm.Schema IMAGE_SCHEMA
    }
  }

end
create_client() click to toggle source
# File lib/nwmls_client/image.rb, line 79
def create_client()

  @client = Savon.client(
    wsdl: "http://images.idx.nwmls.com/imageservice/imagequery.asmx?wsdl"
    #log_level: :debug, # can be: :debug, warn, :error, :fatal, :info
    #log: true,
    #open_timeout: 10,
    #read_timeout: 60
    )

end