Fix registrazione replay in produzione via PublisherSync.
MediaMTX distroless non invoca i webhook wget: accendiamo record sul path quando il telefono pubblica RTMP e lo spegniamo in pausa/offline. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -16,7 +16,9 @@ module Mediamtx
|
||||
clear_publisher_misses!(@session.id)
|
||||
if @session.paused?
|
||||
# RTMP ancora connesso in pausa: non forzare live/reconnect.
|
||||
sync_path_recording!(@session, enabled: false)
|
||||
else
|
||||
sync_path_recording!(@session, enabled: true)
|
||||
enable_live_path!(@session)
|
||||
if @session.may_go_live?
|
||||
@session.go_live!
|
||||
@@ -25,21 +27,25 @@ module Mediamtx
|
||||
elsif @session.reconnecting? && @session.may_reconnect?
|
||||
@session.reconnect!
|
||||
cancel_timeout
|
||||
kick_youtube!(@session)
|
||||
kick_youtube!(@session) if @session.platform == "youtube"
|
||||
end
|
||||
kick_youtube!(@session) if @session.platform == "youtube"
|
||||
end
|
||||
elsif !@session.paused? && @session.live? && @session.may_lose_connection?
|
||||
if publisher_offline_sustained?(@session.id)
|
||||
clear_publisher_misses!(@session.id)
|
||||
sync_path_recording!(@session, enabled: false)
|
||||
restore_slate_path!(@session)
|
||||
@session.lose_connection!
|
||||
schedule_timeout unless @session.paused?
|
||||
end
|
||||
elsif !publisher_online && @session.status.in?(%w[reconnecting connecting]) && !@session.paused?
|
||||
sync_path_recording!(@session, enabled: false)
|
||||
restore_slate_path!(@session)
|
||||
end
|
||||
|
||||
sync_path_recording!(@session, enabled: false) if @session.paused? && !publisher_online
|
||||
|
||||
@session.reload.tap do |session|
|
||||
schedule_youtube_relay_if_needed(session)
|
||||
end
|
||||
@@ -92,6 +98,31 @@ module Mediamtx
|
||||
Rails.logger.warn("[PublisherSync] enable slate session=#{session.id}: #{e.message}")
|
||||
end
|
||||
|
||||
# In produzione i webhook MediaMTX (wget) non girano: la registrazione va accesa qui.
|
||||
def sync_path_recording!(session, enabled:)
|
||||
return unless session.match.team.entitlements.recording_enabled_for_mediamtx?
|
||||
|
||||
key = recording_state_key(session.id)
|
||||
desired = enabled ? "1" : "0"
|
||||
return if redis.get(key) == desired
|
||||
|
||||
Client.new.set_path_recording(session, enabled: enabled)
|
||||
redis.set(key, desired, ex: 48.hours.to_i)
|
||||
rescue Client::Error => e
|
||||
Rails.logger.warn("[PublisherSync] recording enabled=#{enabled} session=#{session.id}: #{e.message}")
|
||||
end
|
||||
|
||||
def self.forget_recording_state!(session_id)
|
||||
redis = Redis.new(url: ENV.fetch("REDIS_URL", "redis://localhost:6379/0"))
|
||||
redis.del("mediamtx:recording:#{session_id}")
|
||||
rescue Redis::BaseError
|
||||
nil
|
||||
end
|
||||
|
||||
def recording_state_key(session_id)
|
||||
"mediamtx:recording:#{session_id}"
|
||||
end
|
||||
|
||||
# Evita reconnect su un singolo poll offline (RTMP instabile dal telefono).
|
||||
def publisher_offline_sustained?(session_id)
|
||||
misses = redis.incr(format("publisher_offline_miss:%s", session_id)).to_i
|
||||
|
||||
Reference in New Issue
Block a user