Aggiunge replay YouTube temporaneo, pull registrazioni dai CPX e snapshot ingest in admin.
Così overflow Hetzner e VOD YouTube restano in archivio dopo lo spegnimento del nodo, e la colonna ingest non si svuota. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,6 +2,8 @@ class Recording < ApplicationRecord
|
||||
STATUSES = %w[processing ready expired failed].freeze
|
||||
PRIVACY_STATUSES = %w[public unlisted].freeze
|
||||
STORAGE_BACKENDS = %w[local s3].freeze
|
||||
STORAGE_POLICIES = %w[temporary retained none].freeze
|
||||
REPLAY_SOURCES = %w[youtube matchlivetv none].freeze
|
||||
|
||||
belongs_to :stream_session
|
||||
belongs_to :team
|
||||
@@ -9,6 +11,7 @@ class Recording < ApplicationRecord
|
||||
validates :status, inclusion: { in: STATUSES }
|
||||
validates :privacy_status, inclusion: { in: PRIVACY_STATUSES }
|
||||
validates :storage_backend, inclusion: { in: STORAGE_BACKENDS }
|
||||
validates :storage_policy, inclusion: { in: STORAGE_POLICIES }
|
||||
|
||||
scope :not_deleted, -> { where(deleted_at: nil) }
|
||||
scope :ready, lambda {
|
||||
@@ -23,7 +26,16 @@ class Recording < ApplicationRecord
|
||||
ready.where(expires_at: ..days.days.from_now)
|
||||
}
|
||||
scope :expired_pending_purge, lambda {
|
||||
not_deleted.where(status: %w[ready failed]).where("expires_at IS NOT NULL AND expires_at <= ?", Time.current)
|
||||
not_deleted
|
||||
.where(storage_policy: "retained")
|
||||
.where(status: %w[ready failed])
|
||||
.where("expires_at IS NOT NULL AND expires_at <= ?", Time.current)
|
||||
}
|
||||
scope :temporary_media_pending_purge, lambda {
|
||||
not_deleted
|
||||
.where(storage_policy: "temporary")
|
||||
.where(local_media_purged_at: nil)
|
||||
.where("temp_expires_at IS NOT NULL AND temp_expires_at <= ?", Time.current)
|
||||
}
|
||||
scope :search_replays, lambda { |query|
|
||||
q = query.to_s.strip
|
||||
@@ -46,19 +58,30 @@ class Recording < ApplicationRecord
|
||||
end
|
||||
|
||||
def playback_stream_url
|
||||
return nil unless ready? && stream_session_id.present?
|
||||
return nil unless ready? && storage_key.present? && stream_session_id.present?
|
||||
|
||||
"#{MatchLiveTv.app_public_url.chomp('/')}/replay/#{stream_session_id}/stream"
|
||||
end
|
||||
|
||||
def thumbnail_url
|
||||
return youtube_thumbnail_url if thumbnail_storage_key.blank? && youtube_video_id.present?
|
||||
return nil unless thumbnail_storage_key.present? && stream_session_id.present?
|
||||
|
||||
"#{MatchLiveTv.app_public_url.chomp('/')}/replay/#{stream_session_id}/thumbnail"
|
||||
end
|
||||
|
||||
def youtube_thumbnail_url
|
||||
return nil if youtube_video_id.blank?
|
||||
return nil if youtube_video_id.to_s.start_with?("mock_")
|
||||
|
||||
meta_url = metadata.is_a?(Hash) ? metadata.dig("youtube", "thumbnail_url") : nil
|
||||
return meta_url if meta_url.present?
|
||||
|
||||
"https://i.ytimg.com/vi/#{youtube_video_id}/hqdefault.jpg"
|
||||
end
|
||||
|
||||
def download_api_path
|
||||
return nil unless ready?
|
||||
return nil unless ready? && storage_key.present?
|
||||
|
||||
"/api/v1/recordings/#{id}/download"
|
||||
end
|
||||
@@ -70,6 +93,30 @@ class Recording < ApplicationRecord
|
||||
"https://www.youtube.com/watch?v=#{youtube_video_id}"
|
||||
end
|
||||
|
||||
def temporary_storage?
|
||||
storage_policy == "temporary"
|
||||
end
|
||||
|
||||
def retained_storage?
|
||||
storage_policy == "retained"
|
||||
end
|
||||
|
||||
def local_media_purged?
|
||||
local_media_purged_at.present?
|
||||
end
|
||||
|
||||
# Sorgente fisica del player in archivio (non lo storage policy).
|
||||
def replay_source
|
||||
return "youtube" if youtube_watch_url.present? || (ready? && youtube_video_id.present?)
|
||||
return "matchlivetv" if ready? && storage_key.present?
|
||||
|
||||
"none"
|
||||
end
|
||||
|
||||
def available_in_archive?
|
||||
ready? && (youtube_watch_url.present? || youtube_video_id.present? || storage_key.present?)
|
||||
end
|
||||
|
||||
def ready?
|
||||
status == "ready" && !deleted? && (expires_at.nil? || expires_at.future?)
|
||||
end
|
||||
@@ -154,7 +201,7 @@ class Recording < ApplicationRecord
|
||||
end
|
||||
|
||||
def playable_on_site?
|
||||
ready? && storage_key.present?
|
||||
available_in_archive?
|
||||
end
|
||||
|
||||
def days_until_expiry
|
||||
|
||||
Reference in New Issue
Block a user