Files
MatchLiveTv/backend/app/services/streams/overlay/refresh.rb
Emiliano Frascaro 4c7be615f1 Fix freeze YouTube al cambio punteggio: PNG atomica e relay stabile
rsvg scrive su .tmp poi rename; il feeder ignora PNG parziali.
YouTube relay: no doppio avvio, reconnect RTMP; overlay restart solo dopo 3 miss.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 09:07:06 +02:00

51 lines
1.3 KiB
Ruby

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)
tmp = "#{png_path}.tmp"
unless system("rsvg-convert", "-w", "1280", "-h", "720", "-o", tmp, svg_path.to_s, out: File::NULL, err: File::NULL)
raise Error, "rsvg-convert fallito per session #{@session.id}"
end
File.rename(tmp, png_path)
FileUtils.touch(png_path)
end
end
end
end