72 lines
3.1 KiB
Ruby
72 lines
3.1 KiB
Ruby
class Video < ApplicationRecord
|
|
include PgSearch
|
|
|
|
belongs_to :project, touch: true
|
|
has_many :acquired_media_releases, through: :project
|
|
has_many :appearance_releases, through: :project
|
|
has_many :location_releases, through: :project
|
|
has_many :material_releases, through: :project
|
|
has_many :talent_releases, through: :project
|
|
has_many :video_release_confirmations, dependent: :destroy
|
|
has_many :confirmed_acquired_media_releases, through: :video_release_confirmations, source: :releasable, source_type: "AcquiredMediaRelease"
|
|
has_many :confirmed_talent_releases, through: :video_release_confirmations, source: :releasable, source_type: "TalentRelease"
|
|
has_many :confirmed_appearance_releases, through: :video_release_confirmations, source: :releasable, source_type: "AppearanceRelease"
|
|
has_many :confirmed_location_releases, through: :video_release_confirmations, source: :releasable, source_type: "LocationRelease"
|
|
has_many :confirmed_music_releases, through: :video_release_confirmations, source: :releasable, source_type: "MusicRelease"
|
|
has_many :confirmed_material_releases, through: :video_release_confirmations, source: :releasable, source_type: "MaterialRelease"
|
|
has_many :bookmarks, dependent: :destroy
|
|
has_many :unreleased_appearances, dependent: :destroy
|
|
has_many :graphics_elements, dependent: :destroy
|
|
has_many :audio_confirmations, dependent: :destroy
|
|
|
|
has_one_attached :file
|
|
has_one_attached :edl_file
|
|
has_one_attached :graphics_only_edl_file
|
|
has_one_attached :audio_only_edl_file
|
|
|
|
enum analysis_status: { not_started: 0, pending: 1, success: 2, failure: 3 }, _prefix: "analysis"
|
|
enum audio_analysis_status: { not_started: 0, pending: 1, success: 2, failure: 3 }, _prefix: "audio_analysis"
|
|
enum video_editing_system: { avid: 0, adobe_premiere: 1 }
|
|
|
|
delegate :filename, to: :file, allow_nil: true
|
|
|
|
validates :file, attached: true, content_type: ["video/mp4", "video/quicktime"]
|
|
validates :edl_file, attached: true, content_type: ["application/octet-stream"]
|
|
validates :graphics_only_edl_file, content_type: ["application/octet-stream"]
|
|
validates :audio_only_edl_file, attached: true, content_type: ["application/octet-stream"], if: -> { adobe_premiere? }
|
|
|
|
pg_search_scope :search, {
|
|
against: [:name, :number],
|
|
using: {
|
|
tsearch: {any_word: true, prefix: true},
|
|
trigram: {},
|
|
dmetaphone: {any_word: true}
|
|
}
|
|
}
|
|
|
|
scope :video_analysis_started_before, ->(datetime) { where("analysis_started_at < ?", datetime) }
|
|
scope :audio_analysis_started_before, -> (datetime) { where("audio_analysis_started_at < ?", datetime) }
|
|
scope :reports_published, -> { where.not(report_published_at: nil) }
|
|
scope :published_at_desc_order, -> { order("report_published_at desc") }
|
|
|
|
def has_confirmed_release?(releasable)
|
|
public_send("confirmed_#{releasable.model_name.plural}").ids.include?(releasable.id)
|
|
end
|
|
|
|
def report_published?
|
|
report_published_at.present?
|
|
end
|
|
|
|
def report_unpublished?
|
|
!report_published?
|
|
end
|
|
|
|
def publish_report!(timestamp = Time.zone.now)
|
|
update!(report_published_at: timestamp)
|
|
end
|
|
|
|
def unpublish_report!
|
|
update!(report_published_at: nil)
|
|
end
|
|
end
|