module Mediamtx # MediaMTX in produzione รจ distroless: runOnReady con wget non funziona. # Sincronizziamo lo stato Rails leggendo l'API paths (poll da /live/:id/status.json). class PublisherSync def initialize(session) @session = session end def call return @session if @session.terminal? info = Mediamtx::Client.new.list_paths.find { |i| i["name"] == @session.mediamtx_path_name } publisher_online = publisher_online?(info) if publisher_online if @session.paused? # RTMP ancora connesso in pausa: non forzare live/reconnect. elsif @session.may_go_live? @session.go_live! @session.reload Streams::Overlay::Refresh.call(@session) Streams::YoutubeRelay.ensure_publishing!(@session) if @session.platform == "youtube" elsif @session.reconnecting? && @session.may_reconnect? @session.reconnect! cancel_timeout Streams::Overlay::Refresh.call(@session.reload) end elsif !@session.paused? && @session.live? && @session.may_lose_connection? @session.lose_connection! schedule_timeout unless @session.paused? end @session.reload end private def publisher_online?(info) return false unless info return true if info["online"] return true if info["source"].present? false end def cancel_timeout return if @session.timeout_job_id.blank? Sidekiq::ScheduledSet.new.find_job(@session.timeout_job_id)&.delete @session.update!(timeout_job_id: nil) end def schedule_timeout job = DisconnectionTimeoutJob.perform_in( MatchLiveTv.reconnect_timeout_seconds.seconds, @session.id ) @session.update!(timeout_job_id: job) end end end