new image screenshot system for #194

This commit is contained in:
Kyle Drake 2015-11-15 03:22:13 -08:00
parent 06778925e0
commit df917f3791
3 changed files with 93 additions and 60 deletions

View file

@ -16,7 +16,7 @@ gem 'google-api-client', require: 'google/api_client'
gem 'tilt'
gem 'erubis'
gem 'stripe', '1.15.0' #, source: 'https://code.stripe.com/'
gem 'screencap', '~> 0.1.4'
#gem 'screencap', '~> 0.1.4'
gem 'cocaine'
gem 'zipruby'
gem 'sass', require: nil
@ -38,7 +38,7 @@ platform :mri, :rbx do
gem 'pg'
gem 'sequel_pg', require: nil
gem 'hiredis'
gem 'rainbows', require: nil
gem 'posix-spawn'
group :development, :test do
gem 'pry'

View file

@ -0,0 +1,56 @@
var page = require('webpage').create()
var system = require('system')
var maxTimeout = 15000
if (system.args.length === 1) {
console.log('required args: <siteURL> <outputFilePath>');
phantom.exit(1)
}
var address = system.args[1]
var outputPath = system.args[2]
page.viewportSize = { width: 1280, height: 960 }
page.clipRect = { top: 0, left: 0, width: 1280, height: 960}
/*
In development, not working yet.
page.settings.scriptTimeout = 1000
page.onLongRunningScript = function() {
page.stopJavaScript()
phantom.exit(4)
}
*/
var t = Date.now()
console.log('Loading ' + address)
setTimeout(function() {
console.log('timeout')
phantom.exit(62)
}, maxTimeout)
page.settings.resourceTimeout = maxTimeout
page.onResourceTimeout = function(e) {
console.log(e.errorCode)
console.log(e.errorString)
console.log(e.url)
phantom.exit(3)
}
page.open(address, function(status) {
if(status !== 'success') {
console.log('failed')
phantom.exit(2)
}
page.render(outputPath)
console.log('Loading time ' + (Date.now() - t) + ' msec');
phantom.exit()
})

View file

@ -4,32 +4,9 @@ require 'securerandom'
require 'thread'
require 'open3'
# Don't judge - Ruby handling of timeouts is a joke..
module Phantomjs
def self.run(*args, &block)
pid = nil
stdin, stdout, stderr, wait_thr = nil
begin
Timeout::timeout(30) do
stdin, stdout, stderr, wait_thr = Open3.popen3(path, *args)
pid = wait_thr.pid
wait_thr.join
return stdout.read
end
# :nocov:
rescue Timeout::Error
stdin.close
stdout.close
stderr.close
Process.kill 'QUIT', pid
raise Timeout::Error
end
# :nocov:
end
end
class ScreenshotWorker
SCREENSHOTS_PATH = Site::SCREENSHOTS_ROOT
HARD_TIMEOUT = 20.freeze
include Sidekiq::Worker
sidekiq_options queue: :screenshots, retry: 3, backtrace: true
@ -39,23 +16,23 @@ class ScreenshotWorker
screenshot.close
screenshot_output_path = screenshot.path+'.png'
begin
f = Screencap::Fetcher.new("http://#{username}.neocities.org#{path}")
f.fetch(
output: screenshot_output_path,
width: 1280,
height: 960,
maxRenderWait: 25000,
cutoffWait: 30000
line = Cocaine::CommandLine.new(
"timeout #{HARD_TIMEOUT} phantomjs #{File.join DIR_ROOT, 'files', 'phantomjs_screenshot.js'}", ":url :output",
expected_outcodes: [0]
)
rescue Timeout::Error
# :nocov:
begin
output = line.run(
url: "http://#{username}.neocities.org#{path}",
output: screenshot_output_path
)
rescue Cocaine::ExitStatusError => e
if e.message && e.message.match(/returned 124/)
puts "#{username}/#{path} is timing out, discontinuing"
site = Site[username: username]
site.is_crashing = true
site.save_changes validate: false
# Don't enable until we know it works well.
return true
=begin
if site.email
EmailWorker.perform_async({
@ -73,8 +50,9 @@ class ScreenshotWorker
})
end
=end
return
# :nocov:
else
raise
end
end
img_list = Magick::ImageList.new
@ -99,7 +77,6 @@ class ScreenshotWorker
else
new_img = img.scale width, height
end
new_img.write(File.join(user_screenshots_path, "#{path}.#{res}.jpg")) {
self.quality = 90
}