Files
MatchLiveTv/backend/app/jobs/youtube_ingest_watchdog_job.rb
Emiliano Frascaro 854738b46d Stabilizza live YouTube/RTMP e fix crash rotazione mobile.
Pipeline YouTube con relay, overlay e publisher sync lato backend; fix GL pauseGlDuringRotation su Android per evitare crash in rotazione durante lo streaming Flutter.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-06 15:30:55 +02:00

58 lines
1.9 KiB
Ruby

# Controlli ripetuti finché YouTube non ha ingest active (poi attiva la broadcast).
class YoutubeIngestWatchdogJob < ApplicationJob
queue_as :default
FIRST_WAIT = 20.seconds
NEXT_WAITS = [35.seconds, 45.seconds, 60.seconds].freeze
def perform(session_id, phase = 0)
session = StreamSession.find_by(id: session_id)
return unless Youtube::LivePipeline.broadcast_ready?(session)
return if Youtube::ApiThrottle.rate_limited?
ingest = youtube_ingest_status(session)
if ingest == "active"
Youtube::LivePipeline.schedule_activate!(session, force: true, wait: 3.seconds)
return
end
if Streams::YoutubeRelay.running?(session.id)
Rails.logger.info("[YoutubeIngestWatchdog] relay ok ingest=#{ingest} phase=#{phase} session=#{session.id}")
else
Rails.logger.warn("[YoutubeIngestWatchdog] avvio relay ingest=#{ingest} session=#{session.id}")
Streams::YoutubeRelay.ensure_publishing!(session)
end
schedule_next(session_id, phase)
rescue StandardError => e
Rails.logger.warn("[YoutubeIngestWatchdog] session=#{session_id}: #{e.message}")
schedule_next(session_id, phase)
end
def self.schedule_chain(session_id)
set(wait: FIRST_WAIT).perform_later(session_id, 0)
end
private
def schedule_next(session_id, phase)
wait = NEXT_WAITS[phase]
return unless wait
self.class.set(wait: wait).perform_later(session_id, phase + 1)
end
def youtube_ingest_status(session)
return nil if session.youtube_broadcast_id.blank?
client = Youtube::BroadcastService.new(session.match.team).send(:authorized_client)
b = client.list_live_broadcasts("status,contentDetails", id: session.youtube_broadcast_id).items&.first
return nil unless b
sid = b.content_details.bound_stream_id
client.list_live_streams("status", id: sid).items.first&.status&.stream_status
rescue StandardError
nil
end
end