Tabellone, badge e brand sono ricodificati nel flusso _air via OverlayRelay; sync punteggio HTTP, volume condiviso rails/sidekiq, qualità 720p migliorata e badge CONNECTING in ripresa da pausa. Co-authored-by: Cursor <cursoragent@cursor.com>
52 lines
1.5 KiB
Ruby
52 lines
1.5 KiB
Ruby
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 = info && info["online"]
|
|
|
|
if publisher_online
|
|
if @session.paused?
|
|
# RTMP ancora connesso in pausa: non forzare live/reconnect.
|
|
elsif @session.may_go_live?
|
|
@session.go_live!
|
|
Streams::Overlay::Refresh.call(@session.reload)
|
|
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 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
|