Class: Diffux::Snapshotter

Inherits:
Object
  • Object
show all
Defined in:
lib/diffux_core/snapshotter.rb

Overview

Snapshotter is responsible for delegating to PhantomJS to take the snapshot for a given URL and viewoprt, and then saving that snapshot to a file and storing any metadata on the Snapshot object.

Constant Summary collapse

SCRIPT_PATH =
File.join(File.dirname(__FILE__),
'script/take-snapshot.js').to_s

Instance Method Summary collapse

Constructor Details

#initialize(url: raise, viewport_width: raise, outfile: raise, user_agent: nil, crop_selector: nil) ⇒ Snapshotter

Returns a new instance of Snapshotter.

Parameters:

  • url (String) (defaults to: raise)

    the URL to snapshot

  • viewport_width (Integer) (defaults to: raise)

    the width of the screen used when snapshotting

  • outfile (File) (defaults to: raise)

    where to store the snapshot PNG.

  • user_agent (String) (defaults to: nil)

    an optional useragent string to used when requesting the page.

  • crop_selector (String) (defaults to: nil)

    an optional string containing a CSS selector. If this is present, and the page contains something matching it, the resulting snapshot image will only contain that element. If the page contains multiple elements mathing the selector, only the first element will be used.



25
26
27
28
29
30
31
32
33
# File 'lib/diffux_core/snapshotter.rb', line 25

def initialize(url:     raise, viewport_width: raise,
               outfile: raise, user_agent: nil,
               crop_selector: nil)
  @viewport_width = viewport_width
  @crop_selector  = crop_selector
  @user_agent     = user_agent
  @outfile        = outfile
  @url            = url
end

Instance Method Details

#take_snapshot!Hash

Takes a snapshot of the URL and saves it in the outfile as a PNG image.

Returns:

  • (Hash)

    a hash containing the following keys: title [String] the <title> of the page being snapshotted log [String] a log of events happened during the snapshotting process



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/diffux_core/snapshotter.rb', line 40

def take_snapshot!
  result = {}
  opts = {
    address: @url,
    outfile: @outfile,
    cropSelector: @crop_selector,
    viewportSize: {
      width:  @viewport_width,
      height: @viewport_width,
    },
  }
  opts[:userAgent] = @user_agent if @user_agent

  run_phantomjs(opts) do |line|
    begin
      result = JSON.parse line, symbolize_names: true
    rescue JSON::ParserError
      # We only expect a single line of JSON to be output by our snapshot
      # script. If something else is happening, it is likely a JavaScript
      # error on the page and we should just forget about it and move on
      # with our lives.
    end
  end
  result
end