class OverlayRefreshJob < ApplicationJob queue_as :default INTERVAL = 2.seconds REDIS_CHAIN_KEY = "overlay_refresh:chain:%s" def self.schedule_chain(session_id) redis.set(format(REDIS_CHAIN_KEY, session_id), "1", ex: 48.hours.to_i) set(wait: INTERVAL).perform_later(session_id) end def self.cancel_chain(session_id) redis.del(format(REDIS_CHAIN_KEY, session_id)) end def self.redis @redis ||= Redis.new(url: ENV.fetch("REDIS_URL", "redis://localhost:6379/0")) end def perform(session_id) return unless self.class.redis.get(format(REDIS_CHAIN_KEY, session_id)) session = StreamSession.find_by(id: session_id) return self.class.cancel_chain(session_id) unless session return self.class.cancel_chain(session_id) if session.terminal? return self.class.cancel_chain(session_id) unless Streams::OverlayRelay.running?(session_id) Streams::Overlay::Refresh.call(session) Mediamtx::PublisherSync.new(session).call if session.status.in?(%w[connecting reconnecting live paused]) if session.platform == "youtube" Streams::YoutubeRelay.ensure_publishing!(session) end self.class.set(wait: INTERVAL).perform_later(session_id) end end