From 87c733c9320c47b4e42d35fe29bd40cfc0f8787d Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Wed, 19 Jun 2013 13:19:04 -0700 Subject: [PATCH] initial stab at screenshots --- Gemfile | 17 ++++++++++------- Gemfile.lock | 17 +++++++++++++++++ Rakefile | 1 + app.rb | 5 +++++ config.yml.template | 3 ++- environment.rb | 2 ++ jobs/screenshot_job.rb | 28 ++++++++++++++++++++++++++++ public/site_screenshots/.gitignore | 0 8 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 jobs/screenshot_job.rb create mode 100644 public/site_screenshots/.gitignore diff --git a/Gemfile b/Gemfile index c18f7518..e74edb1f 100644 --- a/Gemfile +++ b/Gemfile @@ -4,19 +4,22 @@ gem 'sinatra' gem 'redis' gem 'sequel' gem 'slim' -gem 'bcrypt-ruby', require: 'bcrypt' -gem 'sinatra-flash', require: 'sinatra/flash' -gem 'sinatra-xsendfile', require: 'sinatra/xsendfile' -gem 'puma', require: nil +gem 'bcrypt-ruby', require: 'bcrypt' +gem 'sinatra-flash', require: 'sinatra/flash' +gem 'sinatra-xsendfile', require: 'sinatra/xsendfile' +gem 'puma', require: nil gem 'rubyzip' -gem 'rack-recaptcha', require: 'rack/recaptcha' +gem 'rack-recaptcha', require: 'rack/recaptcha' +gem 'rmagick', require: nil +gem 'selenium-webdriver', require: nil +gem 'backburner' platform :mri do gem 'magic' # sudo apt-get install file, For OSX: brew install libmagic gem 'pg' gem 'sequel_pg', require: nil gem 'hiredis' - gem 'rainbows', require: nil + gem 'rainbows', require: nil group :development, :test do gem 'pry' @@ -51,4 +54,4 @@ group :test do platform :mri do gem 'simplecov', require: nil end -end +end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index c3b1d652..d147bd16 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,11 +3,18 @@ GEM specs: addressable (2.3.4) ansi (1.4.3) + backburner (0.3.4) + beaneater (~> 0.3.0) + dante (~> 0.1.5) bcrypt-ruby (3.0.1) + beaneater (0.3.0) builder (3.2.0) + childprocess (0.3.9) + ffi (~> 1.0, >= 1.0.11) coderay (1.0.9) columnize (0.3.6) crack (0.3.2) + dante (0.1.5) debugger (1.6.0) columnize (>= 0.3.1) debugger-linecache (~> 1.2.0) @@ -63,7 +70,13 @@ GEM raindrops (0.10.0) rake (10.0.4) redis (3.0.4) + rmagick (2.13.2) rubyzip (0.9.9) + selenium-webdriver (2.33.0) + childprocess (>= 0.2.5) + multi_json (~> 1.0) + rubyzip + websocket (~> 1.0.4) sequel (3.47.0) sequel_pg (1.6.6) pg (>= 0.8.0) @@ -95,11 +108,13 @@ GEM webmock (1.11.0) addressable (>= 2.2.7) crack (>= 0.3.2) + websocket (1.0.7) PLATFORMS ruby DEPENDENCIES + backburner bcrypt-ruby fabrication faker @@ -120,8 +135,10 @@ DEPENDENCIES rainbows rake redis + rmagick ruby-debug rubyzip + selenium-webdriver sequel sequel_pg shotgun diff --git a/Rakefile b/Rakefile index e0e4b3ce..beb0a15a 100644 --- a/Rakefile +++ b/Rakefile @@ -1,4 +1,5 @@ require "rake/testtask" +require 'backburner/tasks' desc "Run all tests" Rake::TestTask.new do |t| diff --git a/app.rb b/app.rb index e41def55..f7e95168 100644 --- a/app.rb +++ b/app.rb @@ -142,6 +142,8 @@ post '/site_files/upload' do dest_path = File.join(site_base_path(current_site.username), sanitized_filename) FileUtils.mv params[:newfile][:tempfile].path, dest_path File.chmod(0640, dest_path) if self.class.production? + + Backburner.enqueue ScreenshotJob, current_site.username flash[:success] = "Successfully uploaded file #{sanitized_filename}." redirect '/dashboard' @@ -200,6 +202,9 @@ post '/site_files/save/:filename' do |filename| FileUtils.mv tmpfile.path, dest_path File.chmod(0640, dest_path) if self.class.production? + + Backburner.enqueue ScreenshotJob, current_site.username + 'ok' end diff --git a/config.yml.template b/config.yml.template index 0c59f1b8..6d32a12d 100644 --- a/config.yml.template +++ b/config.yml.template @@ -2,4 +2,5 @@ development: database: 'postgres://localhost/neocities' session_secret: SETSOMETHINGHERE recaptcha_public_key: ddsfsdfsdf - recaptcha_private_key: fsdgfdsdfd \ No newline at end of file + recaptcha_private_key: fsdgfdsdfd + phantomjs_url: http://localhost:40000 \ No newline at end of file diff --git a/environment.rb b/environment.rb index 148e704a..474eefa0 100644 --- a/environment.rb +++ b/environment.rb @@ -24,6 +24,8 @@ if defined?(Pry) Pry.commands.alias_command 'f', 'finish' end +require File.join(DIR_ROOT, 'jobs', 'screenshot_job.rb') + Sequel.datetime_class = Time Sequel.extension :pagination Sequel.extension :migration diff --git a/jobs/screenshot_job.rb b/jobs/screenshot_job.rb new file mode 100644 index 00000000..c1b3f4fe --- /dev/null +++ b/jobs/screenshot_job.rb @@ -0,0 +1,28 @@ +require 'selenium-webdriver' +require 'RMagick' + +class ScreenshotJob + include Backburner::Queue + + queue_priority 1000 + + def self.perform(username) + screenshot = Tempfile.new 'neocities_screenshot' + screenshot.close + + driver = Selenium::WebDriver.for :remote, url: $config['phantomjs_url'] + driver.manage.window.resize_to 1280, 720 + + wait = Selenium::WebDriver::Wait.new(:timeout => 5) # seconds + wait.until { + driver.navigate.to "http://#{username}.neocities.org" + driver.save_screenshot screenshot.path + } + + driver.quit + + img = Magick::Image.read(screenshot.path).first + img.crop_resized!(600, 400, Magick::NorthGravity) + img.write File.join(DIR_ROOT, 'public', 'site_screenshots', "#{user}.jpg") + end +end diff --git a/public/site_screenshots/.gitignore b/public/site_screenshots/.gitignore new file mode 100644 index 00000000..e69de29b