Aggiunge overlay server-side burn-in e stabilizza diretta live.
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>
This commit is contained in:
48
backend/app/services/streams/overlay/refresh.rb
Normal file
48
backend/app/services/streams/overlay/refresh.rb
Normal file
@@ -0,0 +1,48 @@
|
||||
module Streams
|
||||
module Overlay
|
||||
class Refresh
|
||||
class Error < StandardError; end
|
||||
|
||||
def self.call(session)
|
||||
new(session).call
|
||||
end
|
||||
|
||||
def initialize(session)
|
||||
@session = session.reload
|
||||
end
|
||||
|
||||
def call
|
||||
return false if @session.terminal?
|
||||
|
||||
dir = Streams::Overlay.overlay_dir(@session.id)
|
||||
FileUtils.mkdir_p(dir)
|
||||
badge = BadgeLabel.for(@session)
|
||||
svg = SvgBuilder.new(@session, badge: badge).to_svg
|
||||
svg_path = dir.join("overlay.svg")
|
||||
png_path = Streams::Overlay.overlay_png_path(@session)
|
||||
atomic_write(svg_path, svg)
|
||||
render_png!(svg_path, png_path)
|
||||
true
|
||||
rescue StandardError => e
|
||||
Rails.logger.warn("[Overlay::Refresh] session=#{@session.id} #{e.class}: #{e.message}")
|
||||
false
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def atomic_write(path, content)
|
||||
tmp = "#{path}.tmp"
|
||||
File.write(tmp, content)
|
||||
File.rename(tmp, path)
|
||||
end
|
||||
|
||||
def render_png!(svg_path, png_path)
|
||||
unless system("rsvg-convert", "-w", "1280", "-h", "720", "-o", png_path.to_s, svg_path.to_s, out: File::NULL, err: File::NULL)
|
||||
raise Error, "rsvg-convert fallito per session #{@session.id}"
|
||||
end
|
||||
|
||||
FileUtils.touch(png_path)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user