class Flickxtractr::Extractr

Attributes

url[R]

Public Class Methods

new(url) click to toggle source
# File lib/flickxtractr/extractr.rb, line 13
def initialize(url)
  @url = url

  initialize_capybara!
end

Private Class Methods

bitly_client() click to toggle source
# File lib/flickxtractr/extractr.rb, line 127
def self.bitly_client
  @_bitly_client ||= begin
    Bitly.use_api_version_3

    Bitly.configure do |config|
      config.api_version  = 3
      config.access_token = Flickxtractr.dotfile.bitly_access_token
    end

    Bitly.client
  end
end

Public Instance Methods

generate_image!() click to toggle source
# File lib/flickxtractr/extractr.rb, line 19
def generate_image!
  generate_page_screenshot!

  image_file = generate_image_file!
  apply_meta_from_extract!(image_file)
end
generated_image_file_name() click to toggle source
# File lib/flickxtractr/extractr.rb, line 35
def generated_image_file_name
  "#{Date.today.strftime("%Y%m%d")}_#{generated_image_slug}"
end
generated_image_file_name_with_extension() click to toggle source
# File lib/flickxtractr/extractr.rb, line 39
def generated_image_file_name_with_extension
  "#{generated_image_file_name}.#{page_image_uri.path.match(/\.(.+?)\z/)[1]}"
end
generated_image_slug() click to toggle source
# File lib/flickxtractr/extractr.rb, line 47
def generated_image_slug
  page_image_title.gsub(/\W+/, '-').downcase.gsub(/\A-|-\Z/, '')
end
generated_screenshot_file_name() click to toggle source
# File lib/flickxtractr/extractr.rb, line 43
def generated_screenshot_file_name
  "#{generated_image_file_name}_screenshot.png"
end
page_image_description() click to toggle source
# File lib/flickxtractr/extractr.rb, line 55
def page_image_description
  all(:css, "h2.photo-desc p").collect(&:text).join("\n")
end
page_image_keywords() click to toggle source
# File lib/flickxtractr/extractr.rb, line 59
def page_image_keywords
  tag_links = all(:css, "ul.tags-list li a")
  tag_links.collect { |a| a[:title] unless a.has_selector?(".remove-tag") }.compact.join("; ")
end
page_image_title() click to toggle source
# File lib/flickxtractr/extractr.rb, line 51
def page_image_title
  find(:css, "h1.photo-title").text
end
page_image_uri() click to toggle source
# File lib/flickxtractr/extractr.rb, line 26
def page_image_uri
  @_page_image_uri ||= begin
    find(:css, "div.download a").click
    within("div.download-dialog-tooltip ul.sizes") do
      URI(find(:xpath, "./li[@class='Original']/a")[:href])
    end
  end
end
page_owner_name() click to toggle source
# File lib/flickxtractr/extractr.rb, line 64
def page_owner_name
  find(:css, "div.attribution-info a.owner-name.truncate").text
end
page_owner_profile() click to toggle source
# File lib/flickxtractr/extractr.rb, line 68
def page_owner_profile
  "https://www.flickr.com#{find(:css, "div.attribution-info a.owner-name.truncate")[:href]}"
end

Private Instance Methods

apply_meta_from_extract!(image_file) click to toggle source
# File lib/flickxtractr/extractr.rb, line 100
def apply_meta_from_extract!(image_file)
  MiniExiftool.new(image_file.path).tap do |rmi|
    image_meta.each { |k, v| rmi[k] = v }
    rmi.save!
  end
end
generate_image_file!() click to toggle source
# File lib/flickxtractr/extractr.rb, line 80
def generate_image_file!
  File.open(File.join(Flickxtractr.dotfile.output_dir, generated_image_file_name_with_extension), "wb").tap do |f|
    Net::HTTP.start(page_image_uri.host) do |http|
      begin
        http.request_get(page_image_uri.path) do |resp|
          resp.read_body do |segment|
            f.write(segment)
          end
        end
      ensure
        f.close
      end
    end
  end
end
generate_page_screenshot!() click to toggle source
# File lib/flickxtractr/extractr.rb, line 96
def generate_page_screenshot!
  page.save_screenshot(File.join(Flickxtractr.dotfile.screenshot_dir, generated_screenshot_file_name), full: true)
end
image_meta() click to toggle source
# File lib/flickxtractr/extractr.rb, line 107
def image_meta
  {
    "Headline"     => page_image_title,
    "Description"  => page_image_description,
    "Keywords"     => page_image_keywords,
    "Credit"       => page_owner_name,
    "Credit Line"  => page_owner_name,
    "Source"       => shortened_url_for(url).short_url,
    "Instructions" => shortened_url_for(public_screenshot_url).short_url,
  }
end
initialize_capybara!() click to toggle source
# File lib/flickxtractr/extractr.rb, line 74
def initialize_capybara!
  Capybara.current_driver = :poltergeist
  Capybara.javascript_driver = :poltergeist
  visit(url)
end
public_screenshot_url() click to toggle source
# File lib/flickxtractr/extractr.rb, line 119
def public_screenshot_url
  "#{Flickxtractr.dotfile.screenshot_public_url_prefix}/#{generated_screenshot_file_name}"
end
shortened_url_for(url_to_shorten) click to toggle source
# File lib/flickxtractr/extractr.rb, line 123
def shortened_url_for(url_to_shorten)
  self.class.bitly_client.shorten(url_to_shorten)
end