Browse Source

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
master
Francis Chong 7 years ago
committed by Eugen Rochko
parent
commit
193dddb433
5 changed files with 60 additions and 2 deletions
  1. +25
    -0
      app/models/media_attachment.rb
  2. +1
    -0
      app/views/api/v1/statuses/_media.rabl
  3. +5
    -0
      db/migrate/20170425131920_add_media_attachment_meta.rb
  4. +3
    -2
      db/schema.rb
  5. +26
    -0
      spec/models/media_attachment_spec.rb

+ 25
- 0
app/models/media_attachment.rb View File

@@ -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]



+ 1
- 0
app/views/api/v1/statuses/_media.rabl View File

@@ -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
- 0
db/migrate/20170425131920_add_media_attachment_meta.rb View File

@@ -0,0 +1,5 @@
class AddMediaAttachmentMeta < ActiveRecord::Migration[5.0]
def change
add_column :media_attachments, :file_meta, :json
end
end

+ 3
- 2
db/schema.rb View File

@@ -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

+ 26
- 0
spec/models/media_attachment_spec.rb View File

@@ -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

Loading…
Cancel
Save