diff --git a/app/controllers/asciicasts_controller.rb b/app/controllers/asciicasts_controller.rb index 5007232..d8830ab 100644 --- a/app/controllers/asciicasts_controller.rb +++ b/app/controllers/asciicasts_controller.rb @@ -28,18 +28,12 @@ class AsciicastsController < ApplicationController end format.json do - opts = if params[:dl] - { query: { "response-content-disposition" => "attachment; filename=#{asciicast.download_filename}" } } - else - {} - end - - redirect_to asciicast.data_url(opts) + serve_file(asciicast.data, !!params[:dl]) end format.png do asciicast_image_generator.generate(asciicast) if asciicast.image_stale? - redirect_to asciicast.image_url + serve_file(asciicast.image) end end end @@ -98,4 +92,19 @@ class AsciicastsController < ApplicationController AsciicastImageGenerator.new(self) end + def serve_file(uploader, as_attachment = false) + opts = if as_attachment + { query: { "response-content-disposition" => "attachment; filename=#{asciicast.download_filename}" } } + else + {} + end + + url = uploader.url(opts) + + if url.starts_with?("/") + send_file uploader.path, disposition: as_attachment ? 'attachment' : 'inline' + else + redirect_to url + end + end end diff --git a/app/models/asciicast.rb b/app/models/asciicast.rb index b0841a3..357eb3d 100644 --- a/app/models/asciicast.rb +++ b/app/models/asciicast.rb @@ -93,8 +93,16 @@ class Asciicast < ActiveRecord::Base end end + def data + if file.present? + file + else + stdout_frames + end + end + def data_url(options = {}) - file_url(options) || stdout_frames_url(options) + data.url(options) end def download_filename diff --git a/app/serializers/asciicast_serializer.rb b/app/serializers/asciicast_serializer.rb index 67d9e8f..f448ae1 100644 --- a/app/serializers/asciicast_serializer.rb +++ b/app/serializers/asciicast_serializer.rb @@ -11,7 +11,7 @@ class AsciicastSerializer < ActiveModel::Serializer if v0_url? object.stdout_frames_url else - object.data_url + asciicast_path(object, format: :json) end end diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 8d175ec..2f313b0 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -10,5 +10,11 @@ CarrierWave.configure do |config| } config.fog_directory = CFG.aws_bucket config.fog_public = false + elsif CFG.carrierwave_storage == 'file' + config.root = Rails.root end end + +if File.exists?(Rails.root.to_s + "/public/uploads/asciicast") + raise "Please move all directories from ./public/uploads/ to ./uploads/" +end diff --git a/spec/features/png_spec.rb b/spec/features/png_spec.rb index 4541305..6b8e79b 100644 --- a/spec/features/png_spec.rb +++ b/spec/features/png_spec.rb @@ -7,7 +7,7 @@ feature "asciicast-as-png", needs_phantomjs_2_bin: true do scenario "Requesting PNG" do visit asciicast_path(asciicast, format: :png) - expect(current_path).to match(%r{/uploads/test/asciicast/image/\d+/\w+\.png$}) + expect(current_path).to match(%r{/a/\d+\.png$}) end end diff --git a/spec/serializers/asciicast_serializer_spec.rb b/spec/serializers/asciicast_serializer_spec.rb index d67586a..a685cd3 100644 --- a/spec/serializers/asciicast_serializer_spec.rb +++ b/spec/serializers/asciicast_serializer_spec.rb @@ -13,7 +13,7 @@ describe AsciicastSerializer do end it 'includes url' do - expect(subject['url']).to eq(asciicast.file_url) + expect(subject['url']).to eq("/a/#{asciicast.id}.json") end it 'includes snapshot' do diff --git a/spec/services/asciicast_image_generator_spec.rb b/spec/services/asciicast_image_generator_spec.rb index c7f956b..00f431e 100644 --- a/spec/services/asciicast_image_generator_spec.rb +++ b/spec/services/asciicast_image_generator_spec.rb @@ -17,7 +17,7 @@ describe AsciicastImageGenerator, needs_phantomjs_2_bin: true do end it 'generates screenshot of "snapshot frame"' do - png = ChunkyPNG::Image.from_file("#{Rails.root}/public/#{asciicast.image_url}") + png = ChunkyPNG::Image.from_file(asciicast.image.path) # make sure there are black-ish borders expect(rgb(png[1, 1])).to eq([18, 19, 20]) diff --git a/uploads/.gitignore b/uploads/.gitignore new file mode 100644 index 0000000..72e8ffc --- /dev/null +++ b/uploads/.gitignore @@ -0,0 +1 @@ +*