diff --git a/app/controllers/asciicasts_controller.rb b/app/controllers/asciicasts_controller.rb index 1cd1160..521c885 100644 --- a/app/controllers/asciicasts_controller.rb +++ b/app/controllers/asciicasts_controller.rb @@ -28,12 +28,7 @@ class AsciicastsController < ApplicationController end format.png do - if asciicast.image_stale? - with_player_html_file do |html_path| - image_updater.update(asciicast, html_path) - end - end - + image_updater.update(asciicast) if asciicast.image_stale? redirect_to asciicast.image_url end end @@ -90,21 +85,7 @@ class AsciicastsController < ApplicationController end def image_updater - AsciicastImageUpdater.new - end - - def with_player_html_file - html = render_to_string( - template: 'asciicasts/screenshot.html.slim', - layout: 'screenshot', - locals: { page: BareAsciicastPagePresenter.build(asciicast, params) } - ) - - Dir.mktmpdir do |dir| - path = "#{dir}/asciicast.html" - File.open(path, 'w') { |f| f.write(html) } - yield(path) - end + AsciicastImageUpdater.new(self) end end diff --git a/app/presenters/bare_asciicast_page_presenter.rb b/app/presenters/bare_asciicast_page_presenter.rb index 32bf0d6..35daf51 100644 --- a/app/presenters/bare_asciicast_page_presenter.rb +++ b/app/presenters/bare_asciicast_page_presenter.rb @@ -2,7 +2,7 @@ class BareAsciicastPagePresenter attr_reader :asciicast, :playback_options - def self.build(asciicast, playback_options) + def self.build(asciicast, playback_options = {}) decorated_asciicast = asciicast.decorate playback_options = { diff --git a/app/services/asciicast_image_updater.rb b/app/services/asciicast_image_updater.rb index e6ad7ae..de46722 100644 --- a/app/services/asciicast_image_updater.rb +++ b/app/services/asciicast_image_updater.rb @@ -1,31 +1,53 @@ class AsciicastImageUpdater PIXEL_DENSITY = 2 - attr_reader :rasterizer, :image_inspector + attr_reader :template_renderer, :rasterizer, :image_inspector - def initialize(rasterizer = Rasterizer.new, image_inspector = ImageInspector.new) + def initialize(template_renderer, rasterizer = Rasterizer.new, image_inspector = ImageInspector.new) + @template_renderer = template_renderer @rasterizer = rasterizer @image_inspector = image_inspector end - def update(asciicast, page_path) + def update(asciicast) Dir.mktmpdir do |dir| + page_path = "#{dir}/asciicast.html" image_path = "#{dir}/#{asciicast.image_filename}" - rasterizer.generate_image(page_path, image_path, 'png', '.asciinema-player', PIXEL_DENSITY) + generate_html_file(asciicast, page_path) + generate_png_file(page_path, image_path) + image_width, image_height = image_inspector.get_size(image_path) - File.open(image_path) do |f| - asciicast.image = f - end + update_asciicast(asciicast, image_path, image_width, image_height) + end + end + + private + + def generate_html_file(asciicast, path) + html = template_renderer.render_to_string( + template: 'asciicasts/screenshot.html.slim', + layout: 'screenshot', + locals: { page: BareAsciicastPagePresenter.build(asciicast) }, + ) - width, height = image_inspector.get_size(image_path) + File.open(path, 'w') { |f| f.write(html) } + end - # "display" size is 1/PIXEL_DENSITY of the actual one - asciicast.image_width = width / PIXEL_DENSITY - asciicast.image_height = height / PIXEL_DENSITY + def generate_png_file(page_path, image_path) + rasterizer.generate_image(page_path, image_path, 'png', '.asciinema-player', PIXEL_DENSITY) + end - asciicast.save! + def update_asciicast(asciicast, image_path, image_width, image_height) + File.open(image_path) do |f| + asciicast.image = f end + + # "display" size is 1/PIXEL_DENSITY of the actual one + asciicast.image_width = image_width / PIXEL_DENSITY + asciicast.image_height = image_height / PIXEL_DENSITY + + asciicast.save! end end