Replay fuori da Puma, fix ops cron e firma release Android.
Dopo auth Rails redirect a URL presigned su /media/ (edge → Garage); aumenta RAILS_MAX_THREADS, corregge ingest log ops via stdin e keystore Play Console. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -52,6 +52,15 @@ module Public
|
||||
private
|
||||
|
||||
def serve_video(disposition:)
|
||||
expires_in = disposition == "attachment" ? MatchLiveTv.replay_download_url_ttl_seconds : MatchLiveTv.replay_presigned_url_ttl_seconds
|
||||
redirect_url = Recordings::PublicMediaUrl.new(
|
||||
key: @recording.storage_key,
|
||||
expires_in: expires_in,
|
||||
disposition: disposition,
|
||||
filename: disposition == "attachment" ? download_filename : nil
|
||||
).call
|
||||
return redirect_to redirect_url, allow_other_host: true if redirect_url.present?
|
||||
|
||||
Recordings::ServeFromStorage.new(
|
||||
key: @recording.storage_key,
|
||||
content_type: "video/mp4",
|
||||
@@ -66,6 +75,9 @@ module Public
|
||||
key = @recording.thumbnail_storage_key
|
||||
return head :not_found if key.blank?
|
||||
|
||||
redirect_url = Recordings::PublicMediaUrl.new(key: key, expires_in: MatchLiveTv.replay_presigned_url_ttl_seconds).call
|
||||
return redirect_to redirect_url, allow_other_host: true if redirect_url.present?
|
||||
|
||||
Recordings::ServeFromStorage.new(
|
||||
key: key,
|
||||
content_type: "image/jpeg",
|
||||
|
||||
44
backend/app/services/recordings/public_media_url.rb
Normal file
44
backend/app/services/recordings/public_media_url.rb
Normal file
@@ -0,0 +1,44 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Recordings
|
||||
# URL presigned S3 riscritto sul path pubblico /media/ (edge → Garage).
|
||||
# Rails fa solo auth; il browser scarica/streama senza occupare Puma.
|
||||
class PublicMediaUrl
|
||||
def initialize(key:, expires_in: MatchLiveTv.replay_presigned_url_ttl_seconds, disposition: "inline", filename: nil)
|
||||
@key = key
|
||||
@expires_in = expires_in
|
||||
@disposition = disposition
|
||||
@filename = filename
|
||||
end
|
||||
|
||||
def call
|
||||
return nil if @key.blank?
|
||||
return nil unless MatchLiveTv.replay_media_redirect_enabled?
|
||||
|
||||
raw = Recordings::Storage.new.presigned_get_url(
|
||||
key: @key,
|
||||
expires_in: @expires_in,
|
||||
response_content_disposition: content_disposition_param
|
||||
)
|
||||
return nil if raw.blank?
|
||||
|
||||
rewrite_to_public(raw)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def rewrite_to_public(raw)
|
||||
uri = URI.parse(raw)
|
||||
base = MatchLiveTv.replay_media_public_base_url.chomp("/")
|
||||
query = uri.query.presence
|
||||
path = uri.path.start_with?("/") ? uri.path : "/#{uri.path}"
|
||||
query ? "#{base}#{path}?#{query}" : "#{base}#{path}"
|
||||
end
|
||||
|
||||
def content_disposition_param
|
||||
return nil unless @disposition == "attachment" && @filename.present?
|
||||
|
||||
%(attachment; filename="#{@filename.gsub('"', '\\"')}")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -31,8 +31,12 @@ module Recordings
|
||||
dest
|
||||
end
|
||||
|
||||
def presigned_get_url(key:, expires_in: MatchLiveTv.replay_presigned_url_ttl_seconds)
|
||||
@backend.presigned_get_url(key: key, expires_in: expires_in)
|
||||
def presigned_get_url(key:, expires_in: MatchLiveTv.replay_presigned_url_ttl_seconds, response_content_disposition: nil)
|
||||
@backend.presigned_get_url(
|
||||
key: key,
|
||||
expires_in: expires_in,
|
||||
response_content_disposition: response_content_disposition
|
||||
)
|
||||
end
|
||||
|
||||
def local_path_for_key(key)
|
||||
@@ -61,7 +65,7 @@ module Recordings
|
||||
true
|
||||
end
|
||||
|
||||
def presigned_get_url(key:, expires_in:)
|
||||
def presigned_get_url(key:, expires_in:, response_content_disposition: nil)
|
||||
nil
|
||||
end
|
||||
|
||||
@@ -92,14 +96,15 @@ module Recordings
|
||||
raise Error, e.message
|
||||
end
|
||||
|
||||
def presigned_get_url(key:, expires_in:)
|
||||
def presigned_get_url(key:, expires_in:, response_content_disposition: nil)
|
||||
signer = Aws::S3::Presigner.new(client: client)
|
||||
signer.presigned_url(
|
||||
:get_object,
|
||||
params = {
|
||||
bucket: MatchLiveTv.replay_storage_bucket,
|
||||
key: key,
|
||||
expires_in: expires_in
|
||||
)
|
||||
}
|
||||
params[:response_content_disposition] = response_content_disposition if response_content_disposition.present?
|
||||
signer.presigned_url(:get_object, **params)
|
||||
end
|
||||
|
||||
def local_path_for_key(_key)
|
||||
|
||||
Reference in New Issue
Block a user