diff options
author | Francis Chong <francis@ignition.hk> | 2017-04-26 09:48:12 +0800 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2017-04-26 03:48:12 +0200 |
commit | 193dddb433f27cc61e1977148cbd01d61bb87fbf (patch) | |
tree | 1e99680980a3c294b5296e79ab9fbc1dafcd0f13 | |
parent | 8fe36654efff73cb9b6800f7d1a57e6466f2ded3 (diff) |
Add media dimensions (#2448)
* Fixes #1985 - add migration AddMediaAttachmentMeta, which add meta field to media_attachments - before saving attachment, set file meta if needed - add meta in api * add spec * align the “size” format for image and video * fix code climate * fixes media_attachment_spec.rb
-rw-r--r-- | app/models/media_attachment.rb | 25 | ||||
-rw-r--r-- | app/views/api/v1/statuses/_media.rabl | 1 | ||||
-rw-r--r-- | db/migrate/20170425131920_add_media_attachment_meta.rb | 5 | ||||
-rw-r--r-- | db/schema.rb | 5 | ||||
-rw-r--r-- | spec/models/media_attachment_spec.rb | 26 |
5 files changed, 60 insertions, 2 deletions
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index a43c76c77..aae896d20 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -51,6 +51,7 @@ class MediaAttachment < ApplicationRecord before_create :set_shortcode before_post_process :set_type_and_extension + before_save :set_meta class << self private @@ -112,6 +113,30 @@ class MediaAttachment < ApplicationRecord 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] diff --git a/app/views/api/v1/statuses/_media.rabl b/app/views/api/v1/statuses/_media.rabl index 2f56c6d07..bcba78c95 100644 --- a/app/views/api/v1/statuses/_media.rabl +++ b/app/views/api/v1/statuses/_media.rabl @@ -3,3 +3,4 @@ attributes :id, :remote_url, :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 diff --git a/db/migrate/20170425131920_add_media_attachment_meta.rb b/db/migrate/20170425131920_add_media_attachment_meta.rb new file mode 100644 index 000000000..c4da65635 --- /dev/null +++ b/db/migrate/20170425131920_add_media_attachment_meta.rb @@ -0,0 +1,5 @@ +class AddMediaAttachmentMeta < ActiveRecord::Migration[5.0] + def change + add_column :media_attachments, :file_meta, :json + end +end diff --git a/db/schema.rb b/db/schema.rb index 1c728d6d4..cd31eb528 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # 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" @@ -120,6 +120,7 @@ ActiveRecord::Schema.define(version: 20170424112722) do 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 @@ -332,4 +333,4 @@ ActiveRecord::Schema.define(version: 20170424112722) do end add_foreign_key "statuses", "statuses", column: "reblog_of_id", on_delete: :cascade -end +end \ No newline at end of file diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb index d98f7e696..f6717b7d5 100644 --- a/spec/models/media_attachment_spec.rb +++ b/spec/models/media_attachment_spec.rb @@ -11,6 +11,13 @@ RSpec.describe MediaAttachment, type: :model do 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 @@ -23,5 +30,24 @@ RSpec.describe MediaAttachment, type: :model 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 |