about summary refs log tree commit diff
path: root/app/models/media_attachment.rb
blob: ab6c91efb678c7bf0af4fbf425f08e2228bb8164 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class MediaAttachment < ApplicationRecord
  IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
  VIDEO_MIME_TYPES = ['video/webm', 'video/mp4'].freeze

  belongs_to :account, inverse_of: :media_attachments
  belongs_to :status,  inverse_of: :media_attachments

  has_attached_file :file,
    styles: -> (f) { file_styles f },
    processors: -> (f) { f.video? ? [:transcoder] : [:thumbnail] },
    convert_options: { all: "-strip" }
  validates_attachment_content_type :file, content_type: IMAGE_MIME_TYPES + VIDEO_MIME_TYPES
  validates_attachment_size :file, less_than: 4.megabytes

  validates :account, presence: true

  def local?
    remote_url.blank?
  end

  def file_remote_url=(url)
    self.file = URI.parse(url)
  end

  def image?
    IMAGE_MIME_TYPES.include? file_content_type
  end

  def video?
    VIDEO_MIME_TYPES.include? file_content_type
  end

  def type
    image? ? 'image' : 'video'
  end

private
  def self.file_styles(f)
    if f.instance.image?
      {
        original: '100%',
        small: '510x680>'
      }
    else
      {
        small: {
          convert_options: {
            output: {
              vf: 'scale=\'min(510\, iw):min(680\, ih)\':force_original_aspect_ratio=decrease'
            }
          },
          format: 'png',
          time: 1
        }
      }
    end
  end
end