* Fix #2108 - Fix gif uploads Add specs for media attachment gifv conversion * Add ffmpeg to travis * Make travis install ffmpeg, not libav * Switch travis to trustymaster
@@ -1,5 +1,7 @@ | |||||
language: ruby | language: ruby | ||||
cache: bundler | cache: bundler | ||||
dist: trusty | |||||
sudo: required | |||||
notifications: | notifications: | ||||
email: false | email: false | ||||
@@ -24,8 +26,9 @@ bundler_args: --without development production --retry=3 --jobs=3 | |||||
before_install: | before_install: | ||||
- sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test | - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test | ||||
- sudo add-apt-repository -y ppa:mc3man/trusty-media | |||||
- sudo apt-get -qq update | - sudo apt-get -qq update | ||||
- sudo apt-get -qq install g++-4.8 | |||||
- sudo apt-get -qq install g++-4.8 ffmpeg | |||||
install: | install: | ||||
- nvm install | - nvm install | ||||
- npm install -g yarn | - npm install -g yarn | ||||
@@ -106,13 +106,18 @@ class MediaAttachment < ApplicationRecord | |||||
end | end | ||||
def set_type_and_extension | def set_type_and_extension | ||||
if file.blank? | |||||
self.type = :unknown | |||||
else | |||||
self.type = VIDEO_MIME_TYPES.include?(file_content_type) ? :video : :image | |||||
extension = Paperclip::Interpolations.content_type_extension(file, :original) | |||||
basename = Paperclip::Interpolations.basename(file, :original) | |||||
file.instance_write :file_name, [basename, extension].delete_if(&:empty?).join('.') | |||||
end | |||||
self.type = VIDEO_MIME_TYPES.include?(file_content_type) ? :video : :image | |||||
extension = appropriate_extension | |||||
basename = Paperclip::Interpolations.basename(file, :original) | |||||
file.instance_write :file_name, [basename, extension].delete_if(&:empty?).join('.') | |||||
end | |||||
def appropriate_extension | |||||
mime_type = MIME::Types[file.content_type] | |||||
extensions_for_mime_type = mime_type.empty? ? [] : mime_type.first.extensions | |||||
original_extension = Paperclip::Interpolations.extension(file, :original) | |||||
extensions_for_mime_type.include?(original_extension) ? original_extension : extensions_for_mime_type.first | |||||
end | end | ||||
end | end |
@@ -7,7 +7,11 @@ module Paperclip | |||||
def make | def make | ||||
num_frames = identify('-format %n :file', file: file.path).to_i | num_frames = identify('-format %n :file', file: file.path).to_i | ||||
return file unless options[:style] == :original && num_frames > 1 | |||||
unless options[:style] == :original && num_frames > 1 | |||||
tmp_file = Paperclip::TempfileFactory.new.generate(attachment.instance.file_file_name) | |||||
tmp_file << file.read | |||||
return tmp_file | |||||
end | |||||
final_file = Paperclip::Transcoder.make(file, options, attachment) | final_file = Paperclip::Transcoder.make(file, options, attachment) | ||||
@@ -1,5 +1,27 @@ | |||||
require 'rails_helper' | require 'rails_helper' | ||||
RSpec.describe MediaAttachment, type: :model do | RSpec.describe MediaAttachment, type: :model do | ||||
describe 'animated gif conversion' do | |||||
let(:media) { MediaAttachment.create(account: Fabricate(:account), file: attachment_fixture('avatar.gif')) } | |||||
it 'sets type to gifv' do | |||||
expect(media.type).to eq 'gifv' | |||||
end | |||||
it 'converts original file to mp4' do | |||||
expect(media.file_content_type).to eq 'video/mp4' | |||||
end | |||||
end | |||||
describe 'non-animated gif non-conversion' do | |||||
let(:media) { MediaAttachment.create(account: Fabricate(:account), file: attachment_fixture('attachment.gif')) } | |||||
it 'sets type to image' do | |||||
expect(media.type).to eq 'image' | |||||
end | |||||
it 'leaves original file as-is' do | |||||
expect(media.file_content_type).to eq 'image/gif' | |||||
end | |||||
end | |||||
end | end |