Fix YouTube in attesa: audio AAC di riserva, retry attivazione broadcast

Il relay verso YouTube ora gestisce _air senza traccia audio, ritenta
activate_broadcast finché l'ingest è active e riduce la finestra
scheduledStartTime a ~20s.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-04 08:37:47 +02:00
parent bac655aca8
commit 8263475146
4 changed files with 65 additions and 17 deletions

View File

@@ -51,31 +51,38 @@ module Youtube
end
# Porta in onda appena cè ingest su YouTube (non attendere scheduledStartTime).
# @return [Symbol] :live, :waiting_ingest, :transitioned, :skipped
def activate_broadcast!(broadcast_id)
return if broadcast_id.blank?
return if @credential.blank? || missing_oauth_config?
return :skipped if broadcast_id.blank?
return :skipped if @credential.blank? || missing_oauth_config?
client = authorized_client
item = client.list_live_broadcasts("status,contentDetails", id: broadcast_id).items&.first
return unless item
return :skipped unless item
status = item.status.life_cycle_status.to_s
return if status == "live"
return :live if status == "live"
stream_id = item.content_details&.bound_stream_id
if stream_id.present?
stream = client.list_live_streams("status", id: stream_id).items&.first
return if stream&.status&.stream_status != "active"
stream_status = stream&.status&.stream_status.to_s
return :waiting_ingest unless stream_status == "active"
end
if %w[ready created].include?(status)
client.transition_live_broadcast("testing", broadcast_id, "id,status")
status = "testing"
end
client.transition_live_broadcast("live", broadcast_id, "id,status") if status == "testing"
if status == "testing"
client.transition_live_broadcast("live", broadcast_id, "id,status")
return :transitioned
end
:skipped
rescue Google::Apis::Error => e
Rails.logger.warn("[Youtube::BroadcastService] activate #{broadcast_id}: #{e.message}")
nil
:skipped
end
def complete_broadcast!(broadcast_id)
@@ -131,7 +138,7 @@ module Youtube
# YouTube richiede scheduledStartTime nel futuro; per «vai subito» usiamo ~1 min (auto_start al RTMP).
def normalize_scheduled_start_time(scheduled_at)
now = Time.current.utc
minimum = now + 90.seconds
minimum = now + 20.seconds
maximum = now + 7.days
candidate =