about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrancis Chong <francis@ignition.hk>2017-04-26 09:48:12 +0800
committerEugen Rochko <eugen@zeonfederated.com>2017-04-26 03:48:12 +0200
commit193dddb433f27cc61e1977148cbd01d61bb87fbf (patch)
tree1e99680980a3c294b5296e79ab9fbc1dafcd0f13
parent8fe36654efff73cb9b6800f7d1a57e6466f2ded3 (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.rb25
-rw-r--r--app/views/api/v1/statuses/_media.rabl1
-rw-r--r--db/migrate/20170425131920_add_media_attachment_meta.rb5
-rw-r--r--db/schema.rb5
-rw-r--r--spec/models/media_attachment_spec.rb26
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