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
This commit is contained in:
		
				
					committed by
					
						
						Eugen Rochko
					
				
			
			
				
	
			
			
			
						parent
						
							8fe36654ef
						
					
				
				
					commit
					193dddb433
				
			@@ -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]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 }
 | 
			
		||||
							
								
								
									
										5
									
								
								db/migrate/20170425131920_add_media_attachment_meta.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								db/migrate/20170425131920_add_media_attachment_meta.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
class AddMediaAttachmentMeta < ActiveRecord::Migration[5.0]
 | 
			
		||||
  def change
 | 
			
		||||
    add_column :media_attachments, :file_meta, :json
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user