Streaming chunked da Garage, purge con delete YouTube, privacy sincronizzata, archivio club migliorato, retention 30/90 separata da stato abbonamento. Co-authored-by: Cursor <cursoragent@cursor.com>
52 lines
1.4 KiB
Ruby
52 lines
1.4 KiB
Ruby
module Recordings
|
|
class FinalizeSession
|
|
def initialize(session)
|
|
@session = session
|
|
end
|
|
|
|
def call
|
|
team = @session.match.team
|
|
return unless team.entitlements.can_create_recordings?
|
|
|
|
retention_days = team.entitlements.recording_retention_days
|
|
expires_at = retention_days.positive? ? retention_days.days.from_now : nil
|
|
|
|
recording = Recording.find_or_initialize_by(stream_session: @session)
|
|
recording.assign_attributes(
|
|
team: team,
|
|
status: "processing",
|
|
title: default_title,
|
|
privacy_status: privacy_from_session,
|
|
storage_path: @session.mediamtx_path_name,
|
|
recorded_at: @session.ended_at || Time.current,
|
|
expires_at: expires_at,
|
|
error_message: nil,
|
|
metadata: initial_metadata(team)
|
|
)
|
|
recording.save!
|
|
recording
|
|
end
|
|
|
|
private
|
|
|
|
def default_title
|
|
match = @session.match
|
|
"#{match.team.name} vs #{match.opponent_name}"
|
|
end
|
|
|
|
def privacy_from_session
|
|
@session.privacy_status == "public" ? "public" : "unlisted"
|
|
end
|
|
|
|
def initial_metadata(team)
|
|
ent = team.entitlements
|
|
{
|
|
"source_platform" => @session.platform,
|
|
"session_privacy" => @session.privacy_status,
|
|
"auto_publish_youtube" => ent.premium_full? && ent.youtube_enabled? && @session.platform == "youtube",
|
|
"ai" => {}
|
|
}
|
|
end
|
|
end
|
|
end
|