# 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