before_create :set_shortcode
before_post_process :set_type_and_extension
+ before_save :set_meta
class << self
private
file.instance_write :file_name, [basename, extension].delete_if(&:empty?).join('.')
end
+ def set_meta
+ meta = populate_meta
+ return if meta == {}
+ file.instance_write :meta, meta
+ end
+
+ def populate_meta
+ meta = {}
+ file.queued_for_write.each do |style, file|
+ begin
+ geo = Paperclip::Geometry.from_file file
+ meta[style] = {
+ width: geo.width.to_i,
+ height: geo.height.to_i,
+ size: "#{geo.width.to_i}x#{geo.height.to_i}",
+ aspect: geo.width.to_f / geo.height.to_f,
+ }
+ rescue Paperclip::Errors::NotIdentifiedByImageMagickError
+ meta[style] = {}
+ end
+ end
+ meta
+ end
+
def appropriate_extension
mime_type = MIME::Types[file.content_type]
node(:url) { |media| full_asset_url(media.file.url(:original)) }
node(:preview_url) { |media| full_asset_url(media.file.url(:small)) }
node(:text_url) { |media| media.local? ? medium_url(media) : nil }
+node(:meta) { |media| media.file.meta }
\ No newline at end of file
--- /dev/null
+class AddMediaAttachmentMeta < ActiveRecord::Migration[5.0]
+ def change
+ add_column :media_attachments, :file_meta, :json
+ end
+end
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20170424112722) do
+ActiveRecord::Schema.define(version: 20170425131920) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
t.datetime "updated_at", null: false
t.string "shortcode"
t.integer "type", default: 0, null: false
+ t.json "file_meta"
t.index ["shortcode"], name: "index_media_attachments_on_shortcode", unique: true, using: :btree
t.index ["status_id"], name: "index_media_attachments_on_status_id", using: :btree
end
end
add_foreign_key "statuses", "statuses", column: "reblog_of_id", on_delete: :cascade
-end
+end
\ No newline at end of file
it 'converts original file to mp4' do
expect(media.file_content_type).to eq 'video/mp4'
end
+
+ it 'sets meta' do
+ expect(media.file.meta["original"]["width"]).to eq 128
+ expect(media.file.meta["original"]["height"]).to eq 128
+ expect(media.file.meta["original"]["aspect"]).to eq 1.0
+ end
+
end
describe 'non-animated gif non-conversion' do
it 'leaves original file as-is' do
expect(media.file_content_type).to eq 'image/gif'
end
+
+ it 'sets meta' do
+ expect(media.file.meta["original"]["width"]).to eq 600
+ expect(media.file.meta["original"]["height"]).to eq 400
+ expect(media.file.meta["original"]["aspect"]).to eq 1.5
+ end
+ end
+
+ describe 'jpeg' do
+ let(:media) { MediaAttachment.create(account: Fabricate(:account), file: attachment_fixture('attachment.jpg')) }
+
+ it 'sets meta for different style' do
+ expect(media.file.meta["original"]["width"]).to eq 600
+ expect(media.file.meta["original"]["height"]).to eq 400
+ expect(media.file.meta["original"]["aspect"]).to eq 1.5
+ expect(media.file.meta["small"]["width"]).to eq 400
+ expect(media.file.meta["small"]["height"]).to eq 267
+ expect(media.file.meta["small"]["aspect"]).to eq 400.0/267
+ end
end
end